1. 程式人生 > >Machine Learning:二(多變數線性迴歸問題)

Machine Learning:二(多變數線性迴歸問題)

前言:

本次實驗中學習率需要自己來選擇,因此我們應該從小到大(比如從0.001到10)來選擇,通過觀察損失值與迭代次數之間的函式曲線來決定使用哪個學習速率。當有了學習速率alpha後,問題就很容易解決了。參考資料https://class.coursera.org/ml-003/class/index

本文要解決的問題是給出了10個訓練樣本,訓練樣本的y值為房子的價格,x屬性有2個,一個是房子的大小,另一個是房子臥室的個數。需要通過這些訓練資料來學習系統的函式,從而預測房子大小為1650,且臥室有3個的房子的價格。

 

clear ; close all; clc

fprintf('Loading data ...\n');

%% Load Data
data = load('ex1data2.txt');
X = data(:, 1:2);
y = data(:, 3);
m = length(y);

% Print out some data points
fprintf('First 10 examples from the dataset: \n');
fprintf(' x = [%.0f %.0f], y = %.0f \n', [X(1:10,:) y(1:10,:)]');
fprintf('Program paused. Press enter to continue.\n');
pause;
% 資料尺度化為以0為均值的形式
fprintf('Normalizing Features ...\n');
mu = zeros(1, size(X, 2));
sigma = zeros(1, size(X, 2));
mu=[mean(X(:,1)),mean(X(:,2))];
sigma=[std(X(:,1)),std(X(:,2))];
for i=1:size(X,2),  
X_norm(:,i)=(X(:,i)-mu(1,i))/sigma(1,i);
end
% 給X增加一列全1。
X = [ones(m, 1) X_norm];

%% ================ Part 2: 梯度下降法 ================

fprintf('Running gradient descent ...\n');

% 選擇不同的alpha
alpha = 0.03;
num_iters = 400;

%初始theta為下列值,J_history記錄消耗函式值
theta = zeros(size(X,2), 1);

%計算出最終的theta值
m = length(y);
J_history = zeros(num_iters, 1);
for iter = 1:num_iters
	theta =theta-((X*theta-y)'*X)'*alpha/m;
	J_history(i)=X*theta-y)'*(X*theta-y)/(2*m);
end
% 畫出消耗函式隨著迭代次數的曲線圖
figure;
plot(1:numel(J_history), J_history, '-b', 'LineWidth', 2);
xlabel('Number of iterations');
ylabel('Cost J');
% 顯示梯度下降方法獲得的theta值
fprintf('Theta computed from gradient descent: \n');
fprintf(' %f \n', theta);fprintf('\n');
% 估計下列值的房價是多少c=[1650,3];
for i=1:2 c(i)=(c(i)-mu(i))/sigma(i);
endprice=[1,c]*theta;
fprintf(['Predicted price of a 1650 sq-ft, 3 br house ' ... '(using gradient descent):\n $%f\n'], price);
pause;

%方法二,normal equation法。

theta = zeros(size(X, 2), 1);

theta=pinv(X'*X)*X'*y;