commit b9486fc4227c0d3854866d2baa1ad429dd90913f Author: Sam Perry Date: Wed Oct 19 09:33:01 2016 +0100 Finished first part of task 1 diff --git a/calculate_hypothesis.m b/calculate_hypothesis.m new file mode 100644 index 0000000..9532809 --- /dev/null +++ b/calculate_hypothesis.m @@ -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 + diff --git a/compute_cost.m b/compute_cost.m new file mode 100644 index 0000000..5073c25 --- /dev/null +++ b/compute_cost.m @@ -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 \ No newline at end of file diff --git a/compute_cost_regularised.m b/compute_cost_regularised.m new file mode 100644 index 0000000..ab3bff7 --- /dev/null +++ b/compute_cost_regularised.m @@ -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 \ No newline at end of file diff --git a/ex1data1.txt b/ex1data1.txt new file mode 100644 index 0000000..0f88ccb --- /dev/null +++ b/ex1data1.txt @@ -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 diff --git a/ex1data2.txt b/ex1data2.txt new file mode 100644 index 0000000..79e9a80 --- /dev/null +++ b/ex1data2.txt @@ -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 diff --git a/gradient_descent.m b/gradient_descent.m new file mode 100644 index 0000000..de52d57 --- /dev/null +++ b/gradient_descent.m @@ -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 \ No newline at end of file diff --git a/hypothesis_to_vector.m b/hypothesis_to_vector.m new file mode 100644 index 0000000..18e87e2 --- /dev/null +++ b/hypothesis_to_vector.m @@ -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 \ No newline at end of file diff --git a/load_data_ex1.m b/load_data_ex1.m new file mode 100644 index 0000000..a4a8a39 --- /dev/null +++ b/load_data_ex1.m @@ -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 diff --git a/load_data_ex2.m b/load_data_ex2.m new file mode 100644 index 0000000..41c4444 --- /dev/null +++ b/load_data_ex2.m @@ -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 \ No newline at end of file diff --git a/mllab1.m b/mllab1.m new file mode 100644 index 0000000..41e203c --- /dev/null +++ b/mllab1.m @@ -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); \ No newline at end of file diff --git a/mllab2.m b/mllab2.m new file mode 100644 index 0000000..27dbf8b --- /dev/null +++ b/mllab2.m @@ -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; \ No newline at end of file diff --git a/mllab3.m b/mllab3.m new file mode 100644 index 0000000..c1e0822 --- /dev/null +++ b/mllab3.m @@ -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 \ No newline at end of file diff --git a/normalise_features.m b/normalise_features.m new file mode 100644 index 0000000..b58a1a8 --- /dev/null +++ b/normalise_features.m @@ -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 \ No newline at end of file diff --git a/plot_cost.m b/plot_cost.m new file mode 100644 index 0000000..19da4be --- /dev/null +++ b/plot_cost.m @@ -0,0 +1,8 @@ +function plot_cost(J) + figure(2); + + plot(J); + + xlabel('itarations'); + ylabel('cost'); +end \ No newline at end of file diff --git a/plot_hypothesis.m b/plot_hypothesis.m new file mode 100644 index 0000000..0e73979 --- /dev/null +++ b/plot_hypothesis.m @@ -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 \ No newline at end of file