Finished first part of task 1

This commit is contained in:
Sam Perry
2016-10-19 09:33:01 +01:00
commit b9486fc422
15 changed files with 422 additions and 0 deletions
+9
View File
@@ -0,0 +1,9 @@
function hypothesis = calculate_hypothesis(X, theta, training_example)
%CALCULATE_HYPOTHESIS This calculates the hypothesis for a given X,
%theta and specified training example
x0 = X(training_example, 1);
x1 = X(training_example, 2);
hypothesis = theta(1)*x0+theta(2)*x1;
end
+17
View File
@@ -0,0 +1,17 @@
function J = compute_cost(X, y, theta)
%COMPUTE_COST Compute cost for linear regression. Takes as input
%matrix X of training examples, a parameter vector, theta, and an
%output vector y
J = 0.0; %cost
m = size(y, 1); %number of training examples
for i = 1:m
hypothesis = calculate_hypothesis(X, theta, i);
output = y(i);
squared_error = (hypothesis - output) ^ 2;
J = J + squared_error;
end
J = J * (1.0 / (2 * m));
end
+25
View File
@@ -0,0 +1,25 @@
function J = compute_cost_regularised(X, y, theta, l)
%COMPUTE_COST_REGULARISED Compute cost for regularised linear regression.
%Takes as input matrix X of training examples, a parameter vector, theta,
%lambda (l) and an output vector y
total_squared_error = 0.0; %cost
m = size(y, 1); %number of training examples
for i = 1:m
hypothesis = calculate_hypothesis(X, theta, i);
output = y(i);
squared_error = (hypothesis - output) ^ 2;
total_squared_error = total_squared_error + squared_error;
end
total_regularised_error = 0.0;
for i = 2:length(theta)
total_regularised_error = total_regularised_error + theta(i) ^ 2;
end
total_regularised_error = total_regularised_error * l;
J = (1.0 / (2 * m)) * (total_squared_error + total_regularised_error);
end
+97
View 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
View 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
+71
View File
@@ -0,0 +1,71 @@
function theta = gradient_descent(X, y, theta, alpha, iterations, do_plot)
%GRADIENT_DESCENT do Gradient Descent for a given X, y, theta, alpha
%for a specified number of iterations
%if less than 6 arguments was given, then set do_plot to be false
if nargin < 6
do_plot = false;
end
if(do_plot)
plot_hypothesis(X, y, theta);
drawnow; pause(0.1);
end
m = size(X, 1); %number of training examples
cost_vector = []; %will store the results of our cost function
for it = 1:iterations
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% gradient descent
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
theta_0 = theta(1);
theta_1 = theta(2);
%update theta(1) and store in temporary variable theta_0
sigma = 0.0;
for i = 1:m
hypothesis = X(i, 1) * theta(1) + X(i, 2) * theta(2);
output = y(i);
sigma = sigma + (hypothesis - output);
end
theta_0 = theta_0 - ((alpha * 1.0) / m) * sigma;
%update theta(2) and store in temporary variable theta_1
sigma = 0.0;
for i = 1:m
hypothesis = X(i, 1) * theta(1) + X(i, 2) * theta(2);
output = y(i);
sigma = sigma + (hypothesis - output) * X(i, 2);
end
theta_1 = theta_1 - ((alpha * 1.0) / m) * sigma;
%update theta
theta = [theta_0, theta_1];
%update cost_vector
cost_vector = [cost_vector; compute_cost(X, y, theta)];
if do_plot
plot_hypothesis(X, y, theta);
drawnow; pause(0.1);
end
end
disp 'Gradient descent is finished.'
if do_plot
disp 'Press enter!'
pause;
end
plot_cost(cost_vector);
disp 'Press enter!';
pause;
end
+7
View File
@@ -0,0 +1,7 @@
function hypothesis_vec = hypothesis_to_vector(X, theta)
hypothesis_vec = [];
for i = 1:size(X, 1)
hypothesis_vec = [hypothesis_vec; calculate_hypothesis(X, theta, i)];
end
end
+14
View File
@@ -0,0 +1,14 @@
function [X, y] = load_data_ex1()
%loads the data for excercise 1
%read our data from a text file
data = dlmread('ex1data1.txt');
%load from the first column into X
X = data(:, 1);
%load from the second column into y
y = data(:, 2);
%add 1 to the input vector
X = [ones(size(X, 1), 1), X];
end
+11
View File
@@ -0,0 +1,11 @@
function [X, y] = load_data_ex2()
%loads the data for excercise 2
%read our data from a text file
data = dlmread('ex1data2.txt');
%load from the first two columns into X
X = data(:, 1:2);
%load from the third column into y
y = data(:, 3);
end
+14
View File
@@ -0,0 +1,14 @@
%% This loads our data
[X, y] = load_data_ex1();
%% initialize
theta = [0.0, 0.0]; %The weights of our model.
alpha = 0.01; %The step size for gradient descent.
iterations = 50;
%do plotting
do_plot = true;
%% run gradient descent
t = gradient_descent(X, y, theta, alpha, iterations, do_plot);
+18
View File
@@ -0,0 +1,18 @@
%% This loads our data
[X, y] = load_data_ex2();
%% Normalise and initialize.
[X, mean_vec, std_vec] = normalise_features(X);
%after normalising we add the bias
X = [ones(size(X, 1), 1), X];
%initialise theta
theta = [0.0, 0.0, 0.0];
alpha = 0.1;
iterations = 100;
%%
t = gradient_descent(X, y, theta, alpha, iterations);
disp 'Press enter to exit!';
pause;
+60
View File
@@ -0,0 +1,60 @@
function mllab3()
% load input data
X = [-0.99768; -0.69574; -0.40373; -0.10236; 0.22024; 0.47742; 0.82229];
% load output data
y = [2.0885; 1.1646; 0.3287; 0.46013; 0.44808; 0.10013; -0.32952];
% insert the bias into the input data
X = [ones(size(X, 1), 1), X];
% perform a polynomial expansion to the fifth order
for j = 2:5
X = [X, X(:, 2) .^ j];
end
% initialise theta
theta = [1.0, 1.0, 1.0, 1.0, 1.0];
alpha = 0.01;
l = 0.0;
iterations = 1000;
do_plot = false;
% run gradient descent
% you will need to modify the gradient_descent function to accept an
% additional argument lambda (l).
theta = gradient_descent(X, y, theta, alpha, iterations, l, do_plot)
% plot the original data
original_x = [-0.99768; -0.69574; -0.40373; -0.10236; 0.22024; 0.47742; 0.82229];
figure(1);
plot(original_x, y, 'x');
hold on;
x = linspace(-1, 1, 1000);
y = [];
for index = 1:1000
y = [y, get_hypothesis(x(index), theta)];
end
plot(x, y,'-');
disp 'Press enter to exit.';
pause;
close(1);
end
function hypothesis = get_hypothesis(x, theta)
% helper function which we will use to calculate the
% hypothesis for a given x and theta
hypothesis = 0.0;
for t = 1:length(theta)
hypothesis = hypothesis + theta(t) * (x ^ (t - 1));
end
end
+14
View File
@@ -0,0 +1,14 @@
function [N, mean_vector, std_vector] = normalise_features(X)
%NORMALISE_FEATURES Normalise our features by subtracting the mean and
%dividing by the standard deviation
num_rows = size(X, 1);
mean_vector = mean(X);
std_vector = std(X);
%subtract column mean
N = X - ones(num_rows, 1) * mean_vector;
%divide each element by column standard deviation
N = N ./ (ones(num_rows, 1) * std_vector);
end
+8
View File
@@ -0,0 +1,8 @@
function plot_cost(J)
figure(2);
plot(J);
xlabel('itarations');
ylabel('cost');
end
+10
View File
@@ -0,0 +1,10 @@
function plot_hypothesis(X, y, theta)
figure(1);
clf(1);
plot(X(:, 2), y, 'rx');
hold on;
plot(X(:, 2), hypothesis_to_vector(X, theta));
xlabel('x'); ylabel('y=f(x)');
end