Finished first part of task 1
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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,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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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);
|
||||||
@@ -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;
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
function plot_cost(J)
|
||||||
|
figure(2);
|
||||||
|
|
||||||
|
plot(J);
|
||||||
|
|
||||||
|
xlabel('itarations');
|
||||||
|
ylabel('cost');
|
||||||
|
end
|
||||||
@@ -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
|
||||||
Reference in New Issue
Block a user