-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlinearRegression.m
85 lines (69 loc) · 2.71 KB
/
linearRegression.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
%% Initialization
clear ; close all; clc
data = load('examples.txt');
X = data(:, 1); y = data(:, 2); % x stores the input features and y stores the output feature
m = length(y); % number of training examples
fprintf('First 10 examples from the dataset: \n');
fprintf(' x = %.0f, y = %.0f \n', [X(1:10,:) y(1:10,:)]');
%% Plotting graph for better visualization
fprintf('Plotting Data ...\n')
figure;
plot (X,y,'rx', 'MarkerSize',10);
xlabel('Profit in $10,000s');
ylabel('Popilation of city in 10.000s');
%% Finding min Jtheta using gradient descent
X = [ones(m, 1), data(:,1)]; % Add a column of ones to x (x[0][j]=1)
theta = zeros(2, 1); % initialize fitting parameters
% Some gradient descent settings
iterations = 1500; % Gradient descent iterations
alpha = 0.01; % Learning rate
fprintf('\nRunning Gradient Descent ...\n')
theta = gradientDescent(X, y, theta, alpha, iterations);
% print theta to screen
fprintf('Theta found by gradient descent:\n');
fprintf('%f\n', theta);
%fprintf('Expected theta values (approx) for the examples.txt dataset\n');
%fprintf(' -3.6303\n 1.1664\n\n');
% 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
% Apply feature scaling for huge data like 35,000
predict1 = [1, 3.5] *theta;
fprintf('For population = 35,000, we predict a profit of %f\n',...
predict1*10000); % Example1
predict2 = [1, 7] * theta;
fprintf('For population = 70,000, we predict a profit of %f\n',...
predict2*10000); % Example2
fprintf('Program paused. Press enter to continue.\n');
pause;
%% PLotting graphs for better visualization
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);