Merge branch 'master' of bitbucket.org:vishap/test
This commit is contained in:
@@ -12,15 +12,3 @@ let g:boostbin=g:boostlib
|
|||||||
let g:Bboost=g:boostbin.":"
|
let g:Bboost=g:boostbin.":"
|
||||||
let g:Iboost=" -I".g:boostinc
|
let g:Iboost=" -I".g:boostinc
|
||||||
let g:Lboost=" -L".g:boostlib
|
let g:Lboost=" -L".g:boostlib
|
||||||
"
|
|
||||||
" Intel TBB
|
|
||||||
"
|
|
||||||
let g:tbbdir=g:srcdir."/tbb41_20130116oss"
|
|
||||||
let g:tbbinc=g:tbbdir."/include"
|
|
||||||
let g:tbblib=g:tbbdir."/lib/intel64/cc4.1.0_libc2.4_kernel2.6.16.21"
|
|
||||||
let g:tbbbin=g:tbblib
|
|
||||||
let g:Btbb=g:tbbbin.":"
|
|
||||||
let g:Itbb=" -I".g:tbbinc
|
|
||||||
let g:Ltbb=" -L".g:tbblib." -ltbb"
|
|
||||||
let g:tbbmalloc=" -ltbbmalloc"
|
|
||||||
let g:tbbmproxy=" -ltbbmalloc_proxy"
|
|
||||||
|
|||||||
239
cpp/rvalue.cpp
Normal file
239
cpp/rvalue.cpp
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
/*
|
||||||
|
VIM: let g:lcppflags="-std=c++11 -O2 -pthread"
|
||||||
|
VIM: let g:wcppflags="/O2 /EHsc /DWIN32"
|
||||||
|
VIM: let g:argv=""
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class copy_tracker
|
||||||
|
{
|
||||||
|
int v;
|
||||||
|
public:
|
||||||
|
copy_tracker()
|
||||||
|
: v(0)
|
||||||
|
{
|
||||||
|
// std::cout << "copy_tracker::copy_tracker()" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
copy_tracker( const copy_tracker& c )
|
||||||
|
: v( c.v )
|
||||||
|
{
|
||||||
|
std::cout << "copy_tracker::copy_tracker( copy_tracker& c )" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
int use_object() const
|
||||||
|
{
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
void non_const_method()
|
||||||
|
{
|
||||||
|
v++;
|
||||||
|
std::cout << "copy_tracker::non_const_method()" << std::endl;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* e
|
||||||
|
*/
|
||||||
|
#if 0
|
||||||
|
// uncommenting this will cause compiler error due to ambiguity.
|
||||||
|
void e ( copy_tracker o )
|
||||||
|
{
|
||||||
|
std::cout << "e( ) by value called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void e ( copy_tracker& o )
|
||||||
|
{
|
||||||
|
std::cout << "e( & ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
void e ( const copy_tracker& o )
|
||||||
|
{
|
||||||
|
std::cout << "e( const & ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
void e ( copy_tracker&& o )
|
||||||
|
{
|
||||||
|
std::cout << "e( && ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
void e ( const copy_tracker&& o )
|
||||||
|
{
|
||||||
|
std::cout << "e( const && ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* f
|
||||||
|
*/
|
||||||
|
void f ( copy_tracker& o )
|
||||||
|
{
|
||||||
|
std::cout << "f( & ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
void f ( const copy_tracker& o )
|
||||||
|
{
|
||||||
|
std::cout << "f( const & ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
void f ( copy_tracker&& o )
|
||||||
|
{
|
||||||
|
std::cout << "f( && ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* g
|
||||||
|
*/
|
||||||
|
void g ( copy_tracker& o )
|
||||||
|
{
|
||||||
|
std::cout << "g( & ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
void g ( const copy_tracker& o )
|
||||||
|
{
|
||||||
|
std::cout << "g( const & ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
void g ( const copy_tracker&& o )
|
||||||
|
{
|
||||||
|
std::cout << "g( const && ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* h
|
||||||
|
*/
|
||||||
|
void h ( copy_tracker& o )
|
||||||
|
{
|
||||||
|
std::cout << "h( & ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
void h ( const copy_tracker& o )
|
||||||
|
{
|
||||||
|
std::cout << "h( const & ) is called" << std::endl;
|
||||||
|
o.use_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*/
|
||||||
|
void s( const int & )
|
||||||
|
{
|
||||||
|
std::cout << "s( const int & ) is called" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void s( int && )
|
||||||
|
{
|
||||||
|
std::cout << "s( int && ) is called" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*/
|
||||||
|
|
||||||
|
void aaa( const std::string& s )
|
||||||
|
{
|
||||||
|
std::cout << s << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* rvalue and const_rvalue
|
||||||
|
*/
|
||||||
|
copy_tracker rvalue()
|
||||||
|
{
|
||||||
|
return copy_tracker();
|
||||||
|
}
|
||||||
|
|
||||||
|
const copy_tracker const_rvalue()
|
||||||
|
{
|
||||||
|
return copy_tracker();
|
||||||
|
}
|
||||||
|
|
||||||
|
int main( void )
|
||||||
|
{
|
||||||
|
copy_tracker lvalue;
|
||||||
|
const copy_tracker const_lvalue;
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
std::cout << "The following modifies an rvalue." << std::endl;
|
||||||
|
//
|
||||||
|
rvalue().non_const_method();
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
std::cout << "e is called for rvalue, const rvalue, lvalue, const lvalue." << std::endl;
|
||||||
|
//
|
||||||
|
e( rvalue() );
|
||||||
|
e( const_rvalue() );
|
||||||
|
e( lvalue );
|
||||||
|
e( const_lvalue );
|
||||||
|
//
|
||||||
|
// Const rvalue is handled by f( const & )
|
||||||
|
//
|
||||||
|
std::cout << "f is called for rvalue, const rvalue, lvalue, const lvalue." << std::endl;
|
||||||
|
//
|
||||||
|
f( rvalue() );
|
||||||
|
f( const_rvalue() );// f( const & )
|
||||||
|
f( lvalue );
|
||||||
|
f( const_lvalue );
|
||||||
|
//
|
||||||
|
// Rvalue is handled by g( const && )
|
||||||
|
//
|
||||||
|
std::cout << "g is called for rvalue, const rvalue, lvalue, const lvalue." << std::endl;
|
||||||
|
//
|
||||||
|
g( rvalue() );// g( const && )
|
||||||
|
g( const_rvalue() );
|
||||||
|
g( lvalue );
|
||||||
|
g( const_lvalue );
|
||||||
|
//
|
||||||
|
// Pre C++11 handling. h has only & and const & versions.
|
||||||
|
//
|
||||||
|
std::cout << "h is called for rvalue, const rvalue, lvalue, const lvalue." << std::endl;
|
||||||
|
//
|
||||||
|
h( rvalue() );// h(const &)
|
||||||
|
h( const_rvalue() );// h(const &)
|
||||||
|
h( lvalue );
|
||||||
|
h( const_lvalue );
|
||||||
|
//
|
||||||
|
// Try std::move
|
||||||
|
//
|
||||||
|
std::cout << "std::move." << std::endl;
|
||||||
|
//
|
||||||
|
e( std::move(rvalue()) );// e( && )
|
||||||
|
e( std::move(const_rvalue()) );// e ( const && )
|
||||||
|
e( std::move(lvalue) );// e( && )
|
||||||
|
e( std::move(const_lvalue) );// e ( const && )
|
||||||
|
#if 0
|
||||||
|
//
|
||||||
|
// The following converts lvalue and const lvalue to rvalue and const
|
||||||
|
// rvalue.
|
||||||
|
//
|
||||||
|
std::cout << "std::forward lvalue and const lvalue." << std::endl;
|
||||||
|
//
|
||||||
|
e( std::forward(rvalue()) );// e( && )
|
||||||
|
e( std::move(const_rvalue()) );// e ( const && )
|
||||||
|
e( std::forward(lvalue) );// e( && )
|
||||||
|
e( std::move(const_lvalue) );// e ( const && )
|
||||||
|
#endif
|
||||||
|
|
||||||
|
s( 5 );//s(int &&)
|
||||||
|
|
||||||
|
aaa( "aaaa");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
class copy_tracker
|
|
||||||
{
|
|
||||||
int v;
|
|
||||||
public:
|
|
||||||
copy_tracker()
|
|
||||||
: v(0)
|
|
||||||
{
|
|
||||||
std::cout << "copy_tracker::copy_tracker()" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
copy_tracker( const copy_tracker& c )
|
|
||||||
: v( c.v )
|
|
||||||
{
|
|
||||||
std::cout << "copy_tracker::copy_tracker( copy_tracker& c )" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void use_object() const
|
|
||||||
{
|
|
||||||
std::cout << v << std::endl;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
copy_tracker create_rvalue()
|
|
||||||
{
|
|
||||||
return copy_tracker();
|
|
||||||
}
|
|
||||||
|
|
||||||
const copy_tracker create_const_rvalue()
|
|
||||||
{
|
|
||||||
return copy_tracker();
|
|
||||||
}
|
|
||||||
|
|
||||||
void f ( copy_tracker&& o )
|
|
||||||
{
|
|
||||||
o.use_object();
|
|
||||||
}
|
|
||||||
|
|
||||||
void f_const ( const copy_tracker&& o )
|
|
||||||
{
|
|
||||||
o.use_object();
|
|
||||||
}
|
|
||||||
|
|
||||||
void aaa( const std::string& s )
|
|
||||||
{
|
|
||||||
std::cout << s << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main( void )
|
|
||||||
{
|
|
||||||
|
|
||||||
f( create_rvalue() );
|
|
||||||
|
|
||||||
f_const( create_rvalue() );
|
|
||||||
f_const( create_const_rvalue() );
|
|
||||||
|
|
||||||
copy_tracker lvalue;
|
|
||||||
f( std::move(lvalue) );
|
|
||||||
f_const( std::move(lvalue) );
|
|
||||||
|
|
||||||
aaa( "aaaa");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
91
linux/fork_wait.cpp
Normal file
91
linux/fork_wait.cpp
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
VIM: let g:lcppflags="-std=c++11 -O2 -pthread"
|
||||||
|
VIM: let g:wcppflags="/O2 /EHsc /DWIN32"
|
||||||
|
VIM-: let g:cppflags=g:Iboost.g:Itbb
|
||||||
|
VIM-: let g:ldflags=g:Lboost.g:Ltbb.g:tbbmalloc.g:tbbmproxy
|
||||||
|
VIM-: let g:ldlibpath=g:Bboost.g:Btbb
|
||||||
|
VIM: let g:argv=""
|
||||||
|
*/
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
#ifndef WCOREDUMP
|
||||||
|
#define WCOREDUMP(status) (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void pr_exit(int status)
|
||||||
|
{
|
||||||
|
if (WIFEXITED(status))
|
||||||
|
std::cout << "normal termination, exit status ="
|
||||||
|
<< WEXITSTATUS(status) << std::endl;
|
||||||
|
else if (WIFSIGNALED(status))
|
||||||
|
std::cout << "abnormal termination, signal number = "
|
||||||
|
<< WTERMSIG(status)
|
||||||
|
<< (WCOREDUMP(status) ? " (core file generated)" : "")
|
||||||
|
<< std::endl;
|
||||||
|
else if (WIFSTOPPED(status))
|
||||||
|
std::cout << "child stopped, signal number = "
|
||||||
|
<< WSTOPSIG(status) << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
template< class F>
|
||||||
|
void fork_and_wait( const char * caption, F&& f )
|
||||||
|
{
|
||||||
|
std::cout << caption << ": ";
|
||||||
|
std::cout.flush();
|
||||||
|
|
||||||
|
pid_t pid;
|
||||||
|
int status;
|
||||||
|
if ((pid = fork()) < 0)
|
||||||
|
throw std::runtime_error("fork error");
|
||||||
|
else if (pid == 0) /* child */
|
||||||
|
{
|
||||||
|
f();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else/*parent*/
|
||||||
|
{
|
||||||
|
if (wait(&status) != pid) /* wait for child */
|
||||||
|
throw std::runtime_error("wait error");
|
||||||
|
pr_exit(status); /* and print its status */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void test()
|
||||||
|
{
|
||||||
|
fork_and_wait("exit(7)", [](){
|
||||||
|
exit(7);
|
||||||
|
});
|
||||||
|
|
||||||
|
fork_and_wait("SIGABORT through abort()", [](){
|
||||||
|
abort();
|
||||||
|
});
|
||||||
|
|
||||||
|
fork_and_wait("SIGFPE through divison by zero", [](){
|
||||||
|
int a = rand();
|
||||||
|
int b = 0;
|
||||||
|
a /= b;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
int main ( void )
|
||||||
|
{try{
|
||||||
|
test();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
catch ( const std::exception& e )
|
||||||
|
{
|
||||||
|
std::cerr << std::endl
|
||||||
|
<< "std::exception(\"" << e.what() << "\")." << std::endl;
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
catch ( ... )
|
||||||
|
{
|
||||||
|
std::cerr << std::endl
|
||||||
|
<< "unknown exception." << std::endl;
|
||||||
|
return 1;
|
||||||
|
}}
|
||||||
|
|
||||||
BIN
machine_learning/mlclass-ex1-008/ex1.pdf
Normal file
BIN
machine_learning/mlclass-ex1-008/ex1.pdf
Normal file
Binary file not shown.
22
machine_learning/mlclass-ex1-008/mlclass-ex1/computeCost.m
Normal file
22
machine_learning/mlclass-ex1-008/mlclass-ex1/computeCost.m
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
function J = computeCost(X, y, theta)
|
||||||
|
%COMPUTECOST Compute cost for linear regression
|
||||||
|
% J = COMPUTECOST(X, y, theta) computes the cost of using theta as the
|
||||||
|
% parameter for linear regression to fit the data points in X and y
|
||||||
|
|
||||||
|
% Initialize some useful values
|
||||||
|
m = length(y); % number of training examples
|
||||||
|
|
||||||
|
% You need to return the following variables correctly
|
||||||
|
J = 0;
|
||||||
|
|
||||||
|
% ====================== YOUR CODE HERE ======================
|
||||||
|
% Instructions: Compute the cost of a particular choice of theta
|
||||||
|
% You should set J to the cost.
|
||||||
|
|
||||||
|
%X = [ones(m,1) X];
|
||||||
|
J = sum( (X*theta - y) .^ 2 ) / (2*m);
|
||||||
|
|
||||||
|
|
||||||
|
% =========================================================================
|
||||||
|
|
||||||
|
end
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
function J = computeCostMulti(X, y, theta)
|
||||||
|
%COMPUTECOSTMULTI Compute cost for linear regression with multiple variables
|
||||||
|
% J = COMPUTECOSTMULTI(X, y, theta) computes the cost of using theta as the
|
||||||
|
% parameter for linear regression to fit the data points in X and y
|
||||||
|
|
||||||
|
% Initialize some useful values
|
||||||
|
m = length(y); % number of training examples
|
||||||
|
|
||||||
|
% You need to return the following variables correctly
|
||||||
|
J = 0;
|
||||||
|
|
||||||
|
% ====================== YOUR CODE HERE ======================
|
||||||
|
% Instructions: Compute the cost of a particular choice of theta
|
||||||
|
% You should set J to the cost.
|
||||||
|
|
||||||
|
|
||||||
|
J = sum( (X*theta - y) .^ 2 ) / (2*m);
|
||||||
|
|
||||||
|
|
||||||
|
% =========================================================================
|
||||||
|
|
||||||
|
end
|
||||||
122
machine_learning/mlclass-ex1-008/mlclass-ex1/ex1.m
Normal file
122
machine_learning/mlclass-ex1-008/mlclass-ex1/ex1.m
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
%% Machine Learning Online Class - Exercise 1: Linear Regression
|
||||||
|
|
||||||
|
% Instructions
|
||||||
|
% ------------
|
||||||
|
%
|
||||||
|
% This file contains code that helps you get started on the
|
||||||
|
% linear exercise. You will need to complete the following functions
|
||||||
|
% in this exericse:
|
||||||
|
%
|
||||||
|
% warmUpExercise.m
|
||||||
|
% plotData.m
|
||||||
|
% gradientDescent.m
|
||||||
|
% computeCost.m
|
||||||
|
% gradientDescentMulti.m
|
||||||
|
% computeCostMulti.m
|
||||||
|
% featureNormalize.m
|
||||||
|
% normalEqn.m
|
||||||
|
%
|
||||||
|
% For this exercise, you will not need to change any code in this file,
|
||||||
|
% or any other files other than those mentioned above.
|
||||||
|
%
|
||||||
|
% x refers to the population size in 10,000s
|
||||||
|
% y refers to the profit in $10,000s
|
||||||
|
%
|
||||||
|
|
||||||
|
%% Initialization
|
||||||
|
clear ; close all; clc
|
||||||
|
|
||||||
|
%% ==================== Part 1: Basic Function ====================
|
||||||
|
% Complete warmUpExercise.m
|
||||||
|
fprintf('Running warmUpExercise ... \n');
|
||||||
|
fprintf('5x5 Identity Matrix: \n');
|
||||||
|
warmUpExercise()
|
||||||
|
|
||||||
|
fprintf('Program paused. Press enter to continue.\n');
|
||||||
|
pause;
|
||||||
|
|
||||||
|
|
||||||
|
%% ======================= Part 2: Plotting =======================
|
||||||
|
fprintf('Plotting Data ...\n')
|
||||||
|
data = load('ex1data1.txt');
|
||||||
|
X = data(:, 1); y = data(:, 2);
|
||||||
|
m = length(y); % number of training examples
|
||||||
|
|
||||||
|
% Plot Data
|
||||||
|
% Note: You have to complete the code in plotData.m
|
||||||
|
plotData(X, y);
|
||||||
|
|
||||||
|
fprintf('Program paused. Press enter to continue.\n');
|
||||||
|
pause;
|
||||||
|
|
||||||
|
%% =================== Part 3: Gradient descent ===================
|
||||||
|
fprintf('Running Gradient Descent ...\n')
|
||||||
|
|
||||||
|
X = [ones(m, 1), data(:,1)]; % Add a column of ones to x
|
||||||
|
theta = zeros(2, 1); % initialize fitting parameters
|
||||||
|
|
||||||
|
% Some gradient descent settings
|
||||||
|
iterations = 1500;
|
||||||
|
alpha = 0.01;
|
||||||
|
|
||||||
|
% compute and display initial cost
|
||||||
|
computeCost(X, y, theta)
|
||||||
|
|
||||||
|
% run gradient descent
|
||||||
|
theta = gradientDescent(X, y, theta, alpha, iterations);
|
||||||
|
|
||||||
|
% print theta to screen
|
||||||
|
fprintf('Theta found by gradient descent: ');
|
||||||
|
fprintf('%f %f \n', theta(1), theta(2));
|
||||||
|
|
||||||
|
% Plot the linear fit
|
||||||
|
hold on; % keep previous plot visible
|
||||||
|
plot(X(:,2), X*theta, '-')
|
||||||
|
legend('Training data', 'Linear regression')
|
||||||
|
hold off % don't overlay any more plots on this figure
|
||||||
|
|
||||||
|
% Predict values for population sizes of 35,000 and 70,000
|
||||||
|
predict1 = [1, 3.5] *theta;
|
||||||
|
fprintf('For population = 35,000, we predict a profit of %f\n',...
|
||||||
|
predict1*10000);
|
||||||
|
predict2 = [1, 7] * theta;
|
||||||
|
fprintf('For population = 70,000, we predict a profit of %f\n',...
|
||||||
|
predict2*10000);
|
||||||
|
|
||||||
|
fprintf('Program paused. Press enter to continue.\n');
|
||||||
|
pause;
|
||||||
|
|
||||||
|
%% ============= Part 4: Visualizing J(theta_0, theta_1) =============
|
||||||
|
fprintf('Visualizing J(theta_0, theta_1) ...\n')
|
||||||
|
|
||||||
|
% Grid over which we will calculate J
|
||||||
|
theta0_vals = linspace(-10, 10, 100);
|
||||||
|
theta1_vals = linspace(-1, 4, 100);
|
||||||
|
|
||||||
|
% initialize J_vals to a matrix of 0's
|
||||||
|
J_vals = zeros(length(theta0_vals), length(theta1_vals));
|
||||||
|
|
||||||
|
% Fill out J_vals
|
||||||
|
for i = 1:length(theta0_vals)
|
||||||
|
for j = 1:length(theta1_vals)
|
||||||
|
t = [theta0_vals(i); theta1_vals(j)];
|
||||||
|
J_vals(i,j) = computeCost(X, y, t);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
% Because of the way meshgrids work in the surf command, we need to
|
||||||
|
% transpose J_vals before calling surf, or else the axes will be flipped
|
||||||
|
J_vals = J_vals';
|
||||||
|
% Surface plot
|
||||||
|
figure;
|
||||||
|
surf(theta0_vals, theta1_vals, J_vals)
|
||||||
|
xlabel('\theta_0'); ylabel('\theta_1');
|
||||||
|
|
||||||
|
% Contour plot
|
||||||
|
figure;
|
||||||
|
% Plot J_vals as 15 contours spaced logarithmically between 0.01 and 100
|
||||||
|
contour(theta0_vals, theta1_vals, J_vals, logspace(-2, 3, 20))
|
||||||
|
xlabel('\theta_0'); ylabel('\theta_1');
|
||||||
|
hold on;
|
||||||
|
plot(theta(1), theta(2), 'rx', 'MarkerSize', 10, 'LineWidth', 2);
|
||||||
159
machine_learning/mlclass-ex1-008/mlclass-ex1/ex1_multi.m
Normal file
159
machine_learning/mlclass-ex1-008/mlclass-ex1/ex1_multi.m
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
%% Machine Learning Online Class
|
||||||
|
% Exercise 1: Linear regression with multiple variables
|
||||||
|
%
|
||||||
|
% Instructions
|
||||||
|
% ------------
|
||||||
|
%
|
||||||
|
% This file contains code that helps you get started on the
|
||||||
|
% linear regression exercise.
|
||||||
|
%
|
||||||
|
% You will need to complete the following functions in this
|
||||||
|
% exericse:
|
||||||
|
%
|
||||||
|
% warmUpExercise.m
|
||||||
|
% plotData.m
|
||||||
|
% gradientDescent.m
|
||||||
|
% computeCost.m
|
||||||
|
% gradientDescentMulti.m
|
||||||
|
% computeCostMulti.m
|
||||||
|
% featureNormalize.m
|
||||||
|
% normalEqn.m
|
||||||
|
%
|
||||||
|
% For this part of the exercise, you will need to change some
|
||||||
|
% parts of the code below for various experiments (e.g., changing
|
||||||
|
% learning rates).
|
||||||
|
%
|
||||||
|
|
||||||
|
%% Initialization
|
||||||
|
|
||||||
|
%% ================ Part 1: Feature Normalization ================
|
||||||
|
|
||||||
|
%% Clear and Close Figures
|
||||||
|
clear ; close all; clc
|
||||||
|
|
||||||
|
fprintf('Loading data ...\n');
|
||||||
|
|
||||||
|
%% Load Data
|
||||||
|
data = load('ex1data2.txt');
|
||||||
|
X = data(:, 1:2);
|
||||||
|
y = data(:, 3);
|
||||||
|
m = length(y);
|
||||||
|
|
||||||
|
% Print out some data points
|
||||||
|
fprintf('First 10 examples from the dataset: \n');
|
||||||
|
fprintf(' x = [%.0f %.0f], y = %.0f \n', [X(1:10,:) y(1:10,:)]');
|
||||||
|
|
||||||
|
fprintf('Program paused. Press enter to continue.\n');
|
||||||
|
pause;
|
||||||
|
|
||||||
|
% Scale features and set them to zero mean
|
||||||
|
fprintf('Normalizing Features ...\n');
|
||||||
|
|
||||||
|
[X mu sigma] = featureNormalize(X);
|
||||||
|
|
||||||
|
% Add intercept term to X
|
||||||
|
X = [ones(m, 1) X];
|
||||||
|
|
||||||
|
|
||||||
|
%% ================ Part 2: Gradient Descent ================
|
||||||
|
|
||||||
|
% ====================== YOUR CODE HERE ======================
|
||||||
|
% Instructions: We have provided you with the following starter
|
||||||
|
% code that runs gradient descent with a particular
|
||||||
|
% learning rate (alpha).
|
||||||
|
%
|
||||||
|
% Your task is to first make sure that your functions -
|
||||||
|
% computeCost and gradientDescent already work with
|
||||||
|
% this starter code and support multiple variables.
|
||||||
|
%
|
||||||
|
% After that, try running gradient descent with
|
||||||
|
% different values of alpha and see which one gives
|
||||||
|
% you the best result.
|
||||||
|
%
|
||||||
|
% Finally, you should complete the code at the end
|
||||||
|
% to predict the price of a 1650 sq-ft, 3 br house.
|
||||||
|
%
|
||||||
|
% Hint: By using the 'hold on' command, you can plot multiple
|
||||||
|
% graphs on the same figure.
|
||||||
|
%
|
||||||
|
% Hint: At prediction, make sure you do the same feature normalization.
|
||||||
|
%
|
||||||
|
|
||||||
|
fprintf('Running gradient descent ...\n');
|
||||||
|
|
||||||
|
% Choose some alpha value
|
||||||
|
alpha = 0.01;
|
||||||
|
num_iters = 400;
|
||||||
|
|
||||||
|
% Init Theta and Run Gradient Descent
|
||||||
|
theta = zeros(3, 1);
|
||||||
|
[theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters);
|
||||||
|
|
||||||
|
% Plot the convergence graph
|
||||||
|
figure;
|
||||||
|
plot(1:numel(J_history), J_history, '-b', 'LineWidth', 2);
|
||||||
|
xlabel('Number of iterations');
|
||||||
|
ylabel('Cost J');
|
||||||
|
|
||||||
|
% Display gradient descent's result
|
||||||
|
fprintf('Theta computed from gradient descent: \n');
|
||||||
|
fprintf(' %f \n', theta);
|
||||||
|
fprintf('\n');
|
||||||
|
|
||||||
|
% Estimate the price of a 1650 sq-ft, 3 br house
|
||||||
|
% ====================== YOUR CODE HERE ======================
|
||||||
|
% Recall that the first column of X is all-ones. Thus, it does
|
||||||
|
% not need to be normalized.
|
||||||
|
price = 0; % You should change this
|
||||||
|
|
||||||
|
|
||||||
|
% ============================================================
|
||||||
|
|
||||||
|
fprintf(['Predicted price of a 1650 sq-ft, 3 br house ' ...
|
||||||
|
'(using gradient descent):\n $%f\n'], price);
|
||||||
|
|
||||||
|
fprintf('Program paused. Press enter to continue.\n');
|
||||||
|
pause;
|
||||||
|
|
||||||
|
%% ================ Part 3: Normal Equations ================
|
||||||
|
|
||||||
|
fprintf('Solving with normal equations...\n');
|
||||||
|
|
||||||
|
% ====================== YOUR CODE HERE ======================
|
||||||
|
% Instructions: The following code computes the closed form
|
||||||
|
% solution for linear regression using the normal
|
||||||
|
% equations. You should complete the code in
|
||||||
|
% normalEqn.m
|
||||||
|
%
|
||||||
|
% After doing so, you should complete this code
|
||||||
|
% to predict the price of a 1650 sq-ft, 3 br house.
|
||||||
|
%
|
||||||
|
|
||||||
|
%% Load Data
|
||||||
|
data = csvread('ex1data2.txt');
|
||||||
|
X = data(:, 1:2);
|
||||||
|
y = data(:, 3);
|
||||||
|
m = length(y);
|
||||||
|
|
||||||
|
% Add intercept term to X
|
||||||
|
X = [ones(m, 1) X];
|
||||||
|
|
||||||
|
% Calculate the parameters from the normal equation
|
||||||
|
theta = normalEqn(X, y);
|
||||||
|
|
||||||
|
% Display normal equation's result
|
||||||
|
fprintf('Theta computed from the normal equations: \n');
|
||||||
|
fprintf(' %f \n', theta);
|
||||||
|
fprintf('\n');
|
||||||
|
|
||||||
|
|
||||||
|
% Estimate the price of a 1650 sq-ft, 3 br house
|
||||||
|
% ====================== YOUR CODE HERE ======================
|
||||||
|
price = 0; % You should change this
|
||||||
|
|
||||||
|
|
||||||
|
% ============================================================
|
||||||
|
|
||||||
|
fprintf(['Predicted price of a 1650 sq-ft, 3 br house ' ...
|
||||||
|
'(using normal equations):\n $%f\n'], price);
|
||||||
|
|
||||||
97
machine_learning/mlclass-ex1-008/mlclass-ex1/ex1data1.txt
Normal file
97
machine_learning/mlclass-ex1-008/mlclass-ex1/ex1data1.txt
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
6.1101,17.592
|
||||||
|
5.5277,9.1302
|
||||||
|
8.5186,13.662
|
||||||
|
7.0032,11.854
|
||||||
|
5.8598,6.8233
|
||||||
|
8.3829,11.886
|
||||||
|
7.4764,4.3483
|
||||||
|
8.5781,12
|
||||||
|
6.4862,6.5987
|
||||||
|
5.0546,3.8166
|
||||||
|
5.7107,3.2522
|
||||||
|
14.164,15.505
|
||||||
|
5.734,3.1551
|
||||||
|
8.4084,7.2258
|
||||||
|
5.6407,0.71618
|
||||||
|
5.3794,3.5129
|
||||||
|
6.3654,5.3048
|
||||||
|
5.1301,0.56077
|
||||||
|
6.4296,3.6518
|
||||||
|
7.0708,5.3893
|
||||||
|
6.1891,3.1386
|
||||||
|
20.27,21.767
|
||||||
|
5.4901,4.263
|
||||||
|
6.3261,5.1875
|
||||||
|
5.5649,3.0825
|
||||||
|
18.945,22.638
|
||||||
|
12.828,13.501
|
||||||
|
10.957,7.0467
|
||||||
|
13.176,14.692
|
||||||
|
22.203,24.147
|
||||||
|
5.2524,-1.22
|
||||||
|
6.5894,5.9966
|
||||||
|
9.2482,12.134
|
||||||
|
5.8918,1.8495
|
||||||
|
8.2111,6.5426
|
||||||
|
7.9334,4.5623
|
||||||
|
8.0959,4.1164
|
||||||
|
5.6063,3.3928
|
||||||
|
12.836,10.117
|
||||||
|
6.3534,5.4974
|
||||||
|
5.4069,0.55657
|
||||||
|
6.8825,3.9115
|
||||||
|
11.708,5.3854
|
||||||
|
5.7737,2.4406
|
||||||
|
7.8247,6.7318
|
||||||
|
7.0931,1.0463
|
||||||
|
5.0702,5.1337
|
||||||
|
5.8014,1.844
|
||||||
|
11.7,8.0043
|
||||||
|
5.5416,1.0179
|
||||||
|
7.5402,6.7504
|
||||||
|
5.3077,1.8396
|
||||||
|
7.4239,4.2885
|
||||||
|
7.6031,4.9981
|
||||||
|
6.3328,1.4233
|
||||||
|
6.3589,-1.4211
|
||||||
|
6.2742,2.4756
|
||||||
|
5.6397,4.6042
|
||||||
|
9.3102,3.9624
|
||||||
|
9.4536,5.4141
|
||||||
|
8.8254,5.1694
|
||||||
|
5.1793,-0.74279
|
||||||
|
21.279,17.929
|
||||||
|
14.908,12.054
|
||||||
|
18.959,17.054
|
||||||
|
7.2182,4.8852
|
||||||
|
8.2951,5.7442
|
||||||
|
10.236,7.7754
|
||||||
|
5.4994,1.0173
|
||||||
|
20.341,20.992
|
||||||
|
10.136,6.6799
|
||||||
|
7.3345,4.0259
|
||||||
|
6.0062,1.2784
|
||||||
|
7.2259,3.3411
|
||||||
|
5.0269,-2.6807
|
||||||
|
6.5479,0.29678
|
||||||
|
7.5386,3.8845
|
||||||
|
5.0365,5.7014
|
||||||
|
10.274,6.7526
|
||||||
|
5.1077,2.0576
|
||||||
|
5.7292,0.47953
|
||||||
|
5.1884,0.20421
|
||||||
|
6.3557,0.67861
|
||||||
|
9.7687,7.5435
|
||||||
|
6.5159,5.3436
|
||||||
|
8.5172,4.2415
|
||||||
|
9.1802,6.7981
|
||||||
|
6.002,0.92695
|
||||||
|
5.5204,0.152
|
||||||
|
5.0594,2.8214
|
||||||
|
5.7077,1.8451
|
||||||
|
7.6366,4.2959
|
||||||
|
5.8707,7.2029
|
||||||
|
5.3054,1.9869
|
||||||
|
8.2934,0.14454
|
||||||
|
13.394,9.0551
|
||||||
|
5.4369,0.61705
|
||||||
47
machine_learning/mlclass-ex1-008/mlclass-ex1/ex1data2.txt
Normal file
47
machine_learning/mlclass-ex1-008/mlclass-ex1/ex1data2.txt
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
2104,3,399900
|
||||||
|
1600,3,329900
|
||||||
|
2400,3,369000
|
||||||
|
1416,2,232000
|
||||||
|
3000,4,539900
|
||||||
|
1985,4,299900
|
||||||
|
1534,3,314900
|
||||||
|
1427,3,198999
|
||||||
|
1380,3,212000
|
||||||
|
1494,3,242500
|
||||||
|
1940,4,239999
|
||||||
|
2000,3,347000
|
||||||
|
1890,3,329999
|
||||||
|
4478,5,699900
|
||||||
|
1268,3,259900
|
||||||
|
2300,4,449900
|
||||||
|
1320,2,299900
|
||||||
|
1236,3,199900
|
||||||
|
2609,4,499998
|
||||||
|
3031,4,599000
|
||||||
|
1767,3,252900
|
||||||
|
1888,2,255000
|
||||||
|
1604,3,242900
|
||||||
|
1962,4,259900
|
||||||
|
3890,3,573900
|
||||||
|
1100,3,249900
|
||||||
|
1458,3,464500
|
||||||
|
2526,3,469000
|
||||||
|
2200,3,475000
|
||||||
|
2637,3,299900
|
||||||
|
1839,2,349900
|
||||||
|
1000,1,169900
|
||||||
|
2040,4,314900
|
||||||
|
3137,3,579900
|
||||||
|
1811,4,285900
|
||||||
|
1437,3,249900
|
||||||
|
1239,3,229900
|
||||||
|
2132,4,345000
|
||||||
|
4215,4,549000
|
||||||
|
2162,4,287000
|
||||||
|
1664,2,368500
|
||||||
|
2238,3,329900
|
||||||
|
2567,4,314000
|
||||||
|
1200,3,299000
|
||||||
|
852,2,179900
|
||||||
|
1852,4,299900
|
||||||
|
1203,3,239500
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
function [X_norm, mu, sigma] = featureNormalize(X)
|
||||||
|
%FEATURENORMALIZE Normalizes the features in X
|
||||||
|
% FEATURENORMALIZE(X) returns a normalized version of X where
|
||||||
|
% the mean value of each feature is 0 and the standard deviation
|
||||||
|
% is 1. This is often a good preprocessing step to do when
|
||||||
|
% working with learning algorithms.
|
||||||
|
|
||||||
|
% You need to set these values correctly
|
||||||
|
X_norm = X;
|
||||||
|
mu = zeros(1, size(X, 2));
|
||||||
|
sigma = zeros(1, size(X, 2));
|
||||||
|
|
||||||
|
% ====================== YOUR CODE HERE ======================
|
||||||
|
% Instructions: First, for each feature dimension, compute the mean
|
||||||
|
% of the feature and subtract it from the dataset,
|
||||||
|
% storing the mean value in mu. Next, compute the
|
||||||
|
% standard deviation of each feature and divide
|
||||||
|
% each feature by it's standard deviation, storing
|
||||||
|
% the standard deviation in sigma.
|
||||||
|
%
|
||||||
|
% Note that X is a matrix where each column is a
|
||||||
|
% feature and each row is an example. You need
|
||||||
|
% to perform the normalization separately for
|
||||||
|
% each feature.
|
||||||
|
%
|
||||||
|
% Hint: You might find the 'mean' and 'std' functions useful.
|
||||||
|
%
|
||||||
|
|
||||||
|
mu = mean(X);
|
||||||
|
sigma = std(X);
|
||||||
|
|
||||||
|
X_norm = (X - repmat( mu, size(X,1), 1 )) ./ repmat( sigma, size(X,1), 1 );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% ============================================================
|
||||||
|
|
||||||
|
end
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
|
||||||
|
%GRADIENTDESCENT Performs gradient descent to learn theta
|
||||||
|
% theta = GRADIENTDESENT(X, y, theta, alpha, num_iters) updates theta by
|
||||||
|
% taking num_iters gradient steps with learning rate alpha
|
||||||
|
|
||||||
|
% Initialize some useful values
|
||||||
|
m = length(y); % number of training examples
|
||||||
|
J_history = zeros(num_iters, 1);
|
||||||
|
|
||||||
|
for iter = 1:num_iters
|
||||||
|
|
||||||
|
% ====================== YOUR CODE HERE ======================
|
||||||
|
% Instructions: Perform a single gradient step on the parameter vector
|
||||||
|
% theta.
|
||||||
|
%
|
||||||
|
% Hint: While debugging, it can be useful to print out the values
|
||||||
|
% of the cost function (computeCost) and gradient here.
|
||||||
|
%
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
theta = theta - alpha * (X' * (X*theta-y) / m);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% ============================================================
|
||||||
|
|
||||||
|
% Save the cost J in every iteration
|
||||||
|
J_history(iter) = computeCost(X, y, theta);
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
function [theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters)
|
||||||
|
%GRADIENTDESCENTMULTI Performs gradient descent to learn theta
|
||||||
|
% theta = GRADIENTDESCENTMULTI(x, y, theta, alpha, num_iters) updates theta by
|
||||||
|
% taking num_iters gradient steps with learning rate alpha
|
||||||
|
|
||||||
|
% Initialize some useful values
|
||||||
|
m = length(y); % number of training examples
|
||||||
|
J_history = zeros(num_iters, 1);
|
||||||
|
|
||||||
|
for iter = 1:num_iters
|
||||||
|
|
||||||
|
% ====================== YOUR CODE HERE ======================
|
||||||
|
% Instructions: Perform a single gradient step on the parameter vector
|
||||||
|
% theta.
|
||||||
|
%
|
||||||
|
% Hint: While debugging, it can be useful to print out the values
|
||||||
|
% of the cost function (computeCostMulti) and gradient here.
|
||||||
|
%
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
theta = theta - alpha * (X' * (X*theta-y) / m);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% ============================================================
|
||||||
|
|
||||||
|
% Save the cost J in every iteration
|
||||||
|
J_history(iter) = computeCostMulti(X, y, theta);
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
23
machine_learning/mlclass-ex1-008/mlclass-ex1/normalEqn.m
Normal file
23
machine_learning/mlclass-ex1-008/mlclass-ex1/normalEqn.m
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
function [theta] = normalEqn(X, y)
|
||||||
|
%NORMALEQN Computes the closed-form solution to linear regression
|
||||||
|
% NORMALEQN(X,y) computes the closed-form solution to linear
|
||||||
|
% regression using the normal equations.
|
||||||
|
|
||||||
|
theta = zeros(size(X, 2), 1);
|
||||||
|
|
||||||
|
% ====================== YOUR CODE HERE ======================
|
||||||
|
% Instructions: Complete the code to compute the closed form solution
|
||||||
|
% to linear regression and put the result in theta.
|
||||||
|
%
|
||||||
|
|
||||||
|
% ---------------------- Sample Solution ----------------------
|
||||||
|
|
||||||
|
|
||||||
|
theta = pinv(X'*X)*X'*y;
|
||||||
|
|
||||||
|
% -------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
% ============================================================
|
||||||
|
|
||||||
|
end
|
||||||
26
machine_learning/mlclass-ex1-008/mlclass-ex1/plotData.m
Normal file
26
machine_learning/mlclass-ex1-008/mlclass-ex1/plotData.m
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
function plotData(x, y)
|
||||||
|
%PLOTDATA Plots the data points x and y into a new figure
|
||||||
|
% PLOTDATA(x,y) plots the data points and gives the figure axes labels of
|
||||||
|
% population and profit.
|
||||||
|
|
||||||
|
% ====================== YOUR CODE HERE ======================
|
||||||
|
% Instructions: Plot the training data into a figure using the
|
||||||
|
% "figure" and "plot" commands. Set the axes labels using
|
||||||
|
% the "xlabel" and "ylabel" commands. Assume the
|
||||||
|
% population and revenue data have been passed in
|
||||||
|
% as the x and y arguments of this function.
|
||||||
|
%
|
||||||
|
% Hint: You can use the 'rx' option with plot to have the markers
|
||||||
|
% appear as red crosses. Furthermore, you can make the
|
||||||
|
% markers larger by using plot(..., 'rx', 'MarkerSize', 10);
|
||||||
|
|
||||||
|
figure; % open a new figure window
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% ============================================================
|
||||||
|
|
||||||
|
end
|
||||||
577
machine_learning/mlclass-ex1-008/mlclass-ex1/submit.m
Normal file
577
machine_learning/mlclass-ex1-008/mlclass-ex1/submit.m
Normal file
@@ -0,0 +1,577 @@
|
|||||||
|
function submit(partId, webSubmit)
|
||||||
|
%SUBMIT Submit your code and output to the ml-class servers
|
||||||
|
% SUBMIT() will connect to the ml-class server and submit your solution
|
||||||
|
|
||||||
|
fprintf('==\n== [ml-class] Submitting Solutions | Programming Exercise %s\n==\n', ...
|
||||||
|
homework_id());
|
||||||
|
if ~exist('partId', 'var') || isempty(partId)
|
||||||
|
partId = promptPart();
|
||||||
|
end
|
||||||
|
|
||||||
|
if ~exist('webSubmit', 'var') || isempty(webSubmit)
|
||||||
|
webSubmit = 0; % submit directly by default
|
||||||
|
end
|
||||||
|
|
||||||
|
% Check valid partId
|
||||||
|
partNames = validParts();
|
||||||
|
if ~isValidPartId(partId)
|
||||||
|
fprintf('!! Invalid homework part selected.\n');
|
||||||
|
fprintf('!! Expected an integer from 1 to %d.\n', numel(partNames) + 1);
|
||||||
|
fprintf('!! Submission Cancelled\n');
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if ~exist('ml_login_data.mat','file')
|
||||||
|
[login password] = loginPrompt();
|
||||||
|
save('ml_login_data.mat','login','password');
|
||||||
|
else
|
||||||
|
load('ml_login_data.mat');
|
||||||
|
[login password] = quickLogin(login, password);
|
||||||
|
save('ml_login_data.mat','login','password');
|
||||||
|
end
|
||||||
|
|
||||||
|
if isempty(login)
|
||||||
|
fprintf('!! Submission Cancelled\n');
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
fprintf('\n== Connecting to ml-class ... ');
|
||||||
|
if exist('OCTAVE_VERSION')
|
||||||
|
fflush(stdout);
|
||||||
|
end
|
||||||
|
|
||||||
|
% Setup submit list
|
||||||
|
if partId == numel(partNames) + 1
|
||||||
|
submitParts = 1:numel(partNames);
|
||||||
|
else
|
||||||
|
submitParts = [partId];
|
||||||
|
end
|
||||||
|
|
||||||
|
for s = 1:numel(submitParts)
|
||||||
|
thisPartId = submitParts(s);
|
||||||
|
if (~webSubmit) % submit directly to server
|
||||||
|
[login, ch, signature, auxstring] = getChallenge(login, thisPartId);
|
||||||
|
if isempty(login) || isempty(ch) || isempty(signature)
|
||||||
|
% Some error occured, error string in first return element.
|
||||||
|
fprintf('\n!! Error: %s\n\n', login);
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
% Attempt Submission with Challenge
|
||||||
|
ch_resp = challengeResponse(login, password, ch);
|
||||||
|
|
||||||
|
[result, str] = submitSolution(login, ch_resp, thisPartId, ...
|
||||||
|
output(thisPartId, auxstring), source(thisPartId), signature);
|
||||||
|
|
||||||
|
partName = partNames{thisPartId};
|
||||||
|
|
||||||
|
fprintf('\n== [ml-class] Submitted Assignment %s - Part %d - %s\n', ...
|
||||||
|
homework_id(), thisPartId, partName);
|
||||||
|
fprintf('== %s\n', strtrim(str));
|
||||||
|
|
||||||
|
if exist('OCTAVE_VERSION')
|
||||||
|
fflush(stdout);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
[result] = submitSolutionWeb(login, thisPartId, output(thisPartId), ...
|
||||||
|
source(thisPartId));
|
||||||
|
result = base64encode(result);
|
||||||
|
|
||||||
|
fprintf('\nSave as submission file [submit_ex%s_part%d.txt (enter to accept default)]:', ...
|
||||||
|
homework_id(), thisPartId);
|
||||||
|
saveAsFile = input('', 's');
|
||||||
|
if (isempty(saveAsFile))
|
||||||
|
saveAsFile = sprintf('submit_ex%s_part%d.txt', homework_id(), thisPartId);
|
||||||
|
end
|
||||||
|
|
||||||
|
fid = fopen(saveAsFile, 'w');
|
||||||
|
if (fid)
|
||||||
|
fwrite(fid, result);
|
||||||
|
fclose(fid);
|
||||||
|
fprintf('\nSaved your solutions to %s.\n\n', saveAsFile);
|
||||||
|
fprintf(['You can now submit your solutions through the web \n' ...
|
||||||
|
'form in the programming exercises. Select the corresponding \n' ...
|
||||||
|
'programming exercise to access the form.\n']);
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf('Unable to save to %s\n\n', saveAsFile);
|
||||||
|
fprintf(['You can create a submission file by saving the \n' ...
|
||||||
|
'following text in a file: (press enter to continue)\n\n']);
|
||||||
|
pause;
|
||||||
|
fprintf(result);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
% ================== CONFIGURABLES FOR EACH HOMEWORK ==================
|
||||||
|
|
||||||
|
function id = homework_id()
|
||||||
|
id = '1';
|
||||||
|
end
|
||||||
|
|
||||||
|
function [partNames] = validParts()
|
||||||
|
partNames = { 'Warm up exercise ', ...
|
||||||
|
'Computing Cost (for one variable)', ...
|
||||||
|
'Gradient Descent (for one variable)', ...
|
||||||
|
'Feature Normalization', ...
|
||||||
|
'Computing Cost (for multiple variables)', ...
|
||||||
|
'Gradient Descent (for multiple variables)', ...
|
||||||
|
'Normal Equations'};
|
||||||
|
end
|
||||||
|
|
||||||
|
function srcs = sources()
|
||||||
|
% Separated by part
|
||||||
|
srcs = { { 'warmUpExercise.m' }, ...
|
||||||
|
{ 'computeCost.m' }, ...
|
||||||
|
{ 'gradientDescent.m' }, ...
|
||||||
|
{ 'featureNormalize.m' }, ...
|
||||||
|
{ 'computeCostMulti.m' }, ...
|
||||||
|
{ 'gradientDescentMulti.m' }, ...
|
||||||
|
{ 'normalEqn.m' }, ...
|
||||||
|
};
|
||||||
|
end
|
||||||
|
|
||||||
|
function out = output(partId, auxstring)
|
||||||
|
% Random Test Cases
|
||||||
|
X1 = [ones(20,1) (exp(1) + exp(2) * (0.1:0.1:2))'];
|
||||||
|
Y1 = X1(:,2) + sin(X1(:,1)) + cos(X1(:,2));
|
||||||
|
X2 = [X1 X1(:,2).^0.5 X1(:,2).^0.25];
|
||||||
|
Y2 = Y1.^0.5 + Y1;
|
||||||
|
if partId == 1
|
||||||
|
out = sprintf('%0.5f ', warmUpExercise());
|
||||||
|
elseif partId == 2
|
||||||
|
out = sprintf('%0.5f ', computeCost(X1, Y1, [0.5 -0.5]'));
|
||||||
|
elseif partId == 3
|
||||||
|
out = sprintf('%0.5f ', gradientDescent(X1, Y1, [0.5 -0.5]', 0.01, 10));
|
||||||
|
elseif partId == 4
|
||||||
|
out = sprintf('%0.5f ', featureNormalize(X2(:,2:4)));
|
||||||
|
elseif partId == 5
|
||||||
|
out = sprintf('%0.5f ', computeCostMulti(X2, Y2, [0.1 0.2 0.3 0.4]'));
|
||||||
|
elseif partId == 6
|
||||||
|
out = sprintf('%0.5f ', gradientDescentMulti(X2, Y2, [-0.1 -0.2 -0.3 -0.4]', 0.01, 10));
|
||||||
|
elseif partId == 7
|
||||||
|
out = sprintf('%0.5f ', normalEqn(X2, Y2));
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
% ====================== SERVER CONFIGURATION ===========================
|
||||||
|
|
||||||
|
% ***************** REMOVE -staging WHEN YOU DEPLOY *********************
|
||||||
|
function url = site_url()
|
||||||
|
url = 'http://class.coursera.org/ml-008';
|
||||||
|
end
|
||||||
|
|
||||||
|
function url = challenge_url()
|
||||||
|
url = [site_url() '/assignment/challenge'];
|
||||||
|
end
|
||||||
|
|
||||||
|
function url = submit_url()
|
||||||
|
url = [site_url() '/assignment/submit'];
|
||||||
|
end
|
||||||
|
|
||||||
|
% ========================= CHALLENGE HELPERS =========================
|
||||||
|
|
||||||
|
function src = source(partId)
|
||||||
|
src = '';
|
||||||
|
src_files = sources();
|
||||||
|
if partId <= numel(src_files)
|
||||||
|
flist = src_files{partId};
|
||||||
|
for i = 1:numel(flist)
|
||||||
|
fid = fopen(flist{i});
|
||||||
|
if (fid == -1)
|
||||||
|
error('Error opening %s (is it missing?)', flist{i});
|
||||||
|
end
|
||||||
|
line = fgets(fid);
|
||||||
|
while ischar(line)
|
||||||
|
src = [src line];
|
||||||
|
line = fgets(fid);
|
||||||
|
end
|
||||||
|
fclose(fid);
|
||||||
|
src = [src '||||||||'];
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function ret = isValidPartId(partId)
|
||||||
|
partNames = validParts();
|
||||||
|
ret = (~isempty(partId)) && (partId >= 1) && (partId <= numel(partNames) + 1);
|
||||||
|
end
|
||||||
|
|
||||||
|
function partId = promptPart()
|
||||||
|
fprintf('== Select which part(s) to submit:\n');
|
||||||
|
partNames = validParts();
|
||||||
|
srcFiles = sources();
|
||||||
|
for i = 1:numel(partNames)
|
||||||
|
fprintf('== %d) %s [', i, partNames{i});
|
||||||
|
fprintf(' %s ', srcFiles{i}{:});
|
||||||
|
fprintf(']\n');
|
||||||
|
end
|
||||||
|
fprintf('== %d) All of the above \n==\nEnter your choice [1-%d]: ', ...
|
||||||
|
numel(partNames) + 1, numel(partNames) + 1);
|
||||||
|
selPart = input('', 's');
|
||||||
|
partId = str2num(selPart);
|
||||||
|
if ~isValidPartId(partId)
|
||||||
|
partId = -1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function [email,ch,signature,auxstring] = getChallenge(email, part)
|
||||||
|
str = urlread(challenge_url(), 'post', {'email_address', email, 'assignment_part_sid', [homework_id() '-' num2str(part)], 'response_encoding', 'delim'});
|
||||||
|
|
||||||
|
str = strtrim(str);
|
||||||
|
r = struct;
|
||||||
|
while(numel(str) > 0)
|
||||||
|
[f, str] = strtok (str, '|');
|
||||||
|
[v, str] = strtok (str, '|');
|
||||||
|
r = setfield(r, f, v);
|
||||||
|
end
|
||||||
|
|
||||||
|
email = getfield(r, 'email_address');
|
||||||
|
ch = getfield(r, 'challenge_key');
|
||||||
|
signature = getfield(r, 'state');
|
||||||
|
auxstring = getfield(r, 'challenge_aux_data');
|
||||||
|
end
|
||||||
|
|
||||||
|
function [result, str] = submitSolutionWeb(email, part, output, source)
|
||||||
|
|
||||||
|
result = ['{"assignment_part_sid":"' base64encode([homework_id() '-' num2str(part)], '') '",' ...
|
||||||
|
'"email_address":"' base64encode(email, '') '",' ...
|
||||||
|
'"submission":"' base64encode(output, '') '",' ...
|
||||||
|
'"submission_aux":"' base64encode(source, '') '"' ...
|
||||||
|
'}'];
|
||||||
|
str = 'Web-submission';
|
||||||
|
end
|
||||||
|
|
||||||
|
function [result, str] = submitSolution(email, ch_resp, part, output, ...
|
||||||
|
source, signature)
|
||||||
|
|
||||||
|
params = {'assignment_part_sid', [homework_id() '-' num2str(part)], ...
|
||||||
|
'email_address', email, ...
|
||||||
|
'submission', base64encode(output, ''), ...
|
||||||
|
'submission_aux', base64encode(source, ''), ...
|
||||||
|
'challenge_response', ch_resp, ...
|
||||||
|
'state', signature};
|
||||||
|
|
||||||
|
str = urlread(submit_url(), 'post', params);
|
||||||
|
|
||||||
|
% Parse str to read for success / failure
|
||||||
|
result = 0;
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
% =========================== LOGIN HELPERS ===========================
|
||||||
|
|
||||||
|
function [login password] = loginPrompt()
|
||||||
|
% Prompt for password
|
||||||
|
[login password] = basicPrompt();
|
||||||
|
|
||||||
|
if isempty(login) || isempty(password)
|
||||||
|
login = []; password = [];
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function [login password] = basicPrompt()
|
||||||
|
login = input('Login (Email address): ', 's');
|
||||||
|
password = input('Password: ', 's');
|
||||||
|
end
|
||||||
|
|
||||||
|
function [login password] = quickLogin(login,password)
|
||||||
|
disp(['You are currently logged in as ' login '.']);
|
||||||
|
cont_token = input('Is this you? (y/n - type n to reenter password)','s');
|
||||||
|
if(isempty(cont_token) || cont_token(1)=='Y'||cont_token(1)=='y')
|
||||||
|
return;
|
||||||
|
else
|
||||||
|
[login password] = loginPrompt();
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function [str] = challengeResponse(email, passwd, challenge)
|
||||||
|
str = sha1([challenge passwd]);
|
||||||
|
end
|
||||||
|
|
||||||
|
% =============================== SHA-1 ================================
|
||||||
|
|
||||||
|
function hash = sha1(str)
|
||||||
|
|
||||||
|
% Initialize variables
|
||||||
|
h0 = uint32(1732584193);
|
||||||
|
h1 = uint32(4023233417);
|
||||||
|
h2 = uint32(2562383102);
|
||||||
|
h3 = uint32(271733878);
|
||||||
|
h4 = uint32(3285377520);
|
||||||
|
|
||||||
|
% Convert to word array
|
||||||
|
strlen = numel(str);
|
||||||
|
|
||||||
|
% Break string into chars and append the bit 1 to the message
|
||||||
|
mC = [double(str) 128];
|
||||||
|
mC = [mC zeros(1, 4-mod(numel(mC), 4), 'uint8')];
|
||||||
|
|
||||||
|
numB = strlen * 8;
|
||||||
|
if exist('idivide')
|
||||||
|
numC = idivide(uint32(numB + 65), 512, 'ceil');
|
||||||
|
else
|
||||||
|
numC = ceil(double(numB + 65)/512);
|
||||||
|
end
|
||||||
|
numW = numC * 16;
|
||||||
|
mW = zeros(numW, 1, 'uint32');
|
||||||
|
|
||||||
|
idx = 1;
|
||||||
|
for i = 1:4:strlen + 1
|
||||||
|
mW(idx) = bitor(bitor(bitor( ...
|
||||||
|
bitshift(uint32(mC(i)), 24), ...
|
||||||
|
bitshift(uint32(mC(i+1)), 16)), ...
|
||||||
|
bitshift(uint32(mC(i+2)), 8)), ...
|
||||||
|
uint32(mC(i+3)));
|
||||||
|
idx = idx + 1;
|
||||||
|
end
|
||||||
|
|
||||||
|
% Append length of message
|
||||||
|
mW(numW - 1) = uint32(bitshift(uint64(numB), -32));
|
||||||
|
mW(numW) = uint32(bitshift(bitshift(uint64(numB), 32), -32));
|
||||||
|
|
||||||
|
% Process the message in successive 512-bit chs
|
||||||
|
for cId = 1 : double(numC)
|
||||||
|
cSt = (cId - 1) * 16 + 1;
|
||||||
|
cEnd = cId * 16;
|
||||||
|
ch = mW(cSt : cEnd);
|
||||||
|
|
||||||
|
% Extend the sixteen 32-bit words into eighty 32-bit words
|
||||||
|
for j = 17 : 80
|
||||||
|
ch(j) = ch(j - 3);
|
||||||
|
ch(j) = bitxor(ch(j), ch(j - 8));
|
||||||
|
ch(j) = bitxor(ch(j), ch(j - 14));
|
||||||
|
ch(j) = bitxor(ch(j), ch(j - 16));
|
||||||
|
ch(j) = bitrotate(ch(j), 1);
|
||||||
|
end
|
||||||
|
|
||||||
|
% Initialize hash value for this ch
|
||||||
|
a = h0;
|
||||||
|
b = h1;
|
||||||
|
c = h2;
|
||||||
|
d = h3;
|
||||||
|
e = h4;
|
||||||
|
|
||||||
|
% Main loop
|
||||||
|
for i = 1 : 80
|
||||||
|
if(i >= 1 && i <= 20)
|
||||||
|
f = bitor(bitand(b, c), bitand(bitcmp(b), d));
|
||||||
|
k = uint32(1518500249);
|
||||||
|
elseif(i >= 21 && i <= 40)
|
||||||
|
f = bitxor(bitxor(b, c), d);
|
||||||
|
k = uint32(1859775393);
|
||||||
|
elseif(i >= 41 && i <= 60)
|
||||||
|
f = bitor(bitor(bitand(b, c), bitand(b, d)), bitand(c, d));
|
||||||
|
k = uint32(2400959708);
|
||||||
|
elseif(i >= 61 && i <= 80)
|
||||||
|
f = bitxor(bitxor(b, c), d);
|
||||||
|
k = uint32(3395469782);
|
||||||
|
end
|
||||||
|
|
||||||
|
t = bitrotate(a, 5);
|
||||||
|
t = bitadd(t, f);
|
||||||
|
t = bitadd(t, e);
|
||||||
|
t = bitadd(t, k);
|
||||||
|
t = bitadd(t, ch(i));
|
||||||
|
e = d;
|
||||||
|
d = c;
|
||||||
|
c = bitrotate(b, 30);
|
||||||
|
b = a;
|
||||||
|
a = t;
|
||||||
|
|
||||||
|
end
|
||||||
|
h0 = bitadd(h0, a);
|
||||||
|
h1 = bitadd(h1, b);
|
||||||
|
h2 = bitadd(h2, c);
|
||||||
|
h3 = bitadd(h3, d);
|
||||||
|
h4 = bitadd(h4, e);
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
hash = reshape(dec2hex(double([h0 h1 h2 h3 h4]), 8)', [1 40]);
|
||||||
|
|
||||||
|
hash = lower(hash);
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function ret = bitadd(iA, iB)
|
||||||
|
ret = double(iA) + double(iB);
|
||||||
|
ret = bitset(ret, 33, 0);
|
||||||
|
ret = uint32(ret);
|
||||||
|
end
|
||||||
|
|
||||||
|
function ret = bitrotate(iA, places)
|
||||||
|
t = bitshift(iA, places - 32);
|
||||||
|
ret = bitshift(iA, places);
|
||||||
|
ret = bitor(ret, t);
|
||||||
|
end
|
||||||
|
|
||||||
|
% =========================== Base64 Encoder ============================
|
||||||
|
% Thanks to Peter John Acklam
|
||||||
|
%
|
||||||
|
|
||||||
|
function y = base64encode(x, eol)
|
||||||
|
%BASE64ENCODE Perform base64 encoding on a string.
|
||||||
|
%
|
||||||
|
% BASE64ENCODE(STR, EOL) encode the given string STR. EOL is the line ending
|
||||||
|
% sequence to use; it is optional and defaults to '\n' (ASCII decimal 10).
|
||||||
|
% The returned encoded string is broken into lines of no more than 76
|
||||||
|
% characters each, and each line will end with EOL unless it is empty. Let
|
||||||
|
% EOL be empty if you do not want the encoded string broken into lines.
|
||||||
|
%
|
||||||
|
% STR and EOL don't have to be strings (i.e., char arrays). The only
|
||||||
|
% requirement is that they are vectors containing values in the range 0-255.
|
||||||
|
%
|
||||||
|
% This function may be used to encode strings into the Base64 encoding
|
||||||
|
% specified in RFC 2045 - MIME (Multipurpose Internet Mail Extensions). The
|
||||||
|
% Base64 encoding is designed to represent arbitrary sequences of octets in a
|
||||||
|
% form that need not be humanly readable. A 65-character subset
|
||||||
|
% ([A-Za-z0-9+/=]) of US-ASCII is used, enabling 6 bits to be represented per
|
||||||
|
% printable character.
|
||||||
|
%
|
||||||
|
% Examples
|
||||||
|
% --------
|
||||||
|
%
|
||||||
|
% If you want to encode a large file, you should encode it in chunks that are
|
||||||
|
% a multiple of 57 bytes. This ensures that the base64 lines line up and
|
||||||
|
% that you do not end up with padding in the middle. 57 bytes of data fills
|
||||||
|
% one complete base64 line (76 == 57*4/3):
|
||||||
|
%
|
||||||
|
% If ifid and ofid are two file identifiers opened for reading and writing,
|
||||||
|
% respectively, then you can base64 encode the data with
|
||||||
|
%
|
||||||
|
% while ~feof(ifid)
|
||||||
|
% fwrite(ofid, base64encode(fread(ifid, 60*57)));
|
||||||
|
% end
|
||||||
|
%
|
||||||
|
% or, if you have enough memory,
|
||||||
|
%
|
||||||
|
% fwrite(ofid, base64encode(fread(ifid)));
|
||||||
|
%
|
||||||
|
% See also BASE64DECODE.
|
||||||
|
|
||||||
|
% Author: Peter John Acklam
|
||||||
|
% Time-stamp: 2004-02-03 21:36:56 +0100
|
||||||
|
% E-mail: pjacklam@online.no
|
||||||
|
% URL: http://home.online.no/~pjacklam
|
||||||
|
|
||||||
|
if isnumeric(x)
|
||||||
|
x = num2str(x);
|
||||||
|
end
|
||||||
|
|
||||||
|
% make sure we have the EOL value
|
||||||
|
if nargin < 2
|
||||||
|
eol = sprintf('\n');
|
||||||
|
else
|
||||||
|
if sum(size(eol) > 1) > 1
|
||||||
|
error('EOL must be a vector.');
|
||||||
|
end
|
||||||
|
if any(eol(:) > 255)
|
||||||
|
error('EOL can not contain values larger than 255.');
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if sum(size(x) > 1) > 1
|
||||||
|
error('STR must be a vector.');
|
||||||
|
end
|
||||||
|
|
||||||
|
x = uint8(x);
|
||||||
|
eol = uint8(eol);
|
||||||
|
|
||||||
|
ndbytes = length(x); % number of decoded bytes
|
||||||
|
nchunks = ceil(ndbytes / 3); % number of chunks/groups
|
||||||
|
nebytes = 4 * nchunks; % number of encoded bytes
|
||||||
|
|
||||||
|
% add padding if necessary, to make the length of x a multiple of 3
|
||||||
|
if rem(ndbytes, 3)
|
||||||
|
x(end+1 : 3*nchunks) = 0;
|
||||||
|
end
|
||||||
|
|
||||||
|
x = reshape(x, [3, nchunks]); % reshape the data
|
||||||
|
y = repmat(uint8(0), 4, nchunks); % for the encoded data
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
% Split up every 3 bytes into 4 pieces
|
||||||
|
%
|
||||||
|
% aaaaaabb bbbbcccc ccdddddd
|
||||||
|
%
|
||||||
|
% to form
|
||||||
|
%
|
||||||
|
% 00aaaaaa 00bbbbbb 00cccccc 00dddddd
|
||||||
|
%
|
||||||
|
y(1,:) = bitshift(x(1,:), -2); % 6 highest bits of x(1,:)
|
||||||
|
|
||||||
|
y(2,:) = bitshift(bitand(x(1,:), 3), 4); % 2 lowest bits of x(1,:)
|
||||||
|
y(2,:) = bitor(y(2,:), bitshift(x(2,:), -4)); % 4 highest bits of x(2,:)
|
||||||
|
|
||||||
|
y(3,:) = bitshift(bitand(x(2,:), 15), 2); % 4 lowest bits of x(2,:)
|
||||||
|
y(3,:) = bitor(y(3,:), bitshift(x(3,:), -6)); % 2 highest bits of x(3,:)
|
||||||
|
|
||||||
|
y(4,:) = bitand(x(3,:), 63); % 6 lowest bits of x(3,:)
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
% Now perform the following mapping
|
||||||
|
%
|
||||||
|
% 0 - 25 -> A-Z
|
||||||
|
% 26 - 51 -> a-z
|
||||||
|
% 52 - 61 -> 0-9
|
||||||
|
% 62 -> +
|
||||||
|
% 63 -> /
|
||||||
|
%
|
||||||
|
% We could use a mapping vector like
|
||||||
|
%
|
||||||
|
% ['A':'Z', 'a':'z', '0':'9', '+/']
|
||||||
|
%
|
||||||
|
% but that would require an index vector of class double.
|
||||||
|
%
|
||||||
|
z = repmat(uint8(0), size(y));
|
||||||
|
i = y <= 25; z(i) = 'A' + double(y(i));
|
||||||
|
i = 26 <= y & y <= 51; z(i) = 'a' - 26 + double(y(i));
|
||||||
|
i = 52 <= y & y <= 61; z(i) = '0' - 52 + double(y(i));
|
||||||
|
i = y == 62; z(i) = '+';
|
||||||
|
i = y == 63; z(i) = '/';
|
||||||
|
y = z;
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
% Add padding if necessary.
|
||||||
|
%
|
||||||
|
npbytes = 3 * nchunks - ndbytes; % number of padding bytes
|
||||||
|
if npbytes
|
||||||
|
y(end-npbytes+1 : end) = '='; % '=' is used for padding
|
||||||
|
end
|
||||||
|
|
||||||
|
if isempty(eol)
|
||||||
|
|
||||||
|
% reshape to a row vector
|
||||||
|
y = reshape(y, [1, nebytes]);
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
nlines = ceil(nebytes / 76); % number of lines
|
||||||
|
neolbytes = length(eol); % number of bytes in eol string
|
||||||
|
|
||||||
|
% pad data so it becomes a multiple of 76 elements
|
||||||
|
y = [y(:) ; zeros(76 * nlines - numel(y), 1)];
|
||||||
|
y(nebytes + 1 : 76 * nlines) = 0;
|
||||||
|
y = reshape(y, 76, nlines);
|
||||||
|
|
||||||
|
% insert eol strings
|
||||||
|
eol = eol(:);
|
||||||
|
y(end + 1 : end + neolbytes, :) = eol(:, ones(1, nlines));
|
||||||
|
|
||||||
|
% remove padding, but keep the last eol string
|
||||||
|
m = nebytes + neolbytes * (nlines - 1);
|
||||||
|
n = (76+neolbytes)*nlines - neolbytes;
|
||||||
|
y(m+1 : n) = '';
|
||||||
|
|
||||||
|
% extract and reshape to row vector
|
||||||
|
y = reshape(y, 1, m+neolbytes);
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
% output is a character array
|
||||||
|
y = char(y);
|
||||||
|
|
||||||
|
end
|
||||||
20
machine_learning/mlclass-ex1-008/mlclass-ex1/submitWeb.m
Normal file
20
machine_learning/mlclass-ex1-008/mlclass-ex1/submitWeb.m
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
% submitWeb Creates files from your code and output for web submission.
|
||||||
|
%
|
||||||
|
% If the submit function does not work for you, use the web-submission mechanism.
|
||||||
|
% Call this function to produce a file for the part you wish to submit. Then,
|
||||||
|
% submit the file to the class servers using the "Web Submission" button on the
|
||||||
|
% Programming Exercises page on the course website.
|
||||||
|
%
|
||||||
|
% You should call this function without arguments (submitWeb), to receive
|
||||||
|
% an interactive prompt for submission; optionally you can call it with the partID
|
||||||
|
% if you so wish. Make sure your working directory is set to the directory
|
||||||
|
% containing the submitWeb.m file and your assignment files.
|
||||||
|
|
||||||
|
function submitWeb(partId)
|
||||||
|
if ~exist('partId', 'var') || isempty(partId)
|
||||||
|
partId = [];
|
||||||
|
end
|
||||||
|
|
||||||
|
submit(partId, 1);
|
||||||
|
end
|
||||||
|
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
function A = warmUpExercise()
|
||||||
|
%WARMUPEXERCISE Example function in octave
|
||||||
|
% A = WARMUPEXERCISE() is an example function that returns the 5x5 identity matrix
|
||||||
|
|
||||||
|
A = [];
|
||||||
|
% ============= YOUR CODE HERE ==============
|
||||||
|
% Instructions: Return the 5x5 identity matrix
|
||||||
|
% In octave, we return values by defining which variables
|
||||||
|
% represent the return values (at the top of the file)
|
||||||
|
% and then set them accordingly.
|
||||||
|
|
||||||
|
|
||||||
|
A = eye(5);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% ===========================================
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
BIN
machine_learning/mlclass-ex2-008/ex2.pdf
Normal file
BIN
machine_learning/mlclass-ex2-008/ex2.pdf
Normal file
Binary file not shown.
30
machine_learning/mlclass-ex2-008/mlclass-ex2/costFunction.m
Normal file
30
machine_learning/mlclass-ex2-008/mlclass-ex2/costFunction.m
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
function [J, grad] = costFunction(theta, X, y)
|
||||||
|
%COSTFUNCTION Compute cost and gradient for logistic regression
|
||||||
|
% J = COSTFUNCTION(theta, X, y) computes the cost of using theta as the
|
||||||
|
% parameter for logistic regression and the gradient of the cost
|
||||||
|
% w.r.t. to the parameters.
|
||||||
|
|
||||||
|
% Initialize some useful values
|
||||||
|
m = length(y); % number of training examples
|
||||||
|
|
||||||
|
% You need to return the following variables correctly
|
||||||
|
J = 0;
|
||||||
|
grad = zeros(size(theta));
|
||||||
|
|
||||||
|
% ====================== YOUR CODE HERE ======================
|
||||||
|
% Instructions: Compute the cost of a particular choice of theta.
|
||||||
|
% You should set J to the cost.
|
||||||
|
% Compute the partial derivatives and set grad to the partial
|
||||||
|
% derivatives of the cost w.r.t. each parameter in theta
|
||||||
|
%
|
||||||
|
% Note: grad should have the same dimensions as theta
|
||||||
|
%
|
||||||
|
|
||||||
|
h = sigmoid( X*theta );
|
||||||
|
o = ones(size(y));
|
||||||
|
J = sum( y .* log(h) + (o-y) .* log(o-h) ) / (-m);
|
||||||
|
grad = (X'*(h - y)) / m;
|
||||||
|
|
||||||
|
% =============================================================
|
||||||
|
|
||||||
|
end
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
function [J, grad] = costFunctionReg(theta, X, y, lambda)
|
||||||
|
%COSTFUNCTIONREG Compute cost and gradient for logistic regression with regularization
|
||||||
|
% J = COSTFUNCTIONREG(theta, X, y, lambda) computes the cost of using
|
||||||
|
% theta as the parameter for regularized logistic regression and the
|
||||||
|
% gradient of the cost w.r.t. to the parameters.
|
||||||
|
|
||||||
|
% Initialize some useful values
|
||||||
|
m = length(y); % number of training examples
|
||||||
|
|
||||||
|
% You need to return the following variables correctly
|
||||||
|
J = 0;
|
||||||
|
grad = zeros(size(theta));
|
||||||
|
|
||||||
|
% ====================== YOUR CODE HERE ======================
|
||||||
|
% Instructions: Compute the cost of a particular choice of theta.
|
||||||
|
% You should set J to the cost.
|
||||||
|
% Compute the partial derivatives and set grad to the partial
|
||||||
|
% derivatives of the cost w.r.t. each parameter in theta
|
||||||
|
|
||||||
|
|
||||||
|
h = sigmoid( X*theta );
|
||||||
|
o = ones(size(y));
|
||||||
|
reg = theta;
|
||||||
|
reg(1) = 0;
|
||||||
|
J = sum( y .* log(h) + (o-y) .* log(o-h) ) / (-m) + (lambda/(2*m))*sum(reg.^2);
|
||||||
|
grad = (X'*(h - y)) / m + (lambda/m) * reg;
|
||||||
|
|
||||||
|
% =============================================================
|
||||||
|
|
||||||
|
end
|
||||||
135
machine_learning/mlclass-ex2-008/mlclass-ex2/ex2.m
Normal file
135
machine_learning/mlclass-ex2-008/mlclass-ex2/ex2.m
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
%% Machine Learning Online Class - Exercise 2: Logistic Regression
|
||||||
|
%
|
||||||
|
% Instructions
|
||||||
|
% ------------
|
||||||
|
%
|
||||||
|
% This file contains code that helps you get started on the logistic
|
||||||
|
% regression exercise. You will need to complete the following functions
|
||||||
|
% in this exericse:
|
||||||
|
%
|
||||||
|
% sigmoid.m
|
||||||
|
% costFunction.m
|
||||||
|
% predict.m
|
||||||
|
% costFunctionReg.m
|
||||||
|
%
|
||||||
|
% For this exercise, you will not need to change any code in this file,
|
||||||
|
% or any other files other than those mentioned above.
|
||||||
|
%
|
||||||
|
|
||||||
|
%% Initialization
|
||||||
|
clear ; close all; clc
|
||||||
|
|
||||||
|
%% Load Data
|
||||||
|
% The first two columns contains the exam scores and the third column
|
||||||
|
% contains the label.
|
||||||
|
|
||||||
|
data = load('ex2data1.txt');
|
||||||
|
X = data(:, [1, 2]); y = data(:, 3);
|
||||||
|
|
||||||
|
%% ==================== Part 1: Plotting ====================
|
||||||
|
% We start the exercise by first plotting the data to understand the
|
||||||
|
% the problem we are working with.
|
||||||
|
|
||||||
|
fprintf(['Plotting data with + indicating (y = 1) examples and o ' ...
|
||||||
|
'indicating (y = 0) examples.\n']);
|
||||||
|
|
||||||
|
%%plotData(X, y);
|
||||||
|
|
||||||
|
% Put some labels
|
||||||
|
%%hold on;
|
||||||
|
% Labels and Legend
|
||||||
|
%%xlabel('Exam 1 score')
|
||||||
|
%%ylabel('Exam 2 score')
|
||||||
|
|
||||||
|
% Specified in plot order
|
||||||
|
%%legend('Admitted', 'Not admitted')
|
||||||
|
%%hold off;
|
||||||
|
|
||||||
|
fprintf('\nProgram paused. Press enter to continue.\n');
|
||||||
|
%%pause;
|
||||||
|
|
||||||
|
|
||||||
|
%% ============ Part 2: Compute Cost and Gradient ============
|
||||||
|
% In this part of the exercise, you will implement the cost and gradient
|
||||||
|
% for logistic regression. You neeed to complete the code in
|
||||||
|
% costFunction.m
|
||||||
|
|
||||||
|
% Setup the data matrix appropriately, and add ones for the intercept term
|
||||||
|
[m, n] = size(X);
|
||||||
|
|
||||||
|
% Add intercept term to x and X_test
|
||||||
|
X = [ones(m, 1) X];
|
||||||
|
|
||||||
|
% Initialize fitting parameters
|
||||||
|
initial_theta = zeros(n + 1, 1);
|
||||||
|
|
||||||
|
% Compute and display initial cost and gradient
|
||||||
|
[cost, grad] = costFunction(initial_theta, X, y);
|
||||||
|
|
||||||
|
fprintf('Cost at initial theta (zeros): %f\n', cost);
|
||||||
|
fprintf('Gradient at initial theta (zeros): \n');
|
||||||
|
fprintf(' %f \n', grad);
|
||||||
|
|
||||||
|
fprintf('\nProgram paused. Press enter to continue.\n');
|
||||||
|
pause;
|
||||||
|
|
||||||
|
|
||||||
|
%% ============= Part 3: Optimizing using fminunc =============
|
||||||
|
% In this exercise, you will use a built-in function (fminunc) to find the
|
||||||
|
% optimal parameters theta.
|
||||||
|
|
||||||
|
% Set options for fminunc
|
||||||
|
options = optimset('GradObj', 'on', 'MaxIter', 400);
|
||||||
|
|
||||||
|
% Run fminunc to obtain the optimal theta
|
||||||
|
% This function will return theta and the cost
|
||||||
|
[theta, cost] = ...
|
||||||
|
fminunc(@(t)(costFunction(t, X, y)), initial_theta, options);
|
||||||
|
|
||||||
|
% Print theta to screen
|
||||||
|
fprintf('Cost at theta found by fminunc: %f\n', cost);
|
||||||
|
fprintf('theta: \n');
|
||||||
|
fprintf(' %f \n', theta);
|
||||||
|
|
||||||
|
% Plot Boundary
|
||||||
|
plotDecisionBoundary(theta, X, y);
|
||||||
|
|
||||||
|
% Put some labels
|
||||||
|
hold on;
|
||||||
|
% Labels and Legend
|
||||||
|
xlabel('Exam 1 score')
|
||||||
|
ylabel('Exam 2 score')
|
||||||
|
|
||||||
|
% Specified in plot order
|
||||||
|
legend('Admitted', 'Not admitted')
|
||||||
|
hold off;
|
||||||
|
|
||||||
|
fprintf('\nProgram paused. Press enter to continue.\n');
|
||||||
|
pause;
|
||||||
|
|
||||||
|
%% ============== Part 4: Predict and Accuracies ==============
|
||||||
|
% After learning the parameters, you'll like to use it to predict the outcomes
|
||||||
|
% on unseen data. In this part, you will use the logistic regression model
|
||||||
|
% to predict the probability that a student with score 45 on exam 1 and
|
||||||
|
% score 85 on exam 2 will be admitted.
|
||||||
|
%
|
||||||
|
% Furthermore, you will compute the training and test set accuracies of
|
||||||
|
% our model.
|
||||||
|
%
|
||||||
|
% Your task is to complete the code in predict.m
|
||||||
|
|
||||||
|
% Predict probability for a student with score 45 on exam 1
|
||||||
|
% and score 85 on exam 2
|
||||||
|
|
||||||
|
prob = sigmoid([1 45 85] * theta);
|
||||||
|
fprintf(['For a student with scores 45 and 85, we predict an admission ' ...
|
||||||
|
'probability of %f\n\n'], prob);
|
||||||
|
|
||||||
|
% Compute accuracy on our training set
|
||||||
|
p = predict(theta, X);
|
||||||
|
|
||||||
|
fprintf('Train Accuracy: %f\n', mean(double(p == y)) * 100);
|
||||||
|
|
||||||
|
fprintf('\nProgram paused. Press enter to continue.\n');
|
||||||
|
pause;
|
||||||
|
|
||||||
116
machine_learning/mlclass-ex2-008/mlclass-ex2/ex2_reg.m
Normal file
116
machine_learning/mlclass-ex2-008/mlclass-ex2/ex2_reg.m
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
%% Machine Learning Online Class - Exercise 2: Logistic Regression
|
||||||
|
%
|
||||||
|
% Instructions
|
||||||
|
% ------------
|
||||||
|
%
|
||||||
|
% This file contains code that helps you get started on the second part
|
||||||
|
% of the exercise which covers regularization with logistic regression.
|
||||||
|
%
|
||||||
|
% You will need to complete the following functions in this exericse:
|
||||||
|
%
|
||||||
|
% sigmoid.m
|
||||||
|
% costFunction.m
|
||||||
|
% predict.m
|
||||||
|
% costFunctionReg.m
|
||||||
|
%
|
||||||
|
% For this exercise, you will not need to change any code in this file,
|
||||||
|
% or any other files other than those mentioned above.
|
||||||
|
%
|
||||||
|
|
||||||
|
%% Initialization
|
||||||
|
clear ; close all; clc
|
||||||
|
|
||||||
|
%% Load Data
|
||||||
|
% The first two columns contains the X values and the third column
|
||||||
|
% contains the label (y).
|
||||||
|
|
||||||
|
data = load('ex2data2.txt');
|
||||||
|
X = data(:, [1, 2]); y = data(:, 3);
|
||||||
|
|
||||||
|
plotData(X, y);
|
||||||
|
|
||||||
|
% Put some labels
|
||||||
|
hold on;
|
||||||
|
|
||||||
|
% Labels and Legend
|
||||||
|
xlabel('Microchip Test 1')
|
||||||
|
ylabel('Microchip Test 2')
|
||||||
|
|
||||||
|
% Specified in plot order
|
||||||
|
legend('y = 1', 'y = 0')
|
||||||
|
hold off;
|
||||||
|
|
||||||
|
|
||||||
|
%% =========== Part 1: Regularized Logistic Regression ============
|
||||||
|
% In this part, you are given a dataset with data points that are not
|
||||||
|
% linearly separable. However, you would still like to use logistic
|
||||||
|
% regression to classify the data points.
|
||||||
|
%
|
||||||
|
% To do so, you introduce more features to use -- in particular, you add
|
||||||
|
% polynomial features to our data matrix (similar to polynomial
|
||||||
|
% regression).
|
||||||
|
%
|
||||||
|
|
||||||
|
% Add Polynomial Features
|
||||||
|
|
||||||
|
% Note that mapFeature also adds a column of ones for us, so the intercept
|
||||||
|
% term is handled
|
||||||
|
X = mapFeature(X(:,1), X(:,2));
|
||||||
|
|
||||||
|
% Initialize fitting parameters
|
||||||
|
initial_theta = zeros(size(X, 2), 1);
|
||||||
|
|
||||||
|
% Set regularization parameter lambda to 1
|
||||||
|
lambda = 1;
|
||||||
|
|
||||||
|
% Compute and display initial cost and gradient for regularized logistic
|
||||||
|
% regression
|
||||||
|
[cost, grad] = costFunctionReg(initial_theta, X, y, lambda);
|
||||||
|
|
||||||
|
fprintf('Cost at initial theta (zeros): %f\n', cost);
|
||||||
|
|
||||||
|
fprintf('\nProgram paused. Press enter to continue.\n');
|
||||||
|
pause;
|
||||||
|
|
||||||
|
%% ============= Part 2: Regularization and Accuracies =============
|
||||||
|
% Optional Exercise:
|
||||||
|
% In this part, you will get to try different values of lambda and
|
||||||
|
% see how regularization affects the decision coundart
|
||||||
|
%
|
||||||
|
% Try the following values of lambda (0, 1, 10, 100).
|
||||||
|
%
|
||||||
|
% How does the decision boundary change when you vary lambda? How does
|
||||||
|
% the training set accuracy vary?
|
||||||
|
%
|
||||||
|
|
||||||
|
% Initialize fitting parameters
|
||||||
|
initial_theta = zeros(size(X, 2), 1);
|
||||||
|
|
||||||
|
% Set regularization parameter lambda to 1 (you should vary this)
|
||||||
|
lambda = 1;
|
||||||
|
|
||||||
|
% Set Options
|
||||||
|
options = optimset('GradObj', 'on', 'MaxIter', 400);
|
||||||
|
|
||||||
|
% Optimize
|
||||||
|
[theta, J, exit_flag] = ...
|
||||||
|
fminunc(@(t)(costFunctionReg(t, X, y, lambda)), initial_theta, options);
|
||||||
|
|
||||||
|
% Plot Boundary
|
||||||
|
plotDecisionBoundary(theta, X, y);
|
||||||
|
hold on;
|
||||||
|
title(sprintf('lambda = %g', lambda))
|
||||||
|
|
||||||
|
% Labels and Legend
|
||||||
|
xlabel('Microchip Test 1')
|
||||||
|
ylabel('Microchip Test 2')
|
||||||
|
|
||||||
|
legend('y = 1', 'y = 0', 'Decision boundary')
|
||||||
|
hold off;
|
||||||
|
|
||||||
|
% Compute accuracy on our training set
|
||||||
|
p = predict(theta, X);
|
||||||
|
|
||||||
|
fprintf('Train Accuracy: %f\n', mean(double(p == y)) * 100);
|
||||||
|
|
||||||
|
|
||||||
100
machine_learning/mlclass-ex2-008/mlclass-ex2/ex2data1.txt
Normal file
100
machine_learning/mlclass-ex2-008/mlclass-ex2/ex2data1.txt
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
34.62365962451697,78.0246928153624,0
|
||||||
|
30.28671076822607,43.89499752400101,0
|
||||||
|
35.84740876993872,72.90219802708364,0
|
||||||
|
60.18259938620976,86.30855209546826,1
|
||||||
|
79.0327360507101,75.3443764369103,1
|
||||||
|
45.08327747668339,56.3163717815305,0
|
||||||
|
61.10666453684766,96.51142588489624,1
|
||||||
|
75.02474556738889,46.55401354116538,1
|
||||||
|
76.09878670226257,87.42056971926803,1
|
||||||
|
84.43281996120035,43.53339331072109,1
|
||||||
|
95.86155507093572,38.22527805795094,0
|
||||||
|
75.01365838958247,30.60326323428011,0
|
||||||
|
82.30705337399482,76.48196330235604,1
|
||||||
|
69.36458875970939,97.71869196188608,1
|
||||||
|
39.53833914367223,76.03681085115882,0
|
||||||
|
53.9710521485623,89.20735013750205,1
|
||||||
|
69.07014406283025,52.74046973016765,1
|
||||||
|
67.94685547711617,46.67857410673128,0
|
||||||
|
70.66150955499435,92.92713789364831,1
|
||||||
|
76.97878372747498,47.57596364975532,1
|
||||||
|
67.37202754570876,42.83843832029179,0
|
||||||
|
89.67677575072079,65.79936592745237,1
|
||||||
|
50.534788289883,48.85581152764205,0
|
||||||
|
34.21206097786789,44.20952859866288,0
|
||||||
|
77.9240914545704,68.9723599933059,1
|
||||||
|
62.27101367004632,69.95445795447587,1
|
||||||
|
80.1901807509566,44.82162893218353,1
|
||||||
|
93.114388797442,38.80067033713209,0
|
||||||
|
61.83020602312595,50.25610789244621,0
|
||||||
|
38.78580379679423,64.99568095539578,0
|
||||||
|
61.379289447425,72.80788731317097,1
|
||||||
|
85.40451939411645,57.05198397627122,1
|
||||||
|
52.10797973193984,63.12762376881715,0
|
||||||
|
52.04540476831827,69.43286012045222,1
|
||||||
|
40.23689373545111,71.16774802184875,0
|
||||||
|
54.63510555424817,52.21388588061123,0
|
||||||
|
33.91550010906887,98.86943574220611,0
|
||||||
|
64.17698887494485,80.90806058670817,1
|
||||||
|
74.78925295941542,41.57341522824434,0
|
||||||
|
34.1836400264419,75.2377203360134,0
|
||||||
|
83.90239366249155,56.30804621605327,1
|
||||||
|
51.54772026906181,46.85629026349976,0
|
||||||
|
94.44336776917852,65.56892160559052,1
|
||||||
|
82.36875375713919,40.61825515970618,0
|
||||||
|
51.04775177128865,45.82270145776001,0
|
||||||
|
62.22267576120188,52.06099194836679,0
|
||||||
|
77.19303492601364,70.45820000180959,1
|
||||||
|
97.77159928000232,86.7278223300282,1
|
||||||
|
62.07306379667647,96.76882412413983,1
|
||||||
|
91.56497449807442,88.69629254546599,1
|
||||||
|
79.94481794066932,74.16311935043758,1
|
||||||
|
99.2725269292572,60.99903099844988,1
|
||||||
|
90.54671411399852,43.39060180650027,1
|
||||||
|
34.52451385320009,60.39634245837173,0
|
||||||
|
50.2864961189907,49.80453881323059,0
|
||||||
|
49.58667721632031,59.80895099453265,0
|
||||||
|
97.64563396007767,68.86157272420604,1
|
||||||
|
32.57720016809309,95.59854761387875,0
|
||||||
|
74.24869136721598,69.82457122657193,1
|
||||||
|
71.79646205863379,78.45356224515052,1
|
||||||
|
75.3956114656803,85.75993667331619,1
|
||||||
|
35.28611281526193,47.02051394723416,0
|
||||||
|
56.25381749711624,39.26147251058019,0
|
||||||
|
30.05882244669796,49.59297386723685,0
|
||||||
|
44.66826172480893,66.45008614558913,0
|
||||||
|
66.56089447242954,41.09209807936973,0
|
||||||
|
40.45755098375164,97.53518548909936,1
|
||||||
|
49.07256321908844,51.88321182073966,0
|
||||||
|
80.27957401466998,92.11606081344084,1
|
||||||
|
66.74671856944039,60.99139402740988,1
|
||||||
|
32.72283304060323,43.30717306430063,0
|
||||||
|
64.0393204150601,78.03168802018232,1
|
||||||
|
72.34649422579923,96.22759296761404,1
|
||||||
|
60.45788573918959,73.09499809758037,1
|
||||||
|
58.84095621726802,75.85844831279042,1
|
||||||
|
99.82785779692128,72.36925193383885,1
|
||||||
|
47.26426910848174,88.47586499559782,1
|
||||||
|
50.45815980285988,75.80985952982456,1
|
||||||
|
60.45555629271532,42.50840943572217,0
|
||||||
|
82.22666157785568,42.71987853716458,0
|
||||||
|
88.9138964166533,69.80378889835472,1
|
||||||
|
94.83450672430196,45.69430680250754,1
|
||||||
|
67.31925746917527,66.58935317747915,1
|
||||||
|
57.23870631569862,59.51428198012956,1
|
||||||
|
80.36675600171273,90.96014789746954,1
|
||||||
|
68.46852178591112,85.59430710452014,1
|
||||||
|
42.0754545384731,78.84478600148043,0
|
||||||
|
75.47770200533905,90.42453899753964,1
|
||||||
|
78.63542434898018,96.64742716885644,1
|
||||||
|
52.34800398794107,60.76950525602592,0
|
||||||
|
94.09433112516793,77.15910509073893,1
|
||||||
|
90.44855097096364,87.50879176484702,1
|
||||||
|
55.48216114069585,35.57070347228866,0
|
||||||
|
74.49269241843041,84.84513684930135,1
|
||||||
|
89.84580670720979,45.35828361091658,1
|
||||||
|
83.48916274498238,48.38028579728175,1
|
||||||
|
42.2617008099817,87.10385094025457,1
|
||||||
|
99.31500880510394,68.77540947206617,1
|
||||||
|
55.34001756003703,64.9319380069486,1
|
||||||
|
74.77589300092767,89.52981289513276,1
|
||||||
118
machine_learning/mlclass-ex2-008/mlclass-ex2/ex2data2.txt
Normal file
118
machine_learning/mlclass-ex2-008/mlclass-ex2/ex2data2.txt
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
0.051267,0.69956,1
|
||||||
|
-0.092742,0.68494,1
|
||||||
|
-0.21371,0.69225,1
|
||||||
|
-0.375,0.50219,1
|
||||||
|
-0.51325,0.46564,1
|
||||||
|
-0.52477,0.2098,1
|
||||||
|
-0.39804,0.034357,1
|
||||||
|
-0.30588,-0.19225,1
|
||||||
|
0.016705,-0.40424,1
|
||||||
|
0.13191,-0.51389,1
|
||||||
|
0.38537,-0.56506,1
|
||||||
|
0.52938,-0.5212,1
|
||||||
|
0.63882,-0.24342,1
|
||||||
|
0.73675,-0.18494,1
|
||||||
|
0.54666,0.48757,1
|
||||||
|
0.322,0.5826,1
|
||||||
|
0.16647,0.53874,1
|
||||||
|
-0.046659,0.81652,1
|
||||||
|
-0.17339,0.69956,1
|
||||||
|
-0.47869,0.63377,1
|
||||||
|
-0.60541,0.59722,1
|
||||||
|
-0.62846,0.33406,1
|
||||||
|
-0.59389,0.005117,1
|
||||||
|
-0.42108,-0.27266,1
|
||||||
|
-0.11578,-0.39693,1
|
||||||
|
0.20104,-0.60161,1
|
||||||
|
0.46601,-0.53582,1
|
||||||
|
0.67339,-0.53582,1
|
||||||
|
-0.13882,0.54605,1
|
||||||
|
-0.29435,0.77997,1
|
||||||
|
-0.26555,0.96272,1
|
||||||
|
-0.16187,0.8019,1
|
||||||
|
-0.17339,0.64839,1
|
||||||
|
-0.28283,0.47295,1
|
||||||
|
-0.36348,0.31213,1
|
||||||
|
-0.30012,0.027047,1
|
||||||
|
-0.23675,-0.21418,1
|
||||||
|
-0.06394,-0.18494,1
|
||||||
|
0.062788,-0.16301,1
|
||||||
|
0.22984,-0.41155,1
|
||||||
|
0.2932,-0.2288,1
|
||||||
|
0.48329,-0.18494,1
|
||||||
|
0.64459,-0.14108,1
|
||||||
|
0.46025,0.012427,1
|
||||||
|
0.6273,0.15863,1
|
||||||
|
0.57546,0.26827,1
|
||||||
|
0.72523,0.44371,1
|
||||||
|
0.22408,0.52412,1
|
||||||
|
0.44297,0.67032,1
|
||||||
|
0.322,0.69225,1
|
||||||
|
0.13767,0.57529,1
|
||||||
|
-0.0063364,0.39985,1
|
||||||
|
-0.092742,0.55336,1
|
||||||
|
-0.20795,0.35599,1
|
||||||
|
-0.20795,0.17325,1
|
||||||
|
-0.43836,0.21711,1
|
||||||
|
-0.21947,-0.016813,1
|
||||||
|
-0.13882,-0.27266,1
|
||||||
|
0.18376,0.93348,0
|
||||||
|
0.22408,0.77997,0
|
||||||
|
0.29896,0.61915,0
|
||||||
|
0.50634,0.75804,0
|
||||||
|
0.61578,0.7288,0
|
||||||
|
0.60426,0.59722,0
|
||||||
|
0.76555,0.50219,0
|
||||||
|
0.92684,0.3633,0
|
||||||
|
0.82316,0.27558,0
|
||||||
|
0.96141,0.085526,0
|
||||||
|
0.93836,0.012427,0
|
||||||
|
0.86348,-0.082602,0
|
||||||
|
0.89804,-0.20687,0
|
||||||
|
0.85196,-0.36769,0
|
||||||
|
0.82892,-0.5212,0
|
||||||
|
0.79435,-0.55775,0
|
||||||
|
0.59274,-0.7405,0
|
||||||
|
0.51786,-0.5943,0
|
||||||
|
0.46601,-0.41886,0
|
||||||
|
0.35081,-0.57968,0
|
||||||
|
0.28744,-0.76974,0
|
||||||
|
0.085829,-0.75512,0
|
||||||
|
0.14919,-0.57968,0
|
||||||
|
-0.13306,-0.4481,0
|
||||||
|
-0.40956,-0.41155,0
|
||||||
|
-0.39228,-0.25804,0
|
||||||
|
-0.74366,-0.25804,0
|
||||||
|
-0.69758,0.041667,0
|
||||||
|
-0.75518,0.2902,0
|
||||||
|
-0.69758,0.68494,0
|
||||||
|
-0.4038,0.70687,0
|
||||||
|
-0.38076,0.91886,0
|
||||||
|
-0.50749,0.90424,0
|
||||||
|
-0.54781,0.70687,0
|
||||||
|
0.10311,0.77997,0
|
||||||
|
0.057028,0.91886,0
|
||||||
|
-0.10426,0.99196,0
|
||||||
|
-0.081221,1.1089,0
|
||||||
|
0.28744,1.087,0
|
||||||
|
0.39689,0.82383,0
|
||||||
|
0.63882,0.88962,0
|
||||||
|
0.82316,0.66301,0
|
||||||
|
0.67339,0.64108,0
|
||||||
|
1.0709,0.10015,0
|
||||||
|
-0.046659,-0.57968,0
|
||||||
|
-0.23675,-0.63816,0
|
||||||
|
-0.15035,-0.36769,0
|
||||||
|
-0.49021,-0.3019,0
|
||||||
|
-0.46717,-0.13377,0
|
||||||
|
-0.28859,-0.060673,0
|
||||||
|
-0.61118,-0.067982,0
|
||||||
|
-0.66302,-0.21418,0
|
||||||
|
-0.59965,-0.41886,0
|
||||||
|
-0.72638,-0.082602,0
|
||||||
|
-0.83007,0.31213,0
|
||||||
|
-0.72062,0.53874,0
|
||||||
|
-0.59389,0.49488,0
|
||||||
|
-0.48445,0.99927,0
|
||||||
|
-0.0063364,0.99927,0
|
||||||
|
0.63265,-0.030612,0
|
||||||
28
machine_learning/mlclass-ex2-008/mlclass-ex2/findmin.m
Normal file
28
machine_learning/mlclass-ex2-008/mlclass-ex2/findmin.m
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
function [theta,hist] = findmin(CF, X, y, theta, alpha, num_iters)
|
||||||
|
%GRADIENTDESCENTMULTI Performs gradient descent to learn theta
|
||||||
|
% theta = GRADIENTDESCENTMULTI(x, y, theta, alpha, num_iters) updates theta by
|
||||||
|
% taking num_iters gradient steps with learning rate alpha
|
||||||
|
|
||||||
|
hist = zeros(num_iters+1, length(theta));
|
||||||
|
hist(1,:) = theta';
|
||||||
|
|
||||||
|
for iter = 1:num_iters
|
||||||
|
|
||||||
|
% ====================== YOUR CODE HERE ======================
|
||||||
|
% Instructions: Perform a single gradient step on the parameter vector
|
||||||
|
% theta.
|
||||||
|
%
|
||||||
|
% Hint: While debugging, it can be useful to print out the values
|
||||||
|
% of the cost function (computeCostMulti) and gradient here.
|
||||||
|
%
|
||||||
|
|
||||||
|
|
||||||
|
[J,g] = CF( theta, X, y );
|
||||||
|
|
||||||
|
theta = theta - alpha * g;
|
||||||
|
|
||||||
|
hist(iter+1,:) = theta';
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
21
machine_learning/mlclass-ex2-008/mlclass-ex2/mapFeature.m
Normal file
21
machine_learning/mlclass-ex2-008/mlclass-ex2/mapFeature.m
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
function out = mapFeature(X1, X2)
|
||||||
|
% MAPFEATURE Feature mapping function to polynomial features
|
||||||
|
%
|
||||||
|
% MAPFEATURE(X1, X2) maps the two input features
|
||||||
|
% to quadratic features used in the regularization exercise.
|
||||||
|
%
|
||||||
|
% Returns a new feature array with more features, comprising of
|
||||||
|
% X1, X2, X1.^2, X2.^2, X1*X2, X1*X2.^2, etc..
|
||||||
|
%
|
||||||
|
% Inputs X1, X2 must be the same size
|
||||||
|
%
|
||||||
|
|
||||||
|
degree = 6;
|
||||||
|
out = ones(size(X1(:,1)));
|
||||||
|
for i = 1:degree
|
||||||
|
for j = 0:i
|
||||||
|
out(:, end+1) = (X1.^(i-j)).*(X2.^j);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
29
machine_learning/mlclass-ex2-008/mlclass-ex2/plotData.m
Normal file
29
machine_learning/mlclass-ex2-008/mlclass-ex2/plotData.m
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
function plotData(X, y)
|
||||||
|
%PLOTDATA Plots the data points X and y into a new figure
|
||||||
|
% PLOTDATA(x,y) plots the data points with + for the positive examples
|
||||||
|
% and o for the negative examples. X is assumed to be a Mx2 matrix.
|
||||||
|
|
||||||
|
% Create New Figure
|
||||||
|
figure; hold on;
|
||||||
|
|
||||||
|
% ====================== YOUR CODE HERE ======================
|
||||||
|
% Instructions: Plot the positive and negative examples on a
|
||||||
|
% 2D plot, using the option 'k+' for the positive
|
||||||
|
% examples and 'ko' for the negative examples.
|
||||||
|
%
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% =========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
hold off;
|
||||||
|
|
||||||
|
end
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
function plotDecisionBoundary(theta, X, y)
|
||||||
|
%PLOTDECISIONBOUNDARY Plots the data points X and y into a new figure with
|
||||||
|
%the decision boundary defined by theta
|
||||||
|
% PLOTDECISIONBOUNDARY(theta, X,y) plots the data points with + for the
|
||||||
|
% positive examples and o for the negative examples. X is assumed to be
|
||||||
|
% a either
|
||||||
|
% 1) Mx3 matrix, where the first column is an all-ones column for the
|
||||||
|
% intercept.
|
||||||
|
% 2) MxN, N>3 matrix, where the first column is all-ones
|
||||||
|
|
||||||
|
% Plot Data
|
||||||
|
plotData(X(:,2:3), y);
|
||||||
|
hold on
|
||||||
|
|
||||||
|
if size(X, 2) <= 3
|
||||||
|
% Only need 2 points to define a line, so choose two endpoints
|
||||||
|
plot_x = [min(X(:,2))-2, max(X(:,2))+2];
|
||||||
|
|
||||||
|
% Calculate the decision boundary line
|
||||||
|
plot_y = (-1./theta(3)).*(theta(2).*plot_x + theta(1));
|
||||||
|
|
||||||
|
% Plot, and adjust axes for better viewing
|
||||||
|
plot(plot_x, plot_y)
|
||||||
|
|
||||||
|
% Legend, specific for the exercise
|
||||||
|
legend('Admitted', 'Not admitted', 'Decision Boundary')
|
||||||
|
axis([30, 100, 30, 100])
|
||||||
|
else
|
||||||
|
% Here is the grid range
|
||||||
|
u = linspace(-1, 1.5, 50);
|
||||||
|
v = linspace(-1, 1.5, 50);
|
||||||
|
|
||||||
|
z = zeros(length(u), length(v));
|
||||||
|
% Evaluate z = theta*x over the grid
|
||||||
|
for i = 1:length(u)
|
||||||
|
for j = 1:length(v)
|
||||||
|
z(i,j) = mapFeature(u(i), v(j))*theta;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
z = z'; % important to transpose z before calling contour
|
||||||
|
|
||||||
|
% Plot z = 0
|
||||||
|
% Notice you need to specify the range [0, 0]
|
||||||
|
contour(u, v, z, [0, 0], 'LineWidth', 2)
|
||||||
|
end
|
||||||
|
hold off
|
||||||
|
|
||||||
|
end
|
||||||
27
machine_learning/mlclass-ex2-008/mlclass-ex2/predict.m
Normal file
27
machine_learning/mlclass-ex2-008/mlclass-ex2/predict.m
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
function p = predict(theta, X)
|
||||||
|
%PREDICT Predict whether the label is 0 or 1 using learned logistic
|
||||||
|
%regression parameters theta
|
||||||
|
% p = PREDICT(theta, X) computes the predictions for X using a
|
||||||
|
% threshold at 0.5 (i.e., if sigmoid(theta'*x) >= 0.5, predict 1)
|
||||||
|
|
||||||
|
m = size(X, 1); % Number of training examples
|
||||||
|
|
||||||
|
% You need to return the following variables correctly
|
||||||
|
p = zeros(m, 1);
|
||||||
|
|
||||||
|
% ====================== YOUR CODE HERE ======================
|
||||||
|
% Instructions: Complete the following code to make predictions using
|
||||||
|
% your learned logistic regression parameters.
|
||||||
|
% You should set p to a vector of 0's and 1's
|
||||||
|
%
|
||||||
|
|
||||||
|
h = sigmoid( X*theta );
|
||||||
|
p = round(h);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% =========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
19
machine_learning/mlclass-ex2-008/mlclass-ex2/sigmoid.m
Normal file
19
machine_learning/mlclass-ex2-008/mlclass-ex2/sigmoid.m
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
function g = sigmoid(z)
|
||||||
|
%SIGMOID Compute sigmoid functoon
|
||||||
|
% J = SIGMOID(z) computes the sigmoid of z.
|
||||||
|
|
||||||
|
% You need to return the following variables correctly
|
||||||
|
g = zeros(size(z));
|
||||||
|
|
||||||
|
% ====================== YOUR CODE HERE ======================
|
||||||
|
% Instructions: Compute the sigmoid of each value of z (z can be a matrix,
|
||||||
|
% vector or scalar).
|
||||||
|
|
||||||
|
|
||||||
|
g = ones(size(z)) ./ (ones(size(z)) + exp(-1*z));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% =============================================================
|
||||||
|
|
||||||
|
end
|
||||||
574
machine_learning/mlclass-ex2-008/mlclass-ex2/submit.m
Normal file
574
machine_learning/mlclass-ex2-008/mlclass-ex2/submit.m
Normal file
@@ -0,0 +1,574 @@
|
|||||||
|
function submit(partId, webSubmit)
|
||||||
|
%SUBMIT Submit your code and output to the ml-class servers
|
||||||
|
% SUBMIT() will connect to the ml-class server and submit your solution
|
||||||
|
|
||||||
|
fprintf('==\n== [ml-class] Submitting Solutions | Programming Exercise %s\n==\n', ...
|
||||||
|
homework_id());
|
||||||
|
if ~exist('partId', 'var') || isempty(partId)
|
||||||
|
partId = promptPart();
|
||||||
|
end
|
||||||
|
|
||||||
|
if ~exist('webSubmit', 'var') || isempty(webSubmit)
|
||||||
|
webSubmit = 0; % submit directly by default
|
||||||
|
end
|
||||||
|
|
||||||
|
% Check valid partId
|
||||||
|
partNames = validParts();
|
||||||
|
if ~isValidPartId(partId)
|
||||||
|
fprintf('!! Invalid homework part selected.\n');
|
||||||
|
fprintf('!! Expected an integer from 1 to %d.\n', numel(partNames) + 1);
|
||||||
|
fprintf('!! Submission Cancelled\n');
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if ~exist('ml_login_data.mat','file')
|
||||||
|
[login password] = loginPrompt();
|
||||||
|
save('ml_login_data.mat','login','password');
|
||||||
|
else
|
||||||
|
load('ml_login_data.mat');
|
||||||
|
[login password] = quickLogin(login, password);
|
||||||
|
save('ml_login_data.mat','login','password');
|
||||||
|
end
|
||||||
|
|
||||||
|
if isempty(login)
|
||||||
|
fprintf('!! Submission Cancelled\n');
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
fprintf('\n== Connecting to ml-class ... ');
|
||||||
|
if exist('OCTAVE_VERSION')
|
||||||
|
fflush(stdout);
|
||||||
|
end
|
||||||
|
|
||||||
|
% Setup submit list
|
||||||
|
if partId == numel(partNames) + 1
|
||||||
|
submitParts = 1:numel(partNames);
|
||||||
|
else
|
||||||
|
submitParts = [partId];
|
||||||
|
end
|
||||||
|
|
||||||
|
for s = 1:numel(submitParts)
|
||||||
|
thisPartId = submitParts(s);
|
||||||
|
if (~webSubmit) % submit directly to server
|
||||||
|
[login, ch, signature, auxstring] = getChallenge(login, thisPartId);
|
||||||
|
if isempty(login) || isempty(ch) || isempty(signature)
|
||||||
|
% Some error occured, error string in first return element.
|
||||||
|
fprintf('\n!! Error: %s\n\n', login);
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
% Attempt Submission with Challenge
|
||||||
|
ch_resp = challengeResponse(login, password, ch);
|
||||||
|
|
||||||
|
[result, str] = submitSolution(login, ch_resp, thisPartId, ...
|
||||||
|
output(thisPartId, auxstring), source(thisPartId), signature);
|
||||||
|
|
||||||
|
partName = partNames{thisPartId};
|
||||||
|
|
||||||
|
fprintf('\n== [ml-class] Submitted Assignment %s - Part %d - %s\n', ...
|
||||||
|
homework_id(), thisPartId, partName);
|
||||||
|
fprintf('== %s\n', strtrim(str));
|
||||||
|
|
||||||
|
if exist('OCTAVE_VERSION')
|
||||||
|
fflush(stdout);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
[result] = submitSolutionWeb(login, thisPartId, output(thisPartId), ...
|
||||||
|
source(thisPartId));
|
||||||
|
result = base64encode(result);
|
||||||
|
|
||||||
|
fprintf('\nSave as submission file [submit_ex%s_part%d.txt (enter to accept default)]:', ...
|
||||||
|
homework_id(), thisPartId);
|
||||||
|
saveAsFile = input('', 's');
|
||||||
|
if (isempty(saveAsFile))
|
||||||
|
saveAsFile = sprintf('submit_ex%s_part%d.txt', homework_id(), thisPartId);
|
||||||
|
end
|
||||||
|
|
||||||
|
fid = fopen(saveAsFile, 'w');
|
||||||
|
if (fid)
|
||||||
|
fwrite(fid, result);
|
||||||
|
fclose(fid);
|
||||||
|
fprintf('\nSaved your solutions to %s.\n\n', saveAsFile);
|
||||||
|
fprintf(['You can now submit your solutions through the web \n' ...
|
||||||
|
'form in the programming exercises. Select the corresponding \n' ...
|
||||||
|
'programming exercise to access the form.\n']);
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf('Unable to save to %s\n\n', saveAsFile);
|
||||||
|
fprintf(['You can create a submission file by saving the \n' ...
|
||||||
|
'following text in a file: (press enter to continue)\n\n']);
|
||||||
|
pause;
|
||||||
|
fprintf(result);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
% ================== CONFIGURABLES FOR EACH HOMEWORK ==================
|
||||||
|
|
||||||
|
function id = homework_id()
|
||||||
|
id = '2';
|
||||||
|
end
|
||||||
|
|
||||||
|
function [partNames] = validParts()
|
||||||
|
partNames = { 'Sigmoid Function ', ...
|
||||||
|
'Logistic Regression Cost', ...
|
||||||
|
'Logistic Regression Gradient', ...
|
||||||
|
'Predict', ...
|
||||||
|
'Regularized Logistic Regression Cost' ...
|
||||||
|
'Regularized Logistic Regression Gradient' ...
|
||||||
|
};
|
||||||
|
end
|
||||||
|
|
||||||
|
function srcs = sources()
|
||||||
|
% Separated by part
|
||||||
|
srcs = { { 'sigmoid.m' }, ...
|
||||||
|
{ 'costFunction.m' }, ...
|
||||||
|
{ 'costFunction.m' }, ...
|
||||||
|
{ 'predict.m' }, ...
|
||||||
|
{ 'costFunctionReg.m' }, ...
|
||||||
|
{ 'costFunctionReg.m' } };
|
||||||
|
end
|
||||||
|
|
||||||
|
function out = output(partId, auxstring)
|
||||||
|
% Random Test Cases
|
||||||
|
X = [ones(20,1) (exp(1) * sin(1:1:20))' (exp(0.5) * cos(1:1:20))'];
|
||||||
|
y = sin(X(:,1) + X(:,2)) > 0;
|
||||||
|
if partId == 1
|
||||||
|
out = sprintf('%0.5f ', sigmoid(X));
|
||||||
|
elseif partId == 2
|
||||||
|
out = sprintf('%0.5f ', costFunction([0.25 0.5 -0.5]', X, y));
|
||||||
|
elseif partId == 3
|
||||||
|
[cost, grad] = costFunction([0.25 0.5 -0.5]', X, y);
|
||||||
|
out = sprintf('%0.5f ', grad);
|
||||||
|
elseif partId == 4
|
||||||
|
out = sprintf('%0.5f ', predict([0.25 0.5 -0.5]', X));
|
||||||
|
elseif partId == 5
|
||||||
|
out = sprintf('%0.5f ', costFunctionReg([0.25 0.5 -0.5]', X, y, 0.1));
|
||||||
|
elseif partId == 6
|
||||||
|
[cost, grad] = costFunctionReg([0.25 0.5 -0.5]', X, y, 0.1);
|
||||||
|
out = sprintf('%0.5f ', grad);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
% ====================== SERVER CONFIGURATION ===========================
|
||||||
|
|
||||||
|
% ***************** REMOVE -staging WHEN YOU DEPLOY *********************
|
||||||
|
function url = site_url()
|
||||||
|
url = 'http://class.coursera.org/ml-008';
|
||||||
|
end
|
||||||
|
|
||||||
|
function url = challenge_url()
|
||||||
|
url = [site_url() '/assignment/challenge'];
|
||||||
|
end
|
||||||
|
|
||||||
|
function url = submit_url()
|
||||||
|
url = [site_url() '/assignment/submit'];
|
||||||
|
end
|
||||||
|
|
||||||
|
% ========================= CHALLENGE HELPERS =========================
|
||||||
|
|
||||||
|
function src = source(partId)
|
||||||
|
src = '';
|
||||||
|
src_files = sources();
|
||||||
|
if partId <= numel(src_files)
|
||||||
|
flist = src_files{partId};
|
||||||
|
for i = 1:numel(flist)
|
||||||
|
fid = fopen(flist{i});
|
||||||
|
if (fid == -1)
|
||||||
|
error('Error opening %s (is it missing?)', flist{i});
|
||||||
|
end
|
||||||
|
line = fgets(fid);
|
||||||
|
while ischar(line)
|
||||||
|
src = [src line];
|
||||||
|
line = fgets(fid);
|
||||||
|
end
|
||||||
|
fclose(fid);
|
||||||
|
src = [src '||||||||'];
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function ret = isValidPartId(partId)
|
||||||
|
partNames = validParts();
|
||||||
|
ret = (~isempty(partId)) && (partId >= 1) && (partId <= numel(partNames) + 1);
|
||||||
|
end
|
||||||
|
|
||||||
|
function partId = promptPart()
|
||||||
|
fprintf('== Select which part(s) to submit:\n');
|
||||||
|
partNames = validParts();
|
||||||
|
srcFiles = sources();
|
||||||
|
for i = 1:numel(partNames)
|
||||||
|
fprintf('== %d) %s [', i, partNames{i});
|
||||||
|
fprintf(' %s ', srcFiles{i}{:});
|
||||||
|
fprintf(']\n');
|
||||||
|
end
|
||||||
|
fprintf('== %d) All of the above \n==\nEnter your choice [1-%d]: ', ...
|
||||||
|
numel(partNames) + 1, numel(partNames) + 1);
|
||||||
|
selPart = input('', 's');
|
||||||
|
partId = str2num(selPart);
|
||||||
|
if ~isValidPartId(partId)
|
||||||
|
partId = -1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function [email,ch,signature,auxstring] = getChallenge(email, part)
|
||||||
|
str = urlread(challenge_url(), 'post', {'email_address', email, 'assignment_part_sid', [homework_id() '-' num2str(part)], 'response_encoding', 'delim'});
|
||||||
|
|
||||||
|
str = strtrim(str);
|
||||||
|
r = struct;
|
||||||
|
while(numel(str) > 0)
|
||||||
|
[f, str] = strtok (str, '|');
|
||||||
|
[v, str] = strtok (str, '|');
|
||||||
|
r = setfield(r, f, v);
|
||||||
|
end
|
||||||
|
|
||||||
|
email = getfield(r, 'email_address');
|
||||||
|
ch = getfield(r, 'challenge_key');
|
||||||
|
signature = getfield(r, 'state');
|
||||||
|
auxstring = getfield(r, 'challenge_aux_data');
|
||||||
|
end
|
||||||
|
|
||||||
|
function [result, str] = submitSolutionWeb(email, part, output, source)
|
||||||
|
|
||||||
|
result = ['{"assignment_part_sid":"' base64encode([homework_id() '-' num2str(part)], '') '",' ...
|
||||||
|
'"email_address":"' base64encode(email, '') '",' ...
|
||||||
|
'"submission":"' base64encode(output, '') '",' ...
|
||||||
|
'"submission_aux":"' base64encode(source, '') '"' ...
|
||||||
|
'}'];
|
||||||
|
str = 'Web-submission';
|
||||||
|
end
|
||||||
|
|
||||||
|
function [result, str] = submitSolution(email, ch_resp, part, output, ...
|
||||||
|
source, signature)
|
||||||
|
|
||||||
|
params = {'assignment_part_sid', [homework_id() '-' num2str(part)], ...
|
||||||
|
'email_address', email, ...
|
||||||
|
'submission', base64encode(output, ''), ...
|
||||||
|
'submission_aux', base64encode(source, ''), ...
|
||||||
|
'challenge_response', ch_resp, ...
|
||||||
|
'state', signature};
|
||||||
|
|
||||||
|
str = urlread(submit_url(), 'post', params);
|
||||||
|
|
||||||
|
% Parse str to read for success / failure
|
||||||
|
result = 0;
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
% =========================== LOGIN HELPERS ===========================
|
||||||
|
|
||||||
|
function [login password] = loginPrompt()
|
||||||
|
% Prompt for password
|
||||||
|
[login password] = basicPrompt();
|
||||||
|
|
||||||
|
if isempty(login) || isempty(password)
|
||||||
|
login = []; password = [];
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function [login password] = basicPrompt()
|
||||||
|
login = input('Login (Email address): ', 's');
|
||||||
|
password = input('Password: ', 's');
|
||||||
|
end
|
||||||
|
|
||||||
|
function [login password] = quickLogin(login,password)
|
||||||
|
disp(['You are currently logged in as ' login '.']);
|
||||||
|
cont_token = input('Is this you? (y/n - type n to reenter password)','s');
|
||||||
|
if(isempty(cont_token) || cont_token(1)=='Y'||cont_token(1)=='y')
|
||||||
|
return;
|
||||||
|
else
|
||||||
|
[login password] = loginPrompt();
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function [str] = challengeResponse(email, passwd, challenge)
|
||||||
|
str = sha1([challenge passwd]);
|
||||||
|
end
|
||||||
|
|
||||||
|
% =============================== SHA-1 ================================
|
||||||
|
|
||||||
|
function hash = sha1(str)
|
||||||
|
|
||||||
|
% Initialize variables
|
||||||
|
h0 = uint32(1732584193);
|
||||||
|
h1 = uint32(4023233417);
|
||||||
|
h2 = uint32(2562383102);
|
||||||
|
h3 = uint32(271733878);
|
||||||
|
h4 = uint32(3285377520);
|
||||||
|
|
||||||
|
% Convert to word array
|
||||||
|
strlen = numel(str);
|
||||||
|
|
||||||
|
% Break string into chars and append the bit 1 to the message
|
||||||
|
mC = [double(str) 128];
|
||||||
|
mC = [mC zeros(1, 4-mod(numel(mC), 4), 'uint8')];
|
||||||
|
|
||||||
|
numB = strlen * 8;
|
||||||
|
if exist('idivide')
|
||||||
|
numC = idivide(uint32(numB + 65), 512, 'ceil');
|
||||||
|
else
|
||||||
|
numC = ceil(double(numB + 65)/512);
|
||||||
|
end
|
||||||
|
numW = numC * 16;
|
||||||
|
mW = zeros(numW, 1, 'uint32');
|
||||||
|
|
||||||
|
idx = 1;
|
||||||
|
for i = 1:4:strlen + 1
|
||||||
|
mW(idx) = bitor(bitor(bitor( ...
|
||||||
|
bitshift(uint32(mC(i)), 24), ...
|
||||||
|
bitshift(uint32(mC(i+1)), 16)), ...
|
||||||
|
bitshift(uint32(mC(i+2)), 8)), ...
|
||||||
|
uint32(mC(i+3)));
|
||||||
|
idx = idx + 1;
|
||||||
|
end
|
||||||
|
|
||||||
|
% Append length of message
|
||||||
|
mW(numW - 1) = uint32(bitshift(uint64(numB), -32));
|
||||||
|
mW(numW) = uint32(bitshift(bitshift(uint64(numB), 32), -32));
|
||||||
|
|
||||||
|
% Process the message in successive 512-bit chs
|
||||||
|
for cId = 1 : double(numC)
|
||||||
|
cSt = (cId - 1) * 16 + 1;
|
||||||
|
cEnd = cId * 16;
|
||||||
|
ch = mW(cSt : cEnd);
|
||||||
|
|
||||||
|
% Extend the sixteen 32-bit words into eighty 32-bit words
|
||||||
|
for j = 17 : 80
|
||||||
|
ch(j) = ch(j - 3);
|
||||||
|
ch(j) = bitxor(ch(j), ch(j - 8));
|
||||||
|
ch(j) = bitxor(ch(j), ch(j - 14));
|
||||||
|
ch(j) = bitxor(ch(j), ch(j - 16));
|
||||||
|
ch(j) = bitrotate(ch(j), 1);
|
||||||
|
end
|
||||||
|
|
||||||
|
% Initialize hash value for this ch
|
||||||
|
a = h0;
|
||||||
|
b = h1;
|
||||||
|
c = h2;
|
||||||
|
d = h3;
|
||||||
|
e = h4;
|
||||||
|
|
||||||
|
% Main loop
|
||||||
|
for i = 1 : 80
|
||||||
|
if(i >= 1 && i <= 20)
|
||||||
|
f = bitor(bitand(b, c), bitand(bitcmp(b), d));
|
||||||
|
k = uint32(1518500249);
|
||||||
|
elseif(i >= 21 && i <= 40)
|
||||||
|
f = bitxor(bitxor(b, c), d);
|
||||||
|
k = uint32(1859775393);
|
||||||
|
elseif(i >= 41 && i <= 60)
|
||||||
|
f = bitor(bitor(bitand(b, c), bitand(b, d)), bitand(c, d));
|
||||||
|
k = uint32(2400959708);
|
||||||
|
elseif(i >= 61 && i <= 80)
|
||||||
|
f = bitxor(bitxor(b, c), d);
|
||||||
|
k = uint32(3395469782);
|
||||||
|
end
|
||||||
|
|
||||||
|
t = bitrotate(a, 5);
|
||||||
|
t = bitadd(t, f);
|
||||||
|
t = bitadd(t, e);
|
||||||
|
t = bitadd(t, k);
|
||||||
|
t = bitadd(t, ch(i));
|
||||||
|
e = d;
|
||||||
|
d = c;
|
||||||
|
c = bitrotate(b, 30);
|
||||||
|
b = a;
|
||||||
|
a = t;
|
||||||
|
|
||||||
|
end
|
||||||
|
h0 = bitadd(h0, a);
|
||||||
|
h1 = bitadd(h1, b);
|
||||||
|
h2 = bitadd(h2, c);
|
||||||
|
h3 = bitadd(h3, d);
|
||||||
|
h4 = bitadd(h4, e);
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
hash = reshape(dec2hex(double([h0 h1 h2 h3 h4]), 8)', [1 40]);
|
||||||
|
|
||||||
|
hash = lower(hash);
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function ret = bitadd(iA, iB)
|
||||||
|
ret = double(iA) + double(iB);
|
||||||
|
ret = bitset(ret, 33, 0);
|
||||||
|
ret = uint32(ret);
|
||||||
|
end
|
||||||
|
|
||||||
|
function ret = bitrotate(iA, places)
|
||||||
|
t = bitshift(iA, places - 32);
|
||||||
|
ret = bitshift(iA, places);
|
||||||
|
ret = bitor(ret, t);
|
||||||
|
end
|
||||||
|
|
||||||
|
% =========================== Base64 Encoder ============================
|
||||||
|
% Thanks to Peter John Acklam
|
||||||
|
%
|
||||||
|
|
||||||
|
function y = base64encode(x, eol)
|
||||||
|
%BASE64ENCODE Perform base64 encoding on a string.
|
||||||
|
%
|
||||||
|
% BASE64ENCODE(STR, EOL) encode the given string STR. EOL is the line ending
|
||||||
|
% sequence to use; it is optional and defaults to '\n' (ASCII decimal 10).
|
||||||
|
% The returned encoded string is broken into lines of no more than 76
|
||||||
|
% characters each, and each line will end with EOL unless it is empty. Let
|
||||||
|
% EOL be empty if you do not want the encoded string broken into lines.
|
||||||
|
%
|
||||||
|
% STR and EOL don't have to be strings (i.e., char arrays). The only
|
||||||
|
% requirement is that they are vectors containing values in the range 0-255.
|
||||||
|
%
|
||||||
|
% This function may be used to encode strings into the Base64 encoding
|
||||||
|
% specified in RFC 2045 - MIME (Multipurpose Internet Mail Extensions). The
|
||||||
|
% Base64 encoding is designed to represent arbitrary sequences of octets in a
|
||||||
|
% form that need not be humanly readable. A 65-character subset
|
||||||
|
% ([A-Za-z0-9+/=]) of US-ASCII is used, enabling 6 bits to be represented per
|
||||||
|
% printable character.
|
||||||
|
%
|
||||||
|
% Examples
|
||||||
|
% --------
|
||||||
|
%
|
||||||
|
% If you want to encode a large file, you should encode it in chunks that are
|
||||||
|
% a multiple of 57 bytes. This ensures that the base64 lines line up and
|
||||||
|
% that you do not end up with padding in the middle. 57 bytes of data fills
|
||||||
|
% one complete base64 line (76 == 57*4/3):
|
||||||
|
%
|
||||||
|
% If ifid and ofid are two file identifiers opened for reading and writing,
|
||||||
|
% respectively, then you can base64 encode the data with
|
||||||
|
%
|
||||||
|
% while ~feof(ifid)
|
||||||
|
% fwrite(ofid, base64encode(fread(ifid, 60*57)));
|
||||||
|
% end
|
||||||
|
%
|
||||||
|
% or, if you have enough memory,
|
||||||
|
%
|
||||||
|
% fwrite(ofid, base64encode(fread(ifid)));
|
||||||
|
%
|
||||||
|
% See also BASE64DECODE.
|
||||||
|
|
||||||
|
% Author: Peter John Acklam
|
||||||
|
% Time-stamp: 2004-02-03 21:36:56 +0100
|
||||||
|
% E-mail: pjacklam@online.no
|
||||||
|
% URL: http://home.online.no/~pjacklam
|
||||||
|
|
||||||
|
if isnumeric(x)
|
||||||
|
x = num2str(x);
|
||||||
|
end
|
||||||
|
|
||||||
|
% make sure we have the EOL value
|
||||||
|
if nargin < 2
|
||||||
|
eol = sprintf('\n');
|
||||||
|
else
|
||||||
|
if sum(size(eol) > 1) > 1
|
||||||
|
error('EOL must be a vector.');
|
||||||
|
end
|
||||||
|
if any(eol(:) > 255)
|
||||||
|
error('EOL can not contain values larger than 255.');
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if sum(size(x) > 1) > 1
|
||||||
|
error('STR must be a vector.');
|
||||||
|
end
|
||||||
|
|
||||||
|
x = uint8(x);
|
||||||
|
eol = uint8(eol);
|
||||||
|
|
||||||
|
ndbytes = length(x); % number of decoded bytes
|
||||||
|
nchunks = ceil(ndbytes / 3); % number of chunks/groups
|
||||||
|
nebytes = 4 * nchunks; % number of encoded bytes
|
||||||
|
|
||||||
|
% add padding if necessary, to make the length of x a multiple of 3
|
||||||
|
if rem(ndbytes, 3)
|
||||||
|
x(end+1 : 3*nchunks) = 0;
|
||||||
|
end
|
||||||
|
|
||||||
|
x = reshape(x, [3, nchunks]); % reshape the data
|
||||||
|
y = repmat(uint8(0), 4, nchunks); % for the encoded data
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
% Split up every 3 bytes into 4 pieces
|
||||||
|
%
|
||||||
|
% aaaaaabb bbbbcccc ccdddddd
|
||||||
|
%
|
||||||
|
% to form
|
||||||
|
%
|
||||||
|
% 00aaaaaa 00bbbbbb 00cccccc 00dddddd
|
||||||
|
%
|
||||||
|
y(1,:) = bitshift(x(1,:), -2); % 6 highest bits of x(1,:)
|
||||||
|
|
||||||
|
y(2,:) = bitshift(bitand(x(1,:), 3), 4); % 2 lowest bits of x(1,:)
|
||||||
|
y(2,:) = bitor(y(2,:), bitshift(x(2,:), -4)); % 4 highest bits of x(2,:)
|
||||||
|
|
||||||
|
y(3,:) = bitshift(bitand(x(2,:), 15), 2); % 4 lowest bits of x(2,:)
|
||||||
|
y(3,:) = bitor(y(3,:), bitshift(x(3,:), -6)); % 2 highest bits of x(3,:)
|
||||||
|
|
||||||
|
y(4,:) = bitand(x(3,:), 63); % 6 lowest bits of x(3,:)
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
% Now perform the following mapping
|
||||||
|
%
|
||||||
|
% 0 - 25 -> A-Z
|
||||||
|
% 26 - 51 -> a-z
|
||||||
|
% 52 - 61 -> 0-9
|
||||||
|
% 62 -> +
|
||||||
|
% 63 -> /
|
||||||
|
%
|
||||||
|
% We could use a mapping vector like
|
||||||
|
%
|
||||||
|
% ['A':'Z', 'a':'z', '0':'9', '+/']
|
||||||
|
%
|
||||||
|
% but that would require an index vector of class double.
|
||||||
|
%
|
||||||
|
z = repmat(uint8(0), size(y));
|
||||||
|
i = y <= 25; z(i) = 'A' + double(y(i));
|
||||||
|
i = 26 <= y & y <= 51; z(i) = 'a' - 26 + double(y(i));
|
||||||
|
i = 52 <= y & y <= 61; z(i) = '0' - 52 + double(y(i));
|
||||||
|
i = y == 62; z(i) = '+';
|
||||||
|
i = y == 63; z(i) = '/';
|
||||||
|
y = z;
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
% Add padding if necessary.
|
||||||
|
%
|
||||||
|
npbytes = 3 * nchunks - ndbytes; % number of padding bytes
|
||||||
|
if npbytes
|
||||||
|
y(end-npbytes+1 : end) = '='; % '=' is used for padding
|
||||||
|
end
|
||||||
|
|
||||||
|
if isempty(eol)
|
||||||
|
|
||||||
|
% reshape to a row vector
|
||||||
|
y = reshape(y, [1, nebytes]);
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
nlines = ceil(nebytes / 76); % number of lines
|
||||||
|
neolbytes = length(eol); % number of bytes in eol string
|
||||||
|
|
||||||
|
% pad data so it becomes a multiple of 76 elements
|
||||||
|
y = [y(:) ; zeros(76 * nlines - numel(y), 1)];
|
||||||
|
y(nebytes + 1 : 76 * nlines) = 0;
|
||||||
|
y = reshape(y, 76, nlines);
|
||||||
|
|
||||||
|
% insert eol strings
|
||||||
|
eol = eol(:);
|
||||||
|
y(end + 1 : end + neolbytes, :) = eol(:, ones(1, nlines));
|
||||||
|
|
||||||
|
% remove padding, but keep the last eol string
|
||||||
|
m = nebytes + neolbytes * (nlines - 1);
|
||||||
|
n = (76+neolbytes)*nlines - neolbytes;
|
||||||
|
y(m+1 : n) = '';
|
||||||
|
|
||||||
|
% extract and reshape to row vector
|
||||||
|
y = reshape(y, 1, m+neolbytes);
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
% output is a character array
|
||||||
|
y = char(y);
|
||||||
|
|
||||||
|
end
|
||||||
20
machine_learning/mlclass-ex2-008/mlclass-ex2/submitWeb.m
Normal file
20
machine_learning/mlclass-ex2-008/mlclass-ex2/submitWeb.m
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
% submitWeb Creates files from your code and output for web submission.
|
||||||
|
%
|
||||||
|
% If the submit function does not work for you, use the web-submission mechanism.
|
||||||
|
% Call this function to produce a file for the part you wish to submit. Then,
|
||||||
|
% submit the file to the class servers using the "Web Submission" button on the
|
||||||
|
% Programming Exercises page on the course website.
|
||||||
|
%
|
||||||
|
% You should call this function without arguments (submitWeb), to receive
|
||||||
|
% an interactive prompt for submission; optionally you can call it with the partID
|
||||||
|
% if you so wish. Make sure your working directory is set to the directory
|
||||||
|
% containing the submitWeb.m file and your assignment files.
|
||||||
|
|
||||||
|
function submitWeb(partId)
|
||||||
|
if ~exist('partId', 'var') || isempty(partId)
|
||||||
|
partId = [];
|
||||||
|
end
|
||||||
|
|
||||||
|
submit(partId, 1);
|
||||||
|
end
|
||||||
|
|
||||||
BIN
machine_learning/mlclass-ex3-008/ex3.pdf
Normal file
BIN
machine_learning/mlclass-ex3-008/ex3.pdf
Normal file
Binary file not shown.
59
machine_learning/mlclass-ex3-008/mlclass-ex3/displayData.m
Normal file
59
machine_learning/mlclass-ex3-008/mlclass-ex3/displayData.m
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
function [h, display_array] = displayData(X, example_width)
|
||||||
|
%DISPLAYDATA Display 2D data in a nice grid
|
||||||
|
% [h, display_array] = DISPLAYDATA(X, example_width) displays 2D data
|
||||||
|
% stored in X in a nice grid. It returns the figure handle h and the
|
||||||
|
% displayed array if requested.
|
||||||
|
|
||||||
|
% Set example_width automatically if not passed in
|
||||||
|
if ~exist('example_width', 'var') || isempty(example_width)
|
||||||
|
example_width = round(sqrt(size(X, 2)));
|
||||||
|
end
|
||||||
|
|
||||||
|
% Gray Image
|
||||||
|
colormap(gray);
|
||||||
|
|
||||||
|
% Compute rows, cols
|
||||||
|
[m n] = size(X);
|
||||||
|
example_height = (n / example_width);
|
||||||
|
|
||||||
|
% Compute number of items to display
|
||||||
|
display_rows = floor(sqrt(m));
|
||||||
|
display_cols = ceil(m / display_rows);
|
||||||
|
|
||||||
|
% Between images padding
|
||||||
|
pad = 1;
|
||||||
|
|
||||||
|
% Setup blank display
|
||||||
|
display_array = - ones(pad + display_rows * (example_height + pad), ...
|
||||||
|
pad + display_cols * (example_width + pad));
|
||||||
|
|
||||||
|
% Copy each example into a patch on the display array
|
||||||
|
curr_ex = 1;
|
||||||
|
for j = 1:display_rows
|
||||||
|
for i = 1:display_cols
|
||||||
|
if curr_ex > m,
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
% Copy the patch
|
||||||
|
|
||||||
|
% Get the max value of the patch
|
||||||
|
max_val = max(abs(X(curr_ex, :)));
|
||||||
|
display_array(pad + (j - 1) * (example_height + pad) + (1:example_height), ...
|
||||||
|
pad + (i - 1) * (example_width + pad) + (1:example_width)) = ...
|
||||||
|
reshape(X(curr_ex, :), example_height, example_width) / max_val;
|
||||||
|
curr_ex = curr_ex + 1;
|
||||||
|
end
|
||||||
|
if curr_ex > m,
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
% Display Image
|
||||||
|
h = imagesc(display_array, [-1 1]);
|
||||||
|
|
||||||
|
% Do not show axis
|
||||||
|
axis image off
|
||||||
|
|
||||||
|
drawnow;
|
||||||
|
|
||||||
|
end
|
||||||
69
machine_learning/mlclass-ex3-008/mlclass-ex3/ex3.m
Normal file
69
machine_learning/mlclass-ex3-008/mlclass-ex3/ex3.m
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
%% Machine Learning Online Class - Exercise 3 | Part 1: One-vs-all
|
||||||
|
|
||||||
|
% Instructions
|
||||||
|
% ------------
|
||||||
|
%
|
||||||
|
% This file contains code that helps you get started on the
|
||||||
|
% linear exercise. You will need to complete the following functions
|
||||||
|
% in this exericse:
|
||||||
|
%
|
||||||
|
% lrCostFunction.m (logistic regression cost function)
|
||||||
|
% oneVsAll.m
|
||||||
|
% predictOneVsAll.m
|
||||||
|
% predict.m
|
||||||
|
%
|
||||||
|
% For this exercise, you will not need to change any code in this file,
|
||||||
|
% or any other files other than those mentioned above.
|
||||||
|
%
|
||||||
|
|
||||||
|
%% Initialization
|
||||||
|
clear ; close all; clc
|
||||||
|
|
||||||
|
%% Setup the parameters you will use for this part of the exercise
|
||||||
|
input_layer_size = 400; % 20x20 Input Images of Digits
|
||||||
|
num_labels = 10; % 10 labels, from 1 to 10
|
||||||
|
% (note that we have mapped "0" to label 10)
|
||||||
|
|
||||||
|
%% =========== Part 1: Loading and Visualizing Data =============
|
||||||
|
% We start the exercise by first loading and visualizing the dataset.
|
||||||
|
% You will be working with a dataset that contains handwritten digits.
|
||||||
|
%
|
||||||
|
|
||||||
|
% Load Training Data
|
||||||
|
fprintf('Loading and Visualizing Data ...\n')
|
||||||
|
|
||||||
|
load('ex3data1.mat'); % training data stored in arrays X, y
|
||||||
|
m = size(X, 1);
|
||||||
|
|
||||||
|
% Randomly select 100 data points to display
|
||||||
|
rand_indices = randperm(m);
|
||||||
|
sel = X(rand_indices(1:100), :);
|
||||||
|
|
||||||
|
%displayData(sel);
|
||||||
|
|
||||||
|
fprintf('Program paused. Press enter to continue.\n');
|
||||||
|
pause;
|
||||||
|
|
||||||
|
%% ============ Part 2: Vectorize Logistic Regression ============
|
||||||
|
% In this part of the exercise, you will reuse your logistic regression
|
||||||
|
% code from the last exercise. You task here is to make sure that your
|
||||||
|
% regularized logistic regression implementation is vectorized. After
|
||||||
|
% that, you will implement one-vs-all classification for the handwritten
|
||||||
|
% digit dataset.
|
||||||
|
%
|
||||||
|
|
||||||
|
fprintf('\nTraining One-vs-All Logistic Regression...\n')
|
||||||
|
|
||||||
|
lambda = 0.1;
|
||||||
|
[all_theta] = oneVsAll(X, y, num_labels, lambda);
|
||||||
|
|
||||||
|
fprintf('Program paused. Press enter to continue.\n');
|
||||||
|
pause;
|
||||||
|
|
||||||
|
|
||||||
|
%% ================ Part 3: Predict for One-Vs-All ================
|
||||||
|
% After ...
|
||||||
|
pred = predictOneVsAll(all_theta, X);
|
||||||
|
|
||||||
|
fprintf('\nTraining Set Accuracy: %f\n', mean(double(pred == y)) * 100);
|
||||||
|
|
||||||
88
machine_learning/mlclass-ex3-008/mlclass-ex3/ex3_nn.m
Normal file
88
machine_learning/mlclass-ex3-008/mlclass-ex3/ex3_nn.m
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
%% Machine Learning Online Class - Exercise 3 | Part 2: Neural Networks
|
||||||
|
|
||||||
|
% Instructions
|
||||||
|
% ------------
|
||||||
|
%
|
||||||
|
% This file contains code that helps you get started on the
|
||||||
|
% linear exercise. You will need to complete the following functions
|
||||||
|
% in this exericse:
|
||||||
|
%
|
||||||
|
% lrCostFunction.m (logistic regression cost function)
|
||||||
|
% oneVsAll.m
|
||||||
|
% predictOneVsAll.m
|
||||||
|
% predict.m
|
||||||
|
%
|
||||||
|
% For this exercise, you will not need to change any code in this file,
|
||||||
|
% or any other files other than those mentioned above.
|
||||||
|
%
|
||||||
|
|
||||||
|
%% Initialization
|
||||||
|
clear ; close all; clc
|
||||||
|
|
||||||
|
%% Setup the parameters you will use for this exercise
|
||||||
|
input_layer_size = 400; % 20x20 Input Images of Digits
|
||||||
|
hidden_layer_size = 25; % 25 hidden units
|
||||||
|
num_labels = 10; % 10 labels, from 1 to 10
|
||||||
|
% (note that we have mapped "0" to label 10)
|
||||||
|
|
||||||
|
%% =========== Part 1: Loading and Visualizing Data =============
|
||||||
|
% We start the exercise by first loading and visualizing the dataset.
|
||||||
|
% You will be working with a dataset that contains handwritten digits.
|
||||||
|
%
|
||||||
|
|
||||||
|
% Load Training Data
|
||||||
|
fprintf('Loading and Visualizing Data ...\n')
|
||||||
|
|
||||||
|
load('ex3data1.mat');
|
||||||
|
m = size(X, 1);
|
||||||
|
|
||||||
|
% Randomly select 100 data points to display
|
||||||
|
sel = randperm(size(X, 1));
|
||||||
|
sel = sel(1:100);
|
||||||
|
|
||||||
|
displayData(X(sel, :));
|
||||||
|
|
||||||
|
fprintf('Program paused. Press enter to continue.\n');
|
||||||
|
pause;
|
||||||
|
|
||||||
|
%% ================ Part 2: Loading Pameters ================
|
||||||
|
% In this part of the exercise, we load some pre-initialized
|
||||||
|
% neural network parameters.
|
||||||
|
|
||||||
|
fprintf('\nLoading Saved Neural Network Parameters ...\n')
|
||||||
|
|
||||||
|
% Load the weights into variables Theta1 and Theta2
|
||||||
|
load('ex3weights.mat');
|
||||||
|
|
||||||
|
%% ================= Part 3: Implement Predict =================
|
||||||
|
% After training the neural network, we would like to use it to predict
|
||||||
|
% the labels. You will now implement the "predict" function to use the
|
||||||
|
% neural network to predict the labels of the training set. This lets
|
||||||
|
% you compute the training set accuracy.
|
||||||
|
|
||||||
|
pred = predict(Theta1, Theta2, X);
|
||||||
|
|
||||||
|
fprintf('\nTraining Set Accuracy: %f\n', mean(double(pred == y)) * 100);
|
||||||
|
|
||||||
|
fprintf('Program paused. Press enter to continue.\n');
|
||||||
|
pause;
|
||||||
|
|
||||||
|
% To give you an idea of the network's output, you can also run
|
||||||
|
% through the examples one at the a time to see what it is predicting.
|
||||||
|
|
||||||
|
% Randomly permute examples
|
||||||
|
rp = randperm(m);
|
||||||
|
|
||||||
|
for i = 1:m
|
||||||
|
% Display
|
||||||
|
fprintf('\nDisplaying Example Image\n');
|
||||||
|
displayData(X(rp(i), :));
|
||||||
|
|
||||||
|
pred = predict(Theta1, Theta2, X(rp(i),:));
|
||||||
|
fprintf('\nNeural Network Prediction: %d (digit %d)\n', pred, mod(pred, 10));
|
||||||
|
|
||||||
|
% Pause
|
||||||
|
fprintf('Program paused. Press enter to continue.\n');
|
||||||
|
pause;
|
||||||
|
end
|
||||||
|
|
||||||
BIN
machine_learning/mlclass-ex3-008/mlclass-ex3/ex3data1.mat
Normal file
BIN
machine_learning/mlclass-ex3-008/mlclass-ex3/ex3data1.mat
Normal file
Binary file not shown.
BIN
machine_learning/mlclass-ex3-008/mlclass-ex3/ex3weights.mat
Normal file
BIN
machine_learning/mlclass-ex3-008/mlclass-ex3/ex3weights.mat
Normal file
Binary file not shown.
175
machine_learning/mlclass-ex3-008/mlclass-ex3/fmincg.m
Normal file
175
machine_learning/mlclass-ex3-008/mlclass-ex3/fmincg.m
Normal file
@@ -0,0 +1,175 @@
|
|||||||
|
function [X, fX, i] = fmincg(f, X, options, P1, P2, P3, P4, P5)
|
||||||
|
% Minimize a continuous differentialble multivariate function. Starting point
|
||||||
|
% is given by "X" (D by 1), and the function named in the string "f", must
|
||||||
|
% return a function value and a vector of partial derivatives. The Polack-
|
||||||
|
% Ribiere flavour of conjugate gradients is used to compute search directions,
|
||||||
|
% and a line search using quadratic and cubic polynomial approximations and the
|
||||||
|
% Wolfe-Powell stopping criteria is used together with the slope ratio method
|
||||||
|
% for guessing initial step sizes. Additionally a bunch of checks are made to
|
||||||
|
% make sure that exploration is taking place and that extrapolation will not
|
||||||
|
% be unboundedly large. The "length" gives the length of the run: if it is
|
||||||
|
% positive, it gives the maximum number of line searches, if negative its
|
||||||
|
% absolute gives the maximum allowed number of function evaluations. You can
|
||||||
|
% (optionally) give "length" a second component, which will indicate the
|
||||||
|
% reduction in function value to be expected in the first line-search (defaults
|
||||||
|
% to 1.0). The function returns when either its length is up, or if no further
|
||||||
|
% progress can be made (ie, we are at a minimum, or so close that due to
|
||||||
|
% numerical problems, we cannot get any closer). If the function terminates
|
||||||
|
% within a few iterations, it could be an indication that the function value
|
||||||
|
% and derivatives are not consistent (ie, there may be a bug in the
|
||||||
|
% implementation of your "f" function). The function returns the found
|
||||||
|
% solution "X", a vector of function values "fX" indicating the progress made
|
||||||
|
% and "i" the number of iterations (line searches or function evaluations,
|
||||||
|
% depending on the sign of "length") used.
|
||||||
|
%
|
||||||
|
% Usage: [X, fX, i] = fmincg(f, X, options, P1, P2, P3, P4, P5)
|
||||||
|
%
|
||||||
|
% See also: checkgrad
|
||||||
|
%
|
||||||
|
% Copyright (C) 2001 and 2002 by Carl Edward Rasmussen. Date 2002-02-13
|
||||||
|
%
|
||||||
|
%
|
||||||
|
% (C) Copyright 1999, 2000 & 2001, Carl Edward Rasmussen
|
||||||
|
%
|
||||||
|
% Permission is granted for anyone to copy, use, or modify these
|
||||||
|
% programs and accompanying documents for purposes of research or
|
||||||
|
% education, provided this copyright notice is retained, and note is
|
||||||
|
% made of any changes that have been made.
|
||||||
|
%
|
||||||
|
% These programs and documents are distributed without any warranty,
|
||||||
|
% express or implied. As the programs were written for research
|
||||||
|
% purposes only, they have not been tested to the degree that would be
|
||||||
|
% advisable in any important application. All use of these programs is
|
||||||
|
% entirely at the user's own risk.
|
||||||
|
%
|
||||||
|
% [ml-class] Changes Made:
|
||||||
|
% 1) Function name and argument specifications
|
||||||
|
% 2) Output display
|
||||||
|
%
|
||||||
|
|
||||||
|
% Read options
|
||||||
|
if exist('options', 'var') && ~isempty(options) && isfield(options, 'MaxIter')
|
||||||
|
length = options.MaxIter;
|
||||||
|
else
|
||||||
|
length = 100;
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
RHO = 0.01; % a bunch of constants for line searches
|
||||||
|
SIG = 0.5; % RHO and SIG are the constants in the Wolfe-Powell conditions
|
||||||
|
INT = 0.1; % don't reevaluate within 0.1 of the limit of the current bracket
|
||||||
|
EXT = 3.0; % extrapolate maximum 3 times the current bracket
|
||||||
|
MAX = 20; % max 20 function evaluations per line search
|
||||||
|
RATIO = 100; % maximum allowed slope ratio
|
||||||
|
|
||||||
|
argstr = ['feval(f, X']; % compose string used to call function
|
||||||
|
for i = 1:(nargin - 3)
|
||||||
|
argstr = [argstr, ',P', int2str(i)];
|
||||||
|
end
|
||||||
|
argstr = [argstr, ')'];
|
||||||
|
|
||||||
|
if max(size(length)) == 2, red=length(2); length=length(1); else red=1; end
|
||||||
|
S=['Iteration '];
|
||||||
|
|
||||||
|
i = 0; % zero the run length counter
|
||||||
|
ls_failed = 0; % no previous line search has failed
|
||||||
|
fX = [];
|
||||||
|
[f1 df1] = eval(argstr); % get function value and gradient
|
||||||
|
i = i + (length<0); % count epochs?!
|
||||||
|
s = -df1; % search direction is steepest
|
||||||
|
d1 = -s'*s; % this is the slope
|
||||||
|
z1 = red/(1-d1); % initial step is red/(|s|+1)
|
||||||
|
|
||||||
|
while i < abs(length) % while not finished
|
||||||
|
i = i + (length>0); % count iterations?!
|
||||||
|
|
||||||
|
X0 = X; f0 = f1; df0 = df1; % make a copy of current values
|
||||||
|
X = X + z1*s; % begin line search
|
||||||
|
[f2 df2] = eval(argstr);
|
||||||
|
i = i + (length<0); % count epochs?!
|
||||||
|
d2 = df2'*s;
|
||||||
|
f3 = f1; d3 = d1; z3 = -z1; % initialize point 3 equal to point 1
|
||||||
|
if length>0, M = MAX; else M = min(MAX, -length-i); end
|
||||||
|
success = 0; limit = -1; % initialize quanteties
|
||||||
|
while 1
|
||||||
|
while ((f2 > f1+z1*RHO*d1) | (d2 > -SIG*d1)) & (M > 0)
|
||||||
|
limit = z1; % tighten the bracket
|
||||||
|
if f2 > f1
|
||||||
|
z2 = z3 - (0.5*d3*z3*z3)/(d3*z3+f2-f3); % quadratic fit
|
||||||
|
else
|
||||||
|
A = 6*(f2-f3)/z3+3*(d2+d3); % cubic fit
|
||||||
|
B = 3*(f3-f2)-z3*(d3+2*d2);
|
||||||
|
z2 = (sqrt(B*B-A*d2*z3*z3)-B)/A; % numerical error possible - ok!
|
||||||
|
end
|
||||||
|
if isnan(z2) | isinf(z2)
|
||||||
|
z2 = z3/2; % if we had a numerical problem then bisect
|
||||||
|
end
|
||||||
|
z2 = max(min(z2, INT*z3),(1-INT)*z3); % don't accept too close to limits
|
||||||
|
z1 = z1 + z2; % update the step
|
||||||
|
X = X + z2*s;
|
||||||
|
[f2 df2] = eval(argstr);
|
||||||
|
M = M - 1; i = i + (length<0); % count epochs?!
|
||||||
|
d2 = df2'*s;
|
||||||
|
z3 = z3-z2; % z3 is now relative to the location of z2
|
||||||
|
end
|
||||||
|
if f2 > f1+z1*RHO*d1 | d2 > -SIG*d1
|
||||||
|
break; % this is a failure
|
||||||
|
elseif d2 > SIG*d1
|
||||||
|
success = 1; break; % success
|
||||||
|
elseif M == 0
|
||||||
|
break; % failure
|
||||||
|
end
|
||||||
|
A = 6*(f2-f3)/z3+3*(d2+d3); % make cubic extrapolation
|
||||||
|
B = 3*(f3-f2)-z3*(d3+2*d2);
|
||||||
|
z2 = -d2*z3*z3/(B+sqrt(B*B-A*d2*z3*z3)); % num. error possible - ok!
|
||||||
|
if ~isreal(z2) | isnan(z2) | isinf(z2) | z2 < 0 % num prob or wrong sign?
|
||||||
|
if limit < -0.5 % if we have no upper limit
|
||||||
|
z2 = z1 * (EXT-1); % the extrapolate the maximum amount
|
||||||
|
else
|
||||||
|
z2 = (limit-z1)/2; % otherwise bisect
|
||||||
|
end
|
||||||
|
elseif (limit > -0.5) & (z2+z1 > limit) % extraplation beyond max?
|
||||||
|
z2 = (limit-z1)/2; % bisect
|
||||||
|
elseif (limit < -0.5) & (z2+z1 > z1*EXT) % extrapolation beyond limit
|
||||||
|
z2 = z1*(EXT-1.0); % set to extrapolation limit
|
||||||
|
elseif z2 < -z3*INT
|
||||||
|
z2 = -z3*INT;
|
||||||
|
elseif (limit > -0.5) & (z2 < (limit-z1)*(1.0-INT)) % too close to limit?
|
||||||
|
z2 = (limit-z1)*(1.0-INT);
|
||||||
|
end
|
||||||
|
f3 = f2; d3 = d2; z3 = -z2; % set point 3 equal to point 2
|
||||||
|
z1 = z1 + z2; X = X + z2*s; % update current estimates
|
||||||
|
[f2 df2] = eval(argstr);
|
||||||
|
M = M - 1; i = i + (length<0); % count epochs?!
|
||||||
|
d2 = df2'*s;
|
||||||
|
end % end of line search
|
||||||
|
|
||||||
|
if success % if line search succeeded
|
||||||
|
f1 = f2; fX = [fX' f1]';
|
||||||
|
fprintf('%s %4i | Cost: %4.6e\r', S, i, f1);
|
||||||
|
s = (df2'*df2-df1'*df2)/(df1'*df1)*s - df2; % Polack-Ribiere direction
|
||||||
|
tmp = df1; df1 = df2; df2 = tmp; % swap derivatives
|
||||||
|
d2 = df1'*s;
|
||||||
|
if d2 > 0 % new slope must be negative
|
||||||
|
s = -df1; % otherwise use steepest direction
|
||||||
|
d2 = -s'*s;
|
||||||
|
end
|
||||||
|
z1 = z1 * min(RATIO, d1/(d2-realmin)); % slope ratio but max RATIO
|
||||||
|
d1 = d2;
|
||||||
|
ls_failed = 0; % this line search did not fail
|
||||||
|
else
|
||||||
|
X = X0; f1 = f0; df1 = df0; % restore point from before failed line search
|
||||||
|
if ls_failed | i > abs(length) % line search failed twice in a row
|
||||||
|
break; % or we ran out of time, so we give up
|
||||||
|
end
|
||||||
|
tmp = df1; df1 = df2; df2 = tmp; % swap derivatives
|
||||||
|
s = -df1; % try steepest
|
||||||
|
d1 = -s'*s;
|
||||||
|
z1 = 1/(1-d1);
|
||||||
|
ls_failed = 1; % this line search failed
|
||||||
|
end
|
||||||
|
if exist('OCTAVE_VERSION')
|
||||||
|
fflush(stdout);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
fprintf('\n');
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
function [J, grad] = lrCostFunction(theta, X, y, lambda)
|
||||||
|
%LRCOSTFUNCTION Compute cost and gradient for logistic regression with
|
||||||
|
%regularization
|
||||||
|
% J = LRCOSTFUNCTION(theta, X, y, lambda) computes the cost of using
|
||||||
|
% theta as the parameter for regularized logistic regression and the
|
||||||
|
% gradient of the cost w.r.t. to the parameters.
|
||||||
|
|
||||||
|
% Initialize some useful values
|
||||||
|
m = length(y); % number of training examples
|
||||||
|
|
||||||
|
% You need to return the following variables correctly
|
||||||
|
J = 0;
|
||||||
|
grad = zeros(size(theta));
|
||||||
|
|
||||||
|
% ====================== YOUR CODE HERE ======================
|
||||||
|
% Instructions: Compute the cost of a particular choice of theta.
|
||||||
|
% You should set J to the cost.
|
||||||
|
% Compute the partial derivatives and set grad to the partial
|
||||||
|
% derivatives of the cost w.r.t. each parameter in theta
|
||||||
|
%
|
||||||
|
% Hint: The computation of the cost function and gradients can be
|
||||||
|
% efficiently vectorized. For example, consider the computation
|
||||||
|
%
|
||||||
|
% sigmoid(X * theta)
|
||||||
|
%
|
||||||
|
% Each row of the resulting matrix will contain the value of the
|
||||||
|
% prediction for that example. You can make use of this to vectorize
|
||||||
|
% the cost function and gradient computations.
|
||||||
|
%
|
||||||
|
% Hint: When computing the gradient of the regularized cost function,
|
||||||
|
% there're many possible vectorized solutions, but one solution
|
||||||
|
% looks like:
|
||||||
|
% grad = (unregularized gradient for logistic regression)
|
||||||
|
% temp = theta;
|
||||||
|
% temp(1) = 0; % because we don't add anything for j = 0
|
||||||
|
% grad = grad + YOUR_CODE_HERE (using the temp variable)
|
||||||
|
%
|
||||||
|
|
||||||
|
|
||||||
|
h = sigmoid( X*theta );
|
||||||
|
o = ones(size(y));
|
||||||
|
reg = theta;
|
||||||
|
reg(1) = 0;
|
||||||
|
J = sum( y .* log(h) + (o-y) .* log(o-h) ) / (-m) + (lambda/(2*m))*sum(reg.^2);
|
||||||
|
grad = (X'*(h - y)) / m + (lambda/m) * reg;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% =============================================================
|
||||||
|
|
||||||
|
grad = grad(:);
|
||||||
|
|
||||||
|
end
|
||||||
70
machine_learning/mlclass-ex3-008/mlclass-ex3/oneVsAll.m
Normal file
70
machine_learning/mlclass-ex3-008/mlclass-ex3/oneVsAll.m
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
function [all_theta] = oneVsAll(X, y, num_labels, lambda)
|
||||||
|
%ONEVSALL trains multiple logistic regression classifiers and returns all
|
||||||
|
%the classifiers in a matrix all_theta, where the i-th row of all_theta
|
||||||
|
%corresponds to the classifier for label i
|
||||||
|
% [all_theta] = ONEVSALL(X, y, num_labels, lambda) trains num_labels
|
||||||
|
% logisitc regression classifiers and returns each of these classifiers
|
||||||
|
% in a matrix all_theta, where the i-th row of all_theta corresponds
|
||||||
|
% to the classifier for label i
|
||||||
|
|
||||||
|
% Some useful variables
|
||||||
|
m = size(X, 1);
|
||||||
|
n = size(X, 2);
|
||||||
|
|
||||||
|
% You need to return the following variables correctly
|
||||||
|
all_theta = zeros(num_labels, n + 1);
|
||||||
|
|
||||||
|
% Add ones to the X data matrix
|
||||||
|
X = [ones(m, 1) X];
|
||||||
|
|
||||||
|
% ====================== YOUR CODE HERE ======================
|
||||||
|
% Instructions: You should complete the following code to train num_labels
|
||||||
|
% logistic regression classifiers with regularization
|
||||||
|
% parameter lambda.
|
||||||
|
%
|
||||||
|
% Hint: theta(:) will return a column vector.
|
||||||
|
%
|
||||||
|
% Hint: You can use y == c to obtain a vector of 1's and 0's that tell use
|
||||||
|
% whether the ground truth is true/false for this class.
|
||||||
|
%
|
||||||
|
% Note: For this assignment, we recommend using fmincg to optimize the cost
|
||||||
|
% function. It is okay to use a for-loop (for c = 1:num_labels) to
|
||||||
|
% loop over the different classes.
|
||||||
|
%
|
||||||
|
% fmincg works similarly to fminunc, but is more efficient when we
|
||||||
|
% are dealing with large number of parameters.
|
||||||
|
%
|
||||||
|
% Example Code for fmincg:
|
||||||
|
%
|
||||||
|
% % Set Initial theta
|
||||||
|
% initial_theta = zeros(n + 1, 1);
|
||||||
|
%
|
||||||
|
% % Set options for fminunc
|
||||||
|
% options = optimset('GradObj', 'on', 'MaxIter', 50);
|
||||||
|
%
|
||||||
|
% % Run fmincg to obtain the optimal theta
|
||||||
|
% % This function will return theta and the cost
|
||||||
|
% [theta] = ...
|
||||||
|
% fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), ...
|
||||||
|
% initial_theta, options);
|
||||||
|
%
|
||||||
|
|
||||||
|
options = optimset('GradObj', 'on', 'MaxIter', 50);
|
||||||
|
initial_theta = zeros(n + 1, 1);
|
||||||
|
|
||||||
|
for c = 1:num_labels,
|
||||||
|
|
||||||
|
|
||||||
|
theta = fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), initial_theta, options);
|
||||||
|
all_theta(c,:) = theta;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% =========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
33
machine_learning/mlclass-ex3-008/mlclass-ex3/predict.m
Normal file
33
machine_learning/mlclass-ex3-008/mlclass-ex3/predict.m
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
function p = predict(Theta1, Theta2, X)
|
||||||
|
%PREDICT Predict the label of an input given a trained neural network
|
||||||
|
% p = PREDICT(Theta1, Theta2, X) outputs the predicted label of X given the
|
||||||
|
% trained weights of a neural network (Theta1, Theta2)
|
||||||
|
|
||||||
|
% Useful values
|
||||||
|
m = size(X, 1);
|
||||||
|
num_labels = size(Theta2, 1);
|
||||||
|
|
||||||
|
% You need to return the following variables correctly
|
||||||
|
p = zeros(size(X, 1), 1);
|
||||||
|
|
||||||
|
% ====================== YOUR CODE HERE ======================
|
||||||
|
% Instructions: Complete the following code to make predictions using
|
||||||
|
% your learned neural network. You should set p to a
|
||||||
|
% vector containing labels between 1 to num_labels.
|
||||||
|
%
|
||||||
|
% Hint: The max function might come in useful. In particular, the max
|
||||||
|
% function can also return the index of the max element, for more
|
||||||
|
% information see 'help max'. If your examples are in rows, then, you
|
||||||
|
% can use max(A, [], 2) to obtain the max for each row.
|
||||||
|
%
|
||||||
|
|
||||||
|
X = [ones(m, 1) X];
|
||||||
|
a2 = [ones(m,1) sigmoid(X*Theta1')];
|
||||||
|
a3 = sigmoid(a2*Theta2');
|
||||||
|
|
||||||
|
[m, p] = max( a3, [], 2 );
|
||||||
|
|
||||||
|
% =========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
function p = predictOneVsAll(all_theta, X)
|
||||||
|
%PREDICT Predict the label for a trained one-vs-all classifier. The labels
|
||||||
|
%are in the range 1..K, where K = size(all_theta, 1).
|
||||||
|
% p = PREDICTONEVSALL(all_theta, X) will return a vector of predictions
|
||||||
|
% for each example in the matrix X. Note that X contains the examples in
|
||||||
|
% rows. all_theta is a matrix where the i-th row is a trained logistic
|
||||||
|
% regression theta vector for the i-th class. You should set p to a vector
|
||||||
|
% of values from 1..K (e.g., p = [1; 3; 1; 2] predicts classes 1, 3, 1, 2
|
||||||
|
% for 4 examples)
|
||||||
|
|
||||||
|
m = size(X, 1);
|
||||||
|
num_labels = size(all_theta, 1);
|
||||||
|
|
||||||
|
% You need to return the following variables correctly
|
||||||
|
p = zeros(size(X, 1), 1);
|
||||||
|
|
||||||
|
% Add ones to the X data matrix
|
||||||
|
X = [ones(m, 1) X];
|
||||||
|
|
||||||
|
% ====================== YOUR CODE HERE ======================
|
||||||
|
% Instructions: Complete the following code to make predictions using
|
||||||
|
% your learned logistic regression parameters (one-vs-all).
|
||||||
|
% You should set p to a vector of predictions (from 1 to
|
||||||
|
% num_labels).
|
||||||
|
%
|
||||||
|
% Hint: This code can be done all vectorized using the max function.
|
||||||
|
% In particular, the max function can also return the index of the
|
||||||
|
% max element, for more information see 'help max'. If your examples
|
||||||
|
% are in rows, then, you can use max(A, [], 2) to obtain the max
|
||||||
|
% for each row.
|
||||||
|
%
|
||||||
|
|
||||||
|
[m, p] = max( sigmoid( all_theta * X' ) );
|
||||||
|
p = p';
|
||||||
|
|
||||||
|
% =========================================================================
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
6
machine_learning/mlclass-ex3-008/mlclass-ex3/sigmoid.m
Normal file
6
machine_learning/mlclass-ex3-008/mlclass-ex3/sigmoid.m
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
function g = sigmoid(z)
|
||||||
|
%SIGMOID Compute sigmoid functoon
|
||||||
|
% J = SIGMOID(z) computes the sigmoid of z.
|
||||||
|
|
||||||
|
g = 1.0 ./ (1.0 + exp(-z));
|
||||||
|
end
|
||||||
574
machine_learning/mlclass-ex3-008/mlclass-ex3/submit.m
Normal file
574
machine_learning/mlclass-ex3-008/mlclass-ex3/submit.m
Normal file
@@ -0,0 +1,574 @@
|
|||||||
|
function submit(partId, webSubmit)
|
||||||
|
%SUBMIT Submit your code and output to the ml-class servers
|
||||||
|
% SUBMIT() will connect to the ml-class server and submit your solution
|
||||||
|
|
||||||
|
fprintf('==\n== [ml-class] Submitting Solutions | Programming Exercise %s\n==\n', ...
|
||||||
|
homework_id());
|
||||||
|
if ~exist('partId', 'var') || isempty(partId)
|
||||||
|
partId = promptPart();
|
||||||
|
end
|
||||||
|
|
||||||
|
if ~exist('webSubmit', 'var') || isempty(webSubmit)
|
||||||
|
webSubmit = 0; % submit directly by default
|
||||||
|
end
|
||||||
|
|
||||||
|
% Check valid partId
|
||||||
|
partNames = validParts();
|
||||||
|
if ~isValidPartId(partId)
|
||||||
|
fprintf('!! Invalid homework part selected.\n');
|
||||||
|
fprintf('!! Expected an integer from 1 to %d.\n', numel(partNames) + 1);
|
||||||
|
fprintf('!! Submission Cancelled\n');
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if ~exist('ml_login_data.mat','file')
|
||||||
|
[login password] = loginPrompt();
|
||||||
|
save('ml_login_data.mat','login','password');
|
||||||
|
else
|
||||||
|
load('ml_login_data.mat');
|
||||||
|
[login password] = quickLogin(login, password);
|
||||||
|
save('ml_login_data.mat','login','password');
|
||||||
|
end
|
||||||
|
|
||||||
|
if isempty(login)
|
||||||
|
fprintf('!! Submission Cancelled\n');
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
fprintf('\n== Connecting to ml-class ... ');
|
||||||
|
if exist('OCTAVE_VERSION')
|
||||||
|
fflush(stdout);
|
||||||
|
end
|
||||||
|
|
||||||
|
% Setup submit list
|
||||||
|
if partId == numel(partNames) + 1
|
||||||
|
submitParts = 1:numel(partNames);
|
||||||
|
else
|
||||||
|
submitParts = [partId];
|
||||||
|
end
|
||||||
|
|
||||||
|
for s = 1:numel(submitParts)
|
||||||
|
thisPartId = submitParts(s);
|
||||||
|
if (~webSubmit) % submit directly to server
|
||||||
|
[login, ch, signature, auxstring] = getChallenge(login, thisPartId);
|
||||||
|
if isempty(login) || isempty(ch) || isempty(signature)
|
||||||
|
% Some error occured, error string in first return element.
|
||||||
|
fprintf('\n!! Error: %s\n\n', login);
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
% Attempt Submission with Challenge
|
||||||
|
ch_resp = challengeResponse(login, password, ch);
|
||||||
|
|
||||||
|
[result, str] = submitSolution(login, ch_resp, thisPartId, ...
|
||||||
|
output(thisPartId, auxstring), source(thisPartId), signature);
|
||||||
|
|
||||||
|
partName = partNames{thisPartId};
|
||||||
|
|
||||||
|
fprintf('\n== [ml-class] Submitted Assignment %s - Part %d - %s\n', ...
|
||||||
|
homework_id(), thisPartId, partName);
|
||||||
|
fprintf('== %s\n', strtrim(str));
|
||||||
|
|
||||||
|
if exist('OCTAVE_VERSION')
|
||||||
|
fflush(stdout);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
[result] = submitSolutionWeb(login, thisPartId, output(thisPartId), ...
|
||||||
|
source(thisPartId));
|
||||||
|
result = base64encode(result);
|
||||||
|
|
||||||
|
fprintf('\nSave as submission file [submit_ex%s_part%d.txt (enter to accept default)]:', ...
|
||||||
|
homework_id(), thisPartId);
|
||||||
|
saveAsFile = input('', 's');
|
||||||
|
if (isempty(saveAsFile))
|
||||||
|
saveAsFile = sprintf('submit_ex%s_part%d.txt', homework_id(), thisPartId);
|
||||||
|
end
|
||||||
|
|
||||||
|
fid = fopen(saveAsFile, 'w');
|
||||||
|
if (fid)
|
||||||
|
fwrite(fid, result);
|
||||||
|
fclose(fid);
|
||||||
|
fprintf('\nSaved your solutions to %s.\n\n', saveAsFile);
|
||||||
|
fprintf(['You can now submit your solutions through the web \n' ...
|
||||||
|
'form in the programming exercises. Select the corresponding \n' ...
|
||||||
|
'programming exercise to access the form.\n']);
|
||||||
|
|
||||||
|
else
|
||||||
|
fprintf('Unable to save to %s\n\n', saveAsFile);
|
||||||
|
fprintf(['You can create a submission file by saving the \n' ...
|
||||||
|
'following text in a file: (press enter to continue)\n\n']);
|
||||||
|
pause;
|
||||||
|
fprintf(result);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
% ================== CONFIGURABLES FOR EACH HOMEWORK ==================
|
||||||
|
|
||||||
|
function id = homework_id()
|
||||||
|
id = '3';
|
||||||
|
end
|
||||||
|
|
||||||
|
function [partNames] = validParts()
|
||||||
|
partNames = { 'Vectorized Logistic Regression ', ...
|
||||||
|
'One-vs-all classifier training', ...
|
||||||
|
'One-vs-all classifier prediction', ...
|
||||||
|
'Neural network prediction function' ...
|
||||||
|
};
|
||||||
|
end
|
||||||
|
|
||||||
|
function srcs = sources()
|
||||||
|
% Separated by part
|
||||||
|
srcs = { { 'lrCostFunction.m' }, ...
|
||||||
|
{ 'oneVsAll.m' }, ...
|
||||||
|
{ 'predictOneVsAll.m' }, ...
|
||||||
|
{ 'predict.m' } };
|
||||||
|
end
|
||||||
|
|
||||||
|
function out = output(partId, auxdata)
|
||||||
|
% Random Test Cases
|
||||||
|
X = [ones(20,1) (exp(1) * sin(1:1:20))' (exp(0.5) * cos(1:1:20))'];
|
||||||
|
y = sin(X(:,1) + X(:,2)) > 0;
|
||||||
|
Xm = [ -1 -1 ; -1 -2 ; -2 -1 ; -2 -2 ; ...
|
||||||
|
1 1 ; 1 2 ; 2 1 ; 2 2 ; ...
|
||||||
|
-1 1 ; -1 2 ; -2 1 ; -2 2 ; ...
|
||||||
|
1 -1 ; 1 -2 ; -2 -1 ; -2 -2 ];
|
||||||
|
ym = [ 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 ]';
|
||||||
|
t1 = sin(reshape(1:2:24, 4, 3));
|
||||||
|
t2 = cos(reshape(1:2:40, 4, 5));
|
||||||
|
|
||||||
|
if partId == 1
|
||||||
|
[J, grad] = lrCostFunction([0.25 0.5 -0.5]', X, y, 0.1);
|
||||||
|
out = sprintf('%0.5f ', J);
|
||||||
|
out = [out sprintf('%0.5f ', grad)];
|
||||||
|
elseif partId == 2
|
||||||
|
out = sprintf('%0.5f ', oneVsAll(Xm, ym, 4, 0.1));
|
||||||
|
elseif partId == 3
|
||||||
|
out = sprintf('%0.5f ', predictOneVsAll(t1, Xm));
|
||||||
|
elseif partId == 4
|
||||||
|
out = sprintf('%0.5f ', predict(t1, t2, Xm));
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
% ====================== SERVER CONFIGURATION ===========================
|
||||||
|
|
||||||
|
% ***************** REMOVE -staging WHEN YOU DEPLOY *********************
|
||||||
|
function url = site_url()
|
||||||
|
url = 'http://class.coursera.org/ml-008';
|
||||||
|
end
|
||||||
|
|
||||||
|
function url = challenge_url()
|
||||||
|
url = [site_url() '/assignment/challenge'];
|
||||||
|
end
|
||||||
|
|
||||||
|
function url = submit_url()
|
||||||
|
url = [site_url() '/assignment/submit'];
|
||||||
|
end
|
||||||
|
|
||||||
|
% ========================= CHALLENGE HELPERS =========================
|
||||||
|
|
||||||
|
function src = source(partId)
|
||||||
|
src = '';
|
||||||
|
src_files = sources();
|
||||||
|
if partId <= numel(src_files)
|
||||||
|
flist = src_files{partId};
|
||||||
|
for i = 1:numel(flist)
|
||||||
|
fid = fopen(flist{i});
|
||||||
|
if (fid == -1)
|
||||||
|
error('Error opening %s (is it missing?)', flist{i});
|
||||||
|
end
|
||||||
|
line = fgets(fid);
|
||||||
|
while ischar(line)
|
||||||
|
src = [src line];
|
||||||
|
line = fgets(fid);
|
||||||
|
end
|
||||||
|
fclose(fid);
|
||||||
|
src = [src '||||||||'];
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function ret = isValidPartId(partId)
|
||||||
|
partNames = validParts();
|
||||||
|
ret = (~isempty(partId)) && (partId >= 1) && (partId <= numel(partNames) + 1);
|
||||||
|
end
|
||||||
|
|
||||||
|
function partId = promptPart()
|
||||||
|
fprintf('== Select which part(s) to submit:\n');
|
||||||
|
partNames = validParts();
|
||||||
|
srcFiles = sources();
|
||||||
|
for i = 1:numel(partNames)
|
||||||
|
fprintf('== %d) %s [', i, partNames{i});
|
||||||
|
fprintf(' %s ', srcFiles{i}{:});
|
||||||
|
fprintf(']\n');
|
||||||
|
end
|
||||||
|
fprintf('== %d) All of the above \n==\nEnter your choice [1-%d]: ', ...
|
||||||
|
numel(partNames) + 1, numel(partNames) + 1);
|
||||||
|
selPart = input('', 's');
|
||||||
|
partId = str2num(selPart);
|
||||||
|
if ~isValidPartId(partId)
|
||||||
|
partId = -1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function [email,ch,signature,auxstring] = getChallenge(email, part)
|
||||||
|
str = urlread(challenge_url(), 'post', {'email_address', email, 'assignment_part_sid', [homework_id() '-' num2str(part)], 'response_encoding', 'delim'});
|
||||||
|
|
||||||
|
str = strtrim(str);
|
||||||
|
r = struct;
|
||||||
|
while(numel(str) > 0)
|
||||||
|
[f, str] = strtok (str, '|');
|
||||||
|
[v, str] = strtok (str, '|');
|
||||||
|
r = setfield(r, f, v);
|
||||||
|
end
|
||||||
|
|
||||||
|
email = getfield(r, 'email_address');
|
||||||
|
ch = getfield(r, 'challenge_key');
|
||||||
|
signature = getfield(r, 'state');
|
||||||
|
auxstring = getfield(r, 'challenge_aux_data');
|
||||||
|
end
|
||||||
|
|
||||||
|
function [result, str] = submitSolutionWeb(email, part, output, source)
|
||||||
|
|
||||||
|
result = ['{"assignment_part_sid":"' base64encode([homework_id() '-' num2str(part)], '') '",' ...
|
||||||
|
'"email_address":"' base64encode(email, '') '",' ...
|
||||||
|
'"submission":"' base64encode(output, '') '",' ...
|
||||||
|
'"submission_aux":"' base64encode(source, '') '"' ...
|
||||||
|
'}'];
|
||||||
|
str = 'Web-submission';
|
||||||
|
end
|
||||||
|
|
||||||
|
function [result, str] = submitSolution(email, ch_resp, part, output, ...
|
||||||
|
source, signature)
|
||||||
|
|
||||||
|
params = {'assignment_part_sid', [homework_id() '-' num2str(part)], ...
|
||||||
|
'email_address', email, ...
|
||||||
|
'submission', base64encode(output, ''), ...
|
||||||
|
'submission_aux', base64encode(source, ''), ...
|
||||||
|
'challenge_response', ch_resp, ...
|
||||||
|
'state', signature};
|
||||||
|
|
||||||
|
str = urlread(submit_url(), 'post', params);
|
||||||
|
|
||||||
|
% Parse str to read for success / failure
|
||||||
|
result = 0;
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
% =========================== LOGIN HELPERS ===========================
|
||||||
|
|
||||||
|
function [login password] = loginPrompt()
|
||||||
|
% Prompt for password
|
||||||
|
[login password] = basicPrompt();
|
||||||
|
|
||||||
|
if isempty(login) || isempty(password)
|
||||||
|
login = []; password = [];
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function [login password] = basicPrompt()
|
||||||
|
login = input('Login (Email address): ', 's');
|
||||||
|
password = input('Password: ', 's');
|
||||||
|
end
|
||||||
|
|
||||||
|
function [login password] = quickLogin(login,password)
|
||||||
|
disp(['You are currently logged in as ' login '.']);
|
||||||
|
cont_token = input('Is this you? (y/n - type n to reenter password)','s');
|
||||||
|
if(isempty(cont_token) || cont_token(1)=='Y'||cont_token(1)=='y')
|
||||||
|
return;
|
||||||
|
else
|
||||||
|
[login password] = loginPrompt();
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function [str] = challengeResponse(email, passwd, challenge)
|
||||||
|
str = sha1([challenge passwd]);
|
||||||
|
end
|
||||||
|
|
||||||
|
% =============================== SHA-1 ================================
|
||||||
|
|
||||||
|
function hash = sha1(str)
|
||||||
|
|
||||||
|
% Initialize variables
|
||||||
|
h0 = uint32(1732584193);
|
||||||
|
h1 = uint32(4023233417);
|
||||||
|
h2 = uint32(2562383102);
|
||||||
|
h3 = uint32(271733878);
|
||||||
|
h4 = uint32(3285377520);
|
||||||
|
|
||||||
|
% Convert to word array
|
||||||
|
strlen = numel(str);
|
||||||
|
|
||||||
|
% Break string into chars and append the bit 1 to the message
|
||||||
|
mC = [double(str) 128];
|
||||||
|
mC = [mC zeros(1, 4-mod(numel(mC), 4), 'uint8')];
|
||||||
|
|
||||||
|
numB = strlen * 8;
|
||||||
|
if exist('idivide')
|
||||||
|
numC = idivide(uint32(numB + 65), 512, 'ceil');
|
||||||
|
else
|
||||||
|
numC = ceil(double(numB + 65)/512);
|
||||||
|
end
|
||||||
|
numW = numC * 16;
|
||||||
|
mW = zeros(numW, 1, 'uint32');
|
||||||
|
|
||||||
|
idx = 1;
|
||||||
|
for i = 1:4:strlen + 1
|
||||||
|
mW(idx) = bitor(bitor(bitor( ...
|
||||||
|
bitshift(uint32(mC(i)), 24), ...
|
||||||
|
bitshift(uint32(mC(i+1)), 16)), ...
|
||||||
|
bitshift(uint32(mC(i+2)), 8)), ...
|
||||||
|
uint32(mC(i+3)));
|
||||||
|
idx = idx + 1;
|
||||||
|
end
|
||||||
|
|
||||||
|
% Append length of message
|
||||||
|
mW(numW - 1) = uint32(bitshift(uint64(numB), -32));
|
||||||
|
mW(numW) = uint32(bitshift(bitshift(uint64(numB), 32), -32));
|
||||||
|
|
||||||
|
% Process the message in successive 512-bit chs
|
||||||
|
for cId = 1 : double(numC)
|
||||||
|
cSt = (cId - 1) * 16 + 1;
|
||||||
|
cEnd = cId * 16;
|
||||||
|
ch = mW(cSt : cEnd);
|
||||||
|
|
||||||
|
% Extend the sixteen 32-bit words into eighty 32-bit words
|
||||||
|
for j = 17 : 80
|
||||||
|
ch(j) = ch(j - 3);
|
||||||
|
ch(j) = bitxor(ch(j), ch(j - 8));
|
||||||
|
ch(j) = bitxor(ch(j), ch(j - 14));
|
||||||
|
ch(j) = bitxor(ch(j), ch(j - 16));
|
||||||
|
ch(j) = bitrotate(ch(j), 1);
|
||||||
|
end
|
||||||
|
|
||||||
|
% Initialize hash value for this ch
|
||||||
|
a = h0;
|
||||||
|
b = h1;
|
||||||
|
c = h2;
|
||||||
|
d = h3;
|
||||||
|
e = h4;
|
||||||
|
|
||||||
|
% Main loop
|
||||||
|
for i = 1 : 80
|
||||||
|
if(i >= 1 && i <= 20)
|
||||||
|
f = bitor(bitand(b, c), bitand(bitcmp(b), d));
|
||||||
|
k = uint32(1518500249);
|
||||||
|
elseif(i >= 21 && i <= 40)
|
||||||
|
f = bitxor(bitxor(b, c), d);
|
||||||
|
k = uint32(1859775393);
|
||||||
|
elseif(i >= 41 && i <= 60)
|
||||||
|
f = bitor(bitor(bitand(b, c), bitand(b, d)), bitand(c, d));
|
||||||
|
k = uint32(2400959708);
|
||||||
|
elseif(i >= 61 && i <= 80)
|
||||||
|
f = bitxor(bitxor(b, c), d);
|
||||||
|
k = uint32(3395469782);
|
||||||
|
end
|
||||||
|
|
||||||
|
t = bitrotate(a, 5);
|
||||||
|
t = bitadd(t, f);
|
||||||
|
t = bitadd(t, e);
|
||||||
|
t = bitadd(t, k);
|
||||||
|
t = bitadd(t, ch(i));
|
||||||
|
e = d;
|
||||||
|
d = c;
|
||||||
|
c = bitrotate(b, 30);
|
||||||
|
b = a;
|
||||||
|
a = t;
|
||||||
|
|
||||||
|
end
|
||||||
|
h0 = bitadd(h0, a);
|
||||||
|
h1 = bitadd(h1, b);
|
||||||
|
h2 = bitadd(h2, c);
|
||||||
|
h3 = bitadd(h3, d);
|
||||||
|
h4 = bitadd(h4, e);
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
hash = reshape(dec2hex(double([h0 h1 h2 h3 h4]), 8)', [1 40]);
|
||||||
|
|
||||||
|
hash = lower(hash);
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function ret = bitadd(iA, iB)
|
||||||
|
ret = double(iA) + double(iB);
|
||||||
|
ret = bitset(ret, 33, 0);
|
||||||
|
ret = uint32(ret);
|
||||||
|
end
|
||||||
|
|
||||||
|
function ret = bitrotate(iA, places)
|
||||||
|
t = bitshift(iA, places - 32);
|
||||||
|
ret = bitshift(iA, places);
|
||||||
|
ret = bitor(ret, t);
|
||||||
|
end
|
||||||
|
|
||||||
|
% =========================== Base64 Encoder ============================
|
||||||
|
% Thanks to Peter John Acklam
|
||||||
|
%
|
||||||
|
|
||||||
|
function y = base64encode(x, eol)
|
||||||
|
%BASE64ENCODE Perform base64 encoding on a string.
|
||||||
|
%
|
||||||
|
% BASE64ENCODE(STR, EOL) encode the given string STR. EOL is the line ending
|
||||||
|
% sequence to use; it is optional and defaults to '\n' (ASCII decimal 10).
|
||||||
|
% The returned encoded string is broken into lines of no more than 76
|
||||||
|
% characters each, and each line will end with EOL unless it is empty. Let
|
||||||
|
% EOL be empty if you do not want the encoded string broken into lines.
|
||||||
|
%
|
||||||
|
% STR and EOL don't have to be strings (i.e., char arrays). The only
|
||||||
|
% requirement is that they are vectors containing values in the range 0-255.
|
||||||
|
%
|
||||||
|
% This function may be used to encode strings into the Base64 encoding
|
||||||
|
% specified in RFC 2045 - MIME (Multipurpose Internet Mail Extensions). The
|
||||||
|
% Base64 encoding is designed to represent arbitrary sequences of octets in a
|
||||||
|
% form that need not be humanly readable. A 65-character subset
|
||||||
|
% ([A-Za-z0-9+/=]) of US-ASCII is used, enabling 6 bits to be represented per
|
||||||
|
% printable character.
|
||||||
|
%
|
||||||
|
% Examples
|
||||||
|
% --------
|
||||||
|
%
|
||||||
|
% If you want to encode a large file, you should encode it in chunks that are
|
||||||
|
% a multiple of 57 bytes. This ensures that the base64 lines line up and
|
||||||
|
% that you do not end up with padding in the middle. 57 bytes of data fills
|
||||||
|
% one complete base64 line (76 == 57*4/3):
|
||||||
|
%
|
||||||
|
% If ifid and ofid are two file identifiers opened for reading and writing,
|
||||||
|
% respectively, then you can base64 encode the data with
|
||||||
|
%
|
||||||
|
% while ~feof(ifid)
|
||||||
|
% fwrite(ofid, base64encode(fread(ifid, 60*57)));
|
||||||
|
% end
|
||||||
|
%
|
||||||
|
% or, if you have enough memory,
|
||||||
|
%
|
||||||
|
% fwrite(ofid, base64encode(fread(ifid)));
|
||||||
|
%
|
||||||
|
% See also BASE64DECODE.
|
||||||
|
|
||||||
|
% Author: Peter John Acklam
|
||||||
|
% Time-stamp: 2004-02-03 21:36:56 +0100
|
||||||
|
% E-mail: pjacklam@online.no
|
||||||
|
% URL: http://home.online.no/~pjacklam
|
||||||
|
|
||||||
|
if isnumeric(x)
|
||||||
|
x = num2str(x);
|
||||||
|
end
|
||||||
|
|
||||||
|
% make sure we have the EOL value
|
||||||
|
if nargin < 2
|
||||||
|
eol = sprintf('\n');
|
||||||
|
else
|
||||||
|
if sum(size(eol) > 1) > 1
|
||||||
|
error('EOL must be a vector.');
|
||||||
|
end
|
||||||
|
if any(eol(:) > 255)
|
||||||
|
error('EOL can not contain values larger than 255.');
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if sum(size(x) > 1) > 1
|
||||||
|
error('STR must be a vector.');
|
||||||
|
end
|
||||||
|
|
||||||
|
x = uint8(x);
|
||||||
|
eol = uint8(eol);
|
||||||
|
|
||||||
|
ndbytes = length(x); % number of decoded bytes
|
||||||
|
nchunks = ceil(ndbytes / 3); % number of chunks/groups
|
||||||
|
nebytes = 4 * nchunks; % number of encoded bytes
|
||||||
|
|
||||||
|
% add padding if necessary, to make the length of x a multiple of 3
|
||||||
|
if rem(ndbytes, 3)
|
||||||
|
x(end+1 : 3*nchunks) = 0;
|
||||||
|
end
|
||||||
|
|
||||||
|
x = reshape(x, [3, nchunks]); % reshape the data
|
||||||
|
y = repmat(uint8(0), 4, nchunks); % for the encoded data
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
% Split up every 3 bytes into 4 pieces
|
||||||
|
%
|
||||||
|
% aaaaaabb bbbbcccc ccdddddd
|
||||||
|
%
|
||||||
|
% to form
|
||||||
|
%
|
||||||
|
% 00aaaaaa 00bbbbbb 00cccccc 00dddddd
|
||||||
|
%
|
||||||
|
y(1,:) = bitshift(x(1,:), -2); % 6 highest bits of x(1,:)
|
||||||
|
|
||||||
|
y(2,:) = bitshift(bitand(x(1,:), 3), 4); % 2 lowest bits of x(1,:)
|
||||||
|
y(2,:) = bitor(y(2,:), bitshift(x(2,:), -4)); % 4 highest bits of x(2,:)
|
||||||
|
|
||||||
|
y(3,:) = bitshift(bitand(x(2,:), 15), 2); % 4 lowest bits of x(2,:)
|
||||||
|
y(3,:) = bitor(y(3,:), bitshift(x(3,:), -6)); % 2 highest bits of x(3,:)
|
||||||
|
|
||||||
|
y(4,:) = bitand(x(3,:), 63); % 6 lowest bits of x(3,:)
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
% Now perform the following mapping
|
||||||
|
%
|
||||||
|
% 0 - 25 -> A-Z
|
||||||
|
% 26 - 51 -> a-z
|
||||||
|
% 52 - 61 -> 0-9
|
||||||
|
% 62 -> +
|
||||||
|
% 63 -> /
|
||||||
|
%
|
||||||
|
% We could use a mapping vector like
|
||||||
|
%
|
||||||
|
% ['A':'Z', 'a':'z', '0':'9', '+/']
|
||||||
|
%
|
||||||
|
% but that would require an index vector of class double.
|
||||||
|
%
|
||||||
|
z = repmat(uint8(0), size(y));
|
||||||
|
i = y <= 25; z(i) = 'A' + double(y(i));
|
||||||
|
i = 26 <= y & y <= 51; z(i) = 'a' - 26 + double(y(i));
|
||||||
|
i = 52 <= y & y <= 61; z(i) = '0' - 52 + double(y(i));
|
||||||
|
i = y == 62; z(i) = '+';
|
||||||
|
i = y == 63; z(i) = '/';
|
||||||
|
y = z;
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
% Add padding if necessary.
|
||||||
|
%
|
||||||
|
npbytes = 3 * nchunks - ndbytes; % number of padding bytes
|
||||||
|
if npbytes
|
||||||
|
y(end-npbytes+1 : end) = '='; % '=' is used for padding
|
||||||
|
end
|
||||||
|
|
||||||
|
if isempty(eol)
|
||||||
|
|
||||||
|
% reshape to a row vector
|
||||||
|
y = reshape(y, [1, nebytes]);
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
nlines = ceil(nebytes / 76); % number of lines
|
||||||
|
neolbytes = length(eol); % number of bytes in eol string
|
||||||
|
|
||||||
|
% pad data so it becomes a multiple of 76 elements
|
||||||
|
y = [y(:) ; zeros(76 * nlines - numel(y), 1)];
|
||||||
|
y(nebytes + 1 : 76 * nlines) = 0;
|
||||||
|
y = reshape(y, 76, nlines);
|
||||||
|
|
||||||
|
% insert eol strings
|
||||||
|
eol = eol(:);
|
||||||
|
y(end + 1 : end + neolbytes, :) = eol(:, ones(1, nlines));
|
||||||
|
|
||||||
|
% remove padding, but keep the last eol string
|
||||||
|
m = nebytes + neolbytes * (nlines - 1);
|
||||||
|
n = (76+neolbytes)*nlines - neolbytes;
|
||||||
|
y(m+1 : n) = '';
|
||||||
|
|
||||||
|
% extract and reshape to row vector
|
||||||
|
y = reshape(y, 1, m+neolbytes);
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
% output is a character array
|
||||||
|
y = char(y);
|
||||||
|
|
||||||
|
end
|
||||||
20
machine_learning/mlclass-ex3-008/mlclass-ex3/submitWeb.m
Normal file
20
machine_learning/mlclass-ex3-008/mlclass-ex3/submitWeb.m
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
% submitWeb Creates files from your code and output for web submission.
|
||||||
|
%
|
||||||
|
% If the submit function does not work for you, use the web-submission mechanism.
|
||||||
|
% Call this function to produce a file for the part you wish to submit. Then,
|
||||||
|
% submit the file to the class servers using the "Web Submission" button on the
|
||||||
|
% Programming Exercises page on the course website.
|
||||||
|
%
|
||||||
|
% You should call this function without arguments (submitWeb), to receive
|
||||||
|
% an interactive prompt for submission; optionally you can call it with the partID
|
||||||
|
% if you so wish. Make sure your working directory is set to the directory
|
||||||
|
% containing the submitWeb.m file and your assignment files.
|
||||||
|
|
||||||
|
function submitWeb(partId)
|
||||||
|
if ~exist('partId', 'var') || isempty(partId)
|
||||||
|
partId = [];
|
||||||
|
end
|
||||||
|
|
||||||
|
submit(partId, 1);
|
||||||
|
end
|
||||||
|
|
||||||
164
machine_learning/test.m
Normal file
164
machine_learning/test.m
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
%VIM: let g:flags=""
|
||||||
|
%
|
||||||
|
a = 3
|
||||||
|
b = 'hi'
|
||||||
|
b
|
||||||
|
a = pi
|
||||||
|
c = (3 >= 1 )
|
||||||
|
disp(sprintf('2 decimals: %0.2f', a ))
|
||||||
|
format long
|
||||||
|
a
|
||||||
|
format short
|
||||||
|
a
|
||||||
|
|
||||||
|
A = [1 2; 3 4; 5 6] % define matrix
|
||||||
|
v = [1 2 3] % row vector
|
||||||
|
v = [1; 2; 3] % column vector
|
||||||
|
v = 1:0.2:2 % vector from 1 to 2 with 0.2 increments
|
||||||
|
v = 1:6 % vector 1 to 6
|
||||||
|
|
||||||
|
ones(2,3) % matrix of ones
|
||||||
|
2*ones(2,3)
|
||||||
|
zeros(3,1) % matrix of zeros
|
||||||
|
eye(4) % identity matrix
|
||||||
|
rand(2,3) % matrix of random numbers
|
||||||
|
randn(2,3) % matrix of normal distribution random numbers
|
||||||
|
|
||||||
|
w = -6 + sqrt(10)*randn(1,10000)
|
||||||
|
|
||||||
|
hist(w,50) % histogram
|
||||||
|
|
||||||
|
size(A) % sizes of matrix as a row vector
|
||||||
|
size(A,1) % number of rows
|
||||||
|
size(A,2) % number of columns
|
||||||
|
length(v) % length of a matrix
|
||||||
|
|
||||||
|
%load( 'file name' ) % load data from a file
|
||||||
|
|
||||||
|
who % what variables do I have.
|
||||||
|
whos % detailed who
|
||||||
|
|
||||||
|
%v = priceY(1:10)
|
||||||
|
%save savedfile.mat v
|
||||||
|
%save savedfile.mat v -ascii
|
||||||
|
|
||||||
|
clear % remove variables
|
||||||
|
|
||||||
|
A = [1 2; 3 4; 5 6 ]
|
||||||
|
A(3,2) % element on third row and second column
|
||||||
|
A(3,:) % third row
|
||||||
|
A(:,2) % second column
|
||||||
|
|
||||||
|
A([1 3], :) % matrix from 1 and 3 rows
|
||||||
|
A(:,2) = [10; 11; 12] % assign to second column
|
||||||
|
A = [A, [100; 101; 102]] % append to matrix
|
||||||
|
|
||||||
|
B = [ 3 3; 5 6; 6 7]
|
||||||
|
|
||||||
|
C = [ A B ] % append to the right
|
||||||
|
D = [ A; B ] % append at bottom
|
||||||
|
|
||||||
|
A' % transpos
|
||||||
|
A * B' % matrix mul
|
||||||
|
A .* B % element vice mult
|
||||||
|
A .^2 % element vice square
|
||||||
|
|
||||||
|
v = [ 1; 2; 3 ]
|
||||||
|
|
||||||
|
1 ./ v % reciprocal of v
|
||||||
|
1 ./ A
|
||||||
|
|
||||||
|
log(v) % element vice log
|
||||||
|
exp(v)
|
||||||
|
abs(v)
|
||||||
|
-v
|
||||||
|
v + ones(lenght(v), 1)
|
||||||
|
v + 1 % same as of above
|
||||||
|
|
||||||
|
a = [2 3 4 5]
|
||||||
|
max(a) % max element in a
|
||||||
|
[val, ind] = max(a) % val = max elem, ind = the index of elem
|
||||||
|
|
||||||
|
|
||||||
|
a < 3 % elem vice compare
|
||||||
|
find(a < 3)
|
||||||
|
|
||||||
|
A = magic(3)
|
||||||
|
|
||||||
|
[r,c] = find(A>=7)
|
||||||
|
|
||||||
|
sum(a)
|
||||||
|
prod(a)
|
||||||
|
floor(a)
|
||||||
|
ceil(a)
|
||||||
|
|
||||||
|
max( rand(3), rand(3) ) % elem vice max of two 3x3 matrices
|
||||||
|
|
||||||
|
max ( A, [], 1 ) % row vice max
|
||||||
|
max(A) % column vice max
|
||||||
|
|
||||||
|
A = magic(9)
|
||||||
|
|
||||||
|
sum(A,1)
|
||||||
|
|
||||||
|
A .* eye(9)
|
||||||
|
|
||||||
|
sum( sum( A.*eye(9))) % sum of diagonal elements
|
||||||
|
|
||||||
|
flipud( eye(9)) %flip up down
|
||||||
|
|
||||||
|
pinv(A) %pseudo inverse of A
|
||||||
|
|
||||||
|
|
||||||
|
%============================
|
||||||
|
t=[0:0.01:0.98];
|
||||||
|
y1 = sin(2*pi*4*t)
|
||||||
|
plot(t,y1);
|
||||||
|
y2 = cos(2*pi*4*t)
|
||||||
|
plot(t,y1);
|
||||||
|
hold on;
|
||||||
|
plot(t,y1,r);
|
||||||
|
xlabel('time')
|
||||||
|
ylabel('value')
|
||||||
|
legend('sin','cos')
|
||||||
|
title('my plot')
|
||||||
|
print -dpng 'myPlot.png'
|
||||||
|
close
|
||||||
|
|
||||||
|
|
||||||
|
figure(1); plot(t,y1);
|
||||||
|
figure(2); plot(t,y2);
|
||||||
|
subplot(1,2,1);
|
||||||
|
axis
|
||||||
|
|
||||||
|
A= magic(5);
|
||||||
|
imagesc(A);
|
||||||
|
imagesc(A),colorbar,colormap gray;
|
||||||
|
|
||||||
|
%============================
|
||||||
|
v = zero(10,1)
|
||||||
|
for i=1:10,
|
||||||
|
v(i) = 2^i;
|
||||||
|
end;
|
||||||
|
while i <= 5,
|
||||||
|
v(i) = 100;
|
||||||
|
i = i+1;
|
||||||
|
if i == 4, %elseif else
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
%put into a separate file with the same name
|
||||||
|
function y = functionName( x )
|
||||||
|
y = x^2;
|
||||||
|
|
||||||
|
function [y1,y2] = functionName( x )
|
||||||
|
y1 = x^2;
|
||||||
|
y2 = x^3;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
%help eye
|
||||||
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
|
||||||
# Visual Studio 2005
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mergeTwoFiles", "mergeTwoFiles.vcproj", "{F07269AD-FE36-43E5-A832-92D5FC475DE2}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Win32 = Debug|Win32
|
|
||||||
Release|Win32 = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{F07269AD-FE36-43E5-A832-92D5FC475DE2}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{F07269AD-FE36-43E5-A832-92D5FC475DE2}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{F07269AD-FE36-43E5-A832-92D5FC475DE2}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{F07269AD-FE36-43E5-A832-92D5FC475DE2}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
||||||
@@ -1,225 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="windows-1251"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="8.00"
|
|
||||||
Name="mergeTwoFiles"
|
|
||||||
ProjectGUID="{F07269AD-FE36-43E5-A832-92D5FC475DE2}"
|
|
||||||
RootNamespace="mergeTwoFiles"
|
|
||||||
Keyword="Win32Proj"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="2"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="true"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="2"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath=".\mergeTwoFiles.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\stdafx.cpp"
|
|
||||||
>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
UsePrecompiledHeader="1"
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
UsePrecompiledHeader="1"
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath=".\stdafx.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Resource Files"
|
|
||||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
|
|
||||||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
|
|
||||||
>
|
|
||||||
</Filter>
|
|
||||||
<File
|
|
||||||
RelativePath=".\ReadMe.txt"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
// stdafx.cpp : source file that includes just the standard includes
|
|
||||||
// mergeTwoFiles.pch will be the pre-compiled header
|
|
||||||
// stdafx.obj will contain the pre-compiled type information
|
|
||||||
|
|
||||||
#include "stdafx.h"
|
|
||||||
|
|
||||||
// TODO: reference any additional headers you need in STDAFX.H
|
|
||||||
// and not in this file
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
// stdafx.h : include file for standard system include files,
|
|
||||||
// or project specific include files that are used frequently, but
|
|
||||||
// are changed infrequently
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
|
|
||||||
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <tchar.h>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// TODO: reference additional headers your program requires here
|
|
||||||
271
puzzles/bluefruit/roman_numerals.cpp
Normal file
271
puzzles/bluefruit/roman_numerals.cpp
Normal file
@@ -0,0 +1,271 @@
|
|||||||
|
/*
|
||||||
|
VIM: let g:lcppflags="-std=c++11 -O2 -pthread"
|
||||||
|
VIM: let g:wcppflags="/O2 /EHsc /DWIN32"
|
||||||
|
VIM: let g:argv=""
|
||||||
|
|
||||||
|
ID 971852
|
||||||
|
*/
|
||||||
|
#include <iostream>
|
||||||
|
#include <exception>
|
||||||
|
|
||||||
|
/*
|
||||||
|
Given a Roman number as a string (eg "XX") determine
|
||||||
|
its integer value (eg 20).
|
||||||
|
|
||||||
|
You cannot write numerals like IM for 999.
|
||||||
|
Wikipedia states "Modern Roman numerals are written by
|
||||||
|
expressing each digit separately starting with the
|
||||||
|
leftmost digit and skipping any digit with a value of zero."
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
"I" -> 1 | "X" -> 10 | "C" -> 100 | "M" -> 1000
|
||||||
|
"II" -> 2 | "XX" -> 20 | "CC" -> 200 | "MM" -> 2000
|
||||||
|
"III" -> 3 | "XXX" -> 30 | "CCC" -> 300 | "MMM" -> 3000
|
||||||
|
"IV" -> 4 | "XL" -> 40 | "CD" -> 400 | "MMMM" -> 4000
|
||||||
|
"V" -> 5 | "L" -> 50 | "D" -> 500 |
|
||||||
|
"VI" -> 6 | "LX" -> 60 | "DC" -> 600 |
|
||||||
|
"VII" -> 7 | "LXX" -> 70 | "DCC" -> 700 |
|
||||||
|
"VIII" -> 8 | "LXXX" -> 80 | "DCCC" -> 800 |
|
||||||
|
"IX" -> 9 | "XC" -> 90 | "CM" -> 900 |
|
||||||
|
|
||||||
|
"MCMXC" -> 1990 ("M" -> 1000 + "CM" -> 900 + "XC" -> 90)
|
||||||
|
"MMVIII" -> 2008 ("MM" -> 2000 + "VIII" -> 8)
|
||||||
|
"XCIX" -> 99 ("XC" -> 90 + "IX" -> 9)
|
||||||
|
"XLVII" -> 47 ("XL" -> 40 + "VII" -> 7)
|
||||||
|
*/
|
||||||
|
int roman2num( const char * roman_num ) {
|
||||||
|
//
|
||||||
|
// Possible digits.
|
||||||
|
//
|
||||||
|
enum digits { D_I = 0, D_V, D_X, D_L, D_C, D_D, D_M, D_ERR };
|
||||||
|
//
|
||||||
|
// The states of parser. The names of states are quite intuitive. The
|
||||||
|
// vI, lX, dC are the states corresponding to patterns VI+, LX+, DC+
|
||||||
|
// when the first I,X,C letters are seen.
|
||||||
|
//
|
||||||
|
enum states {
|
||||||
|
S = 0, /* START state. */
|
||||||
|
I, vI, II, III, IV, V, IX,
|
||||||
|
X, lX, XX, XXX, XL, L, XC,
|
||||||
|
C, dC, CC, CCC, CD, D, CM,
|
||||||
|
M, MM, MMM, MMMM,
|
||||||
|
E /* ERROR state */
|
||||||
|
};
|
||||||
|
//
|
||||||
|
// This table defines state transition for each character seen.
|
||||||
|
//
|
||||||
|
static const char state_table[][8] = {
|
||||||
|
/* I, V, X, L, C, D, M, D_ERR */
|
||||||
|
{ I, V, X, L, C, D, M, E}, //S
|
||||||
|
|
||||||
|
{ II, IV, IX, E, E, E, E, E}, //I
|
||||||
|
{ II, E, E, E, E, E, E, E}, //vI
|
||||||
|
{III, E, E, E, E, E, E, E}, //II
|
||||||
|
{ E, E, E, E, E, E, E, E}, //III
|
||||||
|
{ E, E, E, E, E, E, E, E}, //IV
|
||||||
|
{ vI, E, E, E, E, E, E, E}, //V
|
||||||
|
{ E, E, E, E, E, E, E, E}, //IX
|
||||||
|
|
||||||
|
{ I, V, XX, XL, XC, E, E, E}, //X
|
||||||
|
{ I, V, XX, E, E, E, E, E}, //lX
|
||||||
|
{ I, V,XXX, E, E, E, E, E}, //XX
|
||||||
|
{ I, V, E, E, E, E, E, E}, //XXX
|
||||||
|
{ I, V, E, E, E, E, E, E}, //XL
|
||||||
|
{ I, V, lX, E, E, E, E, E}, //L
|
||||||
|
{ I, V, E, E, E, E, E, E}, //XC
|
||||||
|
|
||||||
|
{ I, V, X, L, CC, CD, CM, E}, //C
|
||||||
|
{ I, V, X, L, CC, E, E, E}, //dC
|
||||||
|
{ I, V, X, L,CCC, E, E, E}, //CC
|
||||||
|
{ I, V, X, L, E, E, E, E}, //CCC
|
||||||
|
{ I, V, X, L, E, E, E, E}, //CD
|
||||||
|
{ I, V, X, L, dC, E, E, E}, //D
|
||||||
|
{ I, V, X, L, E, E, E, E}, //CM
|
||||||
|
|
||||||
|
{ I, V, X, L, C, D, MM, E}, //M
|
||||||
|
{ I, V, X, L, C, D, MMM, E}, //MM
|
||||||
|
{ I, V, X, L, C, D, MMMM, E}, //MMM
|
||||||
|
{ I, V, X, L, C, D, E, E}, //MMMM
|
||||||
|
|
||||||
|
{ E, E, E, E, E, E, E, E} //E
|
||||||
|
};
|
||||||
|
//
|
||||||
|
// Each state transition causes an increment of the number with
|
||||||
|
// certain value defined in this table.
|
||||||
|
// A state transition happens for each character we read, hence when
|
||||||
|
// defining the increment value of complex states such as II,III,IV,...
|
||||||
|
// please take into consideration what amount increment we already have.
|
||||||
|
// For example the state XL is defined as 30 since we already added 10 when
|
||||||
|
// we see X.
|
||||||
|
//
|
||||||
|
static const short increment[] = {
|
||||||
|
//S This is here to preserve alignment only.
|
||||||
|
0,
|
||||||
|
// I, vI, II, III, IV, V, IX
|
||||||
|
1, 1, 1, 1, 3, 5, 8,
|
||||||
|
// X, lX, XX, XXX, XL, L, XC
|
||||||
|
10, 10, 10, 10, 30, 50, 80,
|
||||||
|
// C, dC, CC, CCC, CD, D, CM,
|
||||||
|
100, 100, 100, 100, 300, 500, 800,
|
||||||
|
// M, MM, MMM, MMMM */
|
||||||
|
1000, 1000, 1000, 1000,
|
||||||
|
//E This is the error condition. The value doesn't really matter.
|
||||||
|
0
|
||||||
|
};
|
||||||
|
//
|
||||||
|
// Ideally this had to be a table based lookup.
|
||||||
|
//
|
||||||
|
auto chr2digit = []( char ch ) {
|
||||||
|
switch (ch) {
|
||||||
|
case 'I' : return D_I;
|
||||||
|
case 'V' : return D_V;
|
||||||
|
case 'X' : return D_X;
|
||||||
|
case 'L' : return D_L;
|
||||||
|
case 'C' : return D_C;
|
||||||
|
case 'D' : return D_D;
|
||||||
|
case 'M' : return D_M;
|
||||||
|
default : return D_ERR;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
//
|
||||||
|
// Here the algorithm begins.
|
||||||
|
//
|
||||||
|
if ( !roman_num )
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
int num = 0;
|
||||||
|
int state = S;
|
||||||
|
for ( const char * e = roman_num; *e && state < E; ++e ) {
|
||||||
|
state = state_table[state][chr2digit(*e)];
|
||||||
|
num += increment[state];
|
||||||
|
}
|
||||||
|
if ( state >= E )
|
||||||
|
return -1;
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ASSERT_EQ( int golden, int ret ) {
|
||||||
|
if ( ret != golden )
|
||||||
|
std::cout << "FAIL: Expected " << golden << " got " << ret << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main ( void )
|
||||||
|
{try{
|
||||||
|
ASSERT_EQ(0, roman2num(""));
|
||||||
|
ASSERT_EQ(1, roman2num("I"));
|
||||||
|
ASSERT_EQ(2, roman2num("II"));
|
||||||
|
ASSERT_EQ(3, roman2num("III"));
|
||||||
|
ASSERT_EQ(4, roman2num("IV"));
|
||||||
|
ASSERT_EQ(5, roman2num("V"));
|
||||||
|
ASSERT_EQ(6, roman2num("VI"));
|
||||||
|
ASSERT_EQ(7, roman2num("VII"));
|
||||||
|
ASSERT_EQ(8, roman2num("VIII"));
|
||||||
|
ASSERT_EQ(9, roman2num("IX"));
|
||||||
|
|
||||||
|
ASSERT_EQ(10, roman2num("X"));
|
||||||
|
ASSERT_EQ(20, roman2num("XX"));
|
||||||
|
ASSERT_EQ(30, roman2num("XXX"));
|
||||||
|
ASSERT_EQ(40, roman2num("XL"));
|
||||||
|
ASSERT_EQ(50, roman2num("L"));
|
||||||
|
ASSERT_EQ(60, roman2num("LX"));
|
||||||
|
ASSERT_EQ(70, roman2num("LXX"));
|
||||||
|
ASSERT_EQ(80, roman2num("LXXX"));
|
||||||
|
ASSERT_EQ(90, roman2num("XC"));
|
||||||
|
|
||||||
|
ASSERT_EQ(100, roman2num("C"));
|
||||||
|
ASSERT_EQ(200, roman2num("CC"));
|
||||||
|
ASSERT_EQ(300, roman2num("CCC"));
|
||||||
|
ASSERT_EQ(400, roman2num("CD"));
|
||||||
|
ASSERT_EQ(500, roman2num("D"));
|
||||||
|
ASSERT_EQ(600, roman2num("DC"));
|
||||||
|
ASSERT_EQ(700, roman2num("DCC"));
|
||||||
|
ASSERT_EQ(800, roman2num("DCCC"));
|
||||||
|
ASSERT_EQ(900, roman2num("CM"));
|
||||||
|
|
||||||
|
ASSERT_EQ(1000, roman2num("M"));
|
||||||
|
ASSERT_EQ(2000, roman2num("MM"));
|
||||||
|
ASSERT_EQ(3000, roman2num("MMM"));
|
||||||
|
ASSERT_EQ(4000, roman2num("MMMM"));
|
||||||
|
|
||||||
|
ASSERT_EQ(1990, roman2num("MCMXC"));
|
||||||
|
ASSERT_EQ(2008, roman2num("MMVIII"));
|
||||||
|
ASSERT_EQ(91, roman2num("XCI"));
|
||||||
|
ASSERT_EQ(99, roman2num("XCIX"));
|
||||||
|
ASSERT_EQ(47, roman2num("XLVII"));
|
||||||
|
ASSERT_EQ(3888, roman2num("MMMDCCCLXXXVIII"));
|
||||||
|
ASSERT_EQ(4888, roman2num("MMMMDCCCLXXXVIII"));
|
||||||
|
ASSERT_EQ(4999, roman2num("MMMMCMXCIX"));
|
||||||
|
|
||||||
|
static const char * num [] = {
|
||||||
|
"","I","II","III","IV","V","VI","VII","VIII","IX",
|
||||||
|
"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC",
|
||||||
|
"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM",
|
||||||
|
"","M","MM","MMM","MMMM"
|
||||||
|
};
|
||||||
|
for ( int i = 0; i < 5000; ++i ) {
|
||||||
|
int d4 = i/1000;
|
||||||
|
int d3 = i%1000/100;
|
||||||
|
int d2 = i%100/10;
|
||||||
|
int d1 = i%10;
|
||||||
|
|
||||||
|
std::string test = num[30+d4];
|
||||||
|
test +=num[20+d3];
|
||||||
|
test +=num[10+d2];
|
||||||
|
test +=num[d1];
|
||||||
|
|
||||||
|
ASSERT_EQ(i, roman2num(test.c_str()));
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Negative cases.
|
||||||
|
//
|
||||||
|
ASSERT_EQ(-1, roman2num(0));
|
||||||
|
ASSERT_EQ(-1, roman2num("IXLVII"));
|
||||||
|
ASSERT_EQ(-1, roman2num("IIII"));
|
||||||
|
ASSERT_EQ(-1, roman2num("VV"));
|
||||||
|
ASSERT_EQ(-1, roman2num("XXXX"));
|
||||||
|
ASSERT_EQ(-1, roman2num("LL"));
|
||||||
|
ASSERT_EQ(-1, roman2num("CCCC"));
|
||||||
|
ASSERT_EQ(-1, roman2num("DD"));
|
||||||
|
ASSERT_EQ(-1, roman2num("MMMMM"));
|
||||||
|
ASSERT_EQ(-1, roman2num("IIV"));
|
||||||
|
ASSERT_EQ(-1, roman2num("IVI"));
|
||||||
|
ASSERT_EQ(-1, roman2num("IIX"));
|
||||||
|
ASSERT_EQ(-1, roman2num("IXI"));
|
||||||
|
ASSERT_EQ(-1, roman2num("XXC"));
|
||||||
|
ASSERT_EQ(-1, roman2num("XCX"));
|
||||||
|
ASSERT_EQ(-1, roman2num("XXL"));
|
||||||
|
ASSERT_EQ(-1, roman2num("XLX"));
|
||||||
|
ASSERT_EQ(-1, roman2num("CCM"));
|
||||||
|
ASSERT_EQ(-1, roman2num("CMC"));
|
||||||
|
ASSERT_EQ(-1, roman2num("CCD"));
|
||||||
|
ASSERT_EQ(-1, roman2num("CDC"));
|
||||||
|
|
||||||
|
ASSERT_EQ(-1, roman2num("c"));
|
||||||
|
ASSERT_EQ(-1, roman2num("l"));
|
||||||
|
ASSERT_EQ(-1, roman2num("x"));
|
||||||
|
ASSERT_EQ(-1, roman2num("v"));
|
||||||
|
ASSERT_EQ(-1, roman2num("v"));
|
||||||
|
ASSERT_EQ(-1, roman2num("v"));
|
||||||
|
ASSERT_EQ(-1, roman2num("v"));
|
||||||
|
ASSERT_EQ(-1, roman2num("1"));
|
||||||
|
ASSERT_EQ(-1, roman2num("2"));
|
||||||
|
ASSERT_EQ(-1, roman2num("a"));
|
||||||
|
ASSERT_EQ(-1, roman2num("."));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
catch ( const std::exception& e )
|
||||||
|
{
|
||||||
|
std::cerr << std::endl
|
||||||
|
<< "std::exception(\"" << e.what() << "\")." << std::endl;
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
catch ( ... )
|
||||||
|
{
|
||||||
|
std::cerr << std::endl
|
||||||
|
<< "unknown exception." << std::endl;
|
||||||
|
return 1;
|
||||||
|
}}
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user