Coursera-MachineLearning-LinearRegression

Coursera機器學習-吳恩達
Octave 代碼

% 1.用圖表展示數據:

data = load('ex1data1.txt');	% 讀取訓練集數據
X = data(:, 1); 				% 第一列是城市人口
y = data(:, 2);					% 第二列是收入
m = length(y); 					% 訓練集數目

plot(X, y, 'rx', 'MarkerSize', 10);
ylabel('Profit in $10,000s');
xlabel('Population of city in 10,000s');
% 2.計算代價函數

X = [ones(m, 1), data(:,1)]; 	% 在數據前面加一列全爲1
theta = zeros(2, 1); 			% 初始化 擬合參數
m = length(y);

J = 0;							% 計算代價函數computeCost(),公式如下圖
h = X * theta					%假設函數hypothesis
J = 1/(2*m) * sum((h-y).^2);


% further testing of the cost function
J = 0;							% 計算代價函數,公式如下圖
h = X * [-1,2]
J = 1/(2*m) * sum((h-y).^2);

在這裏插入圖片描述

3.使用梯度下降算法更新theta的值:

% 梯度下降的參數設置
iterations = 1500;				% 迭代次數
alpha = 0.01;					% 學習速率

m = length(y); 					% number of training examples
J_history = zeros(num_iters, 1);

for iter = 1 : iterations
								% 計算更新後的theta,公式如下圖
	theta = theta - alpha/m * X' * (X * theta - y)
								% 每一趟均計算並保存代價函數J
	J_history(iter) = computeCost(X, y, theta);
end

在這裏插入圖片描述
在這裏插入圖片描述

% 4.繪製結果(收入)與用最優theta算出的假設函數h的圖:

hold on; 						% keep previous plot visible
plot(X(:,2), X*theta, '-')
legend('Training data', 'Linear regression')

在這裏插入圖片描述

% 5.使用得到的假設函數h預測一波,當人口爲35000和70000人時,收入爲多少

predict1 = [1, 3.5] * theta;	%測試集特徵(人口)前還得加上一列1
predict2 = [1, 7] * theta;

fprintf('For population = 35,000, we predict a profit of %f\n',...
    predict1*10000);
fprintf('For population = 70,000, we predict a profit of %f\n',...
    predict2*10000);
% 6.可視化代價函數J(theta) ,看是否有最小值:

% 自動生成theta,-10到10-100個,-1到4-100個
theta0_vals = linspace(-10, 10, 100);
theta1_vals = linspace(-1, 4, 100);

J_vals = zeros(length(theta0_vals), length(theta1_vals));  
								%初始化對應的代價函數值,維數爲100*100

for i = 1:length(theta0_vals)  %計算代價函數值
    for j = 1:length(theta1_vals)
      t = [theta0_vals(i); theta1_vals(j)]; %隨機生成的一條theta記錄
      J_vals(i,j) = computeCost(X, y, t);
    end
end

J_vals = J_vals';    		%surface函數的特性,必須進行轉置。其實就是因爲θ0和θ1要和行列座標x,y對齊。

figure;							%繪製表面圖
surf(theta0_vals, theta1_vals, J_vals)  
xlabel('\theta_0'); ylabel('\theta_1');

在這裏插入圖片描述

% 7.使用等高線圖查看全局最小值

figure;  						%這裏的J_vals在前面進行了轉置,所以此處不用轉置!
contour(theta0_vals, theta1_vals, J_vals, logspace(-2, 3, 20))  
xlabel('\theta_0'); ylabel('\theta_1');  %用到了轉義字符'\theta_0'和'\theta_1'.
hold on;
plot(theta(1), theta(2), 'rx', 'MarkerSize', 10, 'LineWidth', 2);

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章