機器學習筆記(二)線性迴歸實現
一、向量化
對於大量的求和運算,向量化思想往往能提高計算效率(利用線性代數運算庫),無論我們在使用MATLAB、Java等任何高階語言來編寫程式碼。
運算思想及程式碼對比
的同步更新過程向量化
向量化後的式子表示成為:
其中是一個向量,是一個實數,是一個向量,所以在這裡是做一個向量的減法。在將計算向量化的同時,這種運算方式使我們很好地實現了的同步更新,我自行推導了一下,體會運算過程中的同步更新是如何實現。
二、 簡單一元線性迴歸實現
資料:是房子的大小(平方英尺)和房價(美元)之間的對應關係。
練習:Matlab實現
%簡單一元線性迴歸練習 theta_0 = 0; theta_1 = 0; alpha = 0.000001; x = [150; 200; 250; 300; 350; 400; 600]; y = [6450; 7450; 8450; 9450; 11450; 15450; 18450]; %畫出點 plot(x, y, 'r*', 'MarkerSize', 8); % 5控制*的大小 hold on; counter = 50; [theta_0, theta_1] = gradientDescent_LOW(x, y, theta_0, theta_1, alpha, counter); b = theta_0 + theta_1 * x; %畫出擬合直線 plot(x, b, 'b-', 'Linewidth',2); % 5控制*的大小 hold on; xlabel('面積/平方英尺'); ylabel('房價/美元'); title('一元線性迴歸');
function [theta_0, theta_1] = gradientDescent_LOW(x, y, theta_0, theta_1, alpha, counter)
%此處x為向量
m = length(y); %樣本數量
for iter = 1:counter
H = theta_0 + theta_1 * x; %線性假設函式
%計算代價函式輸出
res = 0;
for i = 1:m
res = res + (H(i)-y(i))^2;
end
Jtheta = res/(2*m)
%更新theta_0
sum = [0;0]; %記錄兩個偏導部分(求和過程)
for i = 1:m
sum(1,1) = sum(1,1) + (H(i)-y(i));
end
theta_0 = theta_0 - alpha * sum(1,1)/m;
%更新theta_1
for i = 1:m
sum(2,1) = sum(2,1) + (H(i)-y(i)) * x(i);
end
theta_1 = theta_1 - alpha* sum(2,1)/ m ;
end
得到擬合影象:
提出問題:
1. 使alpha、counter取值規範
加入特徵縮放後,alpha取0.03,counter = 1500。能夠達到較好的擬合效果。
%特徵縮放
for i = 1:length(y)
x(i) = (x(i)-min(x))/(max(x)-min(x))
y(i) = (y(i)-min(y))/(max(y)-min(y))
end
擬合影象
2. 梯度下降迭代結束標誌
a) 定義一個合理的閾值,當兩次迭代之間的差值小於該閾值時,迭代結束。
b) 設定一個大概的迭代步數,比如1000或500。
三、多元線性迴歸實現
1. 梯度下降法
資料:波士頓房價資料集(經個別剔除)共419條資料
(理論推導見上一篇筆記,直接上程式碼)
%test2.m
[Data] = xlsread('Boston house prise.xlsx',1,'A1:M419');
[y] = xlsread('Boston house prise.xlsx',1,'N1:N419');
[m,n] = size(Data); % m樣本數量 n特徵數
Data = featureScaling(Data);
y = featureScaling(y);
x0 = ones(m,1);
X = ([x0,Data])';
Theta = zeros(n+1,1);
alpha = 0.009;
counter = 1500;
Theta = gradientDescent(X, y, Theta, alpha, counter);
plot(1:m, y, 'r-', 'Linewidth',1); % 5控制*的大小
hold on;
plot(1:m, Theta'*X, 'b-', 'Linewidth',1); % 5控制*的大小
hold on;
xlabel('樣例序號');
ylabel('房價');
title('梯度下降-波士頓房價預測');
legend('真實值','預測值');
%梯度下降(向量化)
function [Theta] = gradientDescent(X, y, Theta, alpha, counter)
% X Theta 均為矩陣
[m,n] = size(X); % m樣本數量 n特徵數
J_history = zeros(counter, 1);
for iter = 1:counter
H = Theta' * X; %線性假設函式
Delta = 1/m * X *(H'-y);
Theta = Theta - alpha * Delta;
% 儲存下所有J,可以檢視收斂情況
res = 0;
for i = 1:m
res = res + (H(i)-y(i))^2;
end
J_history(iter) = res/(2*m);
end
J_history
end
%特徵放縮
function [X] = featureScaling(X)
%X 為矩陣,每一列為一組特徵值
[m,n] = size(X);
for j = 1:n
for i = 1:m
X(i,j) = (X(i,j)-min(X(:,j)))*1/(max(X(:,j))-min(X(:,j)));
end
end
2. 正規方程法
(理論部分見上一篇筆記)
[X] = xlsread('Boston house prise.xlsx',1,'A1:M419');
[y] = xlsread('Boston house prise.xlsx',1,'N1:N419');
theta = pinv(X'* X)* X'*y
[m,n] = size(X); % m樣本數量 n特徵數
plot(1:m, y, 'r-', 'Linewidth',1);
plot(1:m, theta'*X', 'b-', 'Linewidth',1);
輸出結果:
梯度下降法 正規方程法
總結:
1. 在運算中多用向量化的思想。
2. 在多元線性迴歸的實現中,隨著引數的增多,愈加體現出在梯度下降法當中,引數和初始值選擇對結果是有很大影響的。
3. 在本次用波士頓房價資料進行實驗的過程中,正規方程法的擬合效果優於梯度下降法。