機器學習 Multivariate Linear Regression——多變量線性迴歸

完整的數據和代碼已經更新至GitHub,歡迎 fork~GitHub鏈接

Description
In this exercise, you will investigate multivariate linear regression using gradient descent and the normal equations. You will also examine the relationship
between the cost function J(θ), the convergence of gradient descent, and the
learning rate α.

  1. 首先讀入數據,一共47組數據,其中x爲多元變量,一元表示房屋面積,一元表示臥室的數量;y表示房價
  2. 將x增加,值爲1的一列,即bias
  3. 這裏需要 preprocess 數據,對數據進行預處理,求出數據的標準差和均值,對數據進行預處理上,來對x進行預處理,將x的值縮放到[-1,1]之間,即一個歸一化的操作,讓計算更加方便這樣便於在後來的梯度下降中,提高效率,而且x更好的收斂(convergence)
  4. 實現梯度下降:
    計算出 h(x)的值:
    在這裏插入圖片描述
    使用如下BGD 批梯度下降公式:來更新梯度,一次喂入所有數據
    在這裏插入圖片描述
  5. 計算損失函數,使用如下的公式:
    在這裏插入圖片描述
    計算出損失函數,由於x,y都爲向量,我們可以將x,y向量化即:
    在這裏插入圖片描述
    在這裏插入圖片描述
  6. 接下來的問題就是如何確定 學習率了,本次實驗也是探討學習率的變化,對損失函數收斂的影響,而且本次一共迭代50輪,所以,我按照實驗要求,將學習率,依次設置爲 0.01, 0.03, 0.1, 0.3來看函數收斂的效果,這四根直線的學習率依次爲:0.01,0.03,0.1,0.3
    在這裏插入圖片描述
    下圖爲當 學習率爲0.5時的圖像,可見當學習率變大的時候,損失函數下降明顯
    在這裏插入圖片描述
    下圖爲學習率爲 1.5時的圖像,損失函數不降反增,發散出去了
    在這裏插入圖片描述
    可見,學習率,不能過大,過大會導致發散
  7. 當學習率爲0.4時,參數 theta的值爲:
    在這裏插入圖片描述
    此時可以預估出 當 x爲 1650 square feet and 3 bedrooms時的 y值(房價)爲
    在這裏插入圖片描述
  8. 使用另一種方法Normal Equation來計算 theta,這個方法的原理就是使用了最小二乘的方法
    在這裏插入圖片描述
    直接得出線性迴歸的答案
%加載數據,數據預處理
x=load('F:\Machine Learning\exp\ex2Data\ex2x.dat');
y=load('F:\Machine Learning\exp\ex2Data\ex2y.dat');

m=47;
x=[ones(m,1),x];

sigma=std(x);
mu=mean(x);
x(:,2)=(x(:,2)-mu(2))./sigma(2);
x(:,3)=(x(:,3)-mu(3))./sigma(3);
%數據初始化,定義了四個學習率
theta=zeros(size(x(1,:)))';
theta1=zeros(size(x(1,:)))';
theta2=zeros(size(x(1,:)))';
theta3=zeros(size(x(1,:)))';
alpha=0.01;
alpha1=0.03;
alpha2=0.1;
alpha3=0.3;
J=zeros(50,1);
J1=zeros(50,1);
J2=zeros(50,1);
J3=zeros(50,1);
%函數定義
h=@(x,theta) x*theta;
loss=@(theta,x,y) mean((h(x,theta)-y).^2)/2;
iteration=@(theta,alpha,y,x) theta-alpha*(x'*(h(x,theta)-y))/m;

%開始循環迭代,使用四個學習率上來嘗試
for num_iterations=1:50
J(num_iterations)=loss(theta,x,y);
theta=iteration(theta,alpha,y,x);
%第二個
J1(num_iterations)=loss(theta,x,y);
theta1=iteration(theta1,alpha1,y,x);
%第三個
J2(num_iterations)=loss(theta2,x,y);
theta2=iteration(theta2,alpha2,y,x);
%第四個
J3(num_iterations)=loss(theta3,x,y);
theta3=iteration(theta3,alpha3,y,x);
end
figure;
plot(0:49,J(1:50),'b-');
hold on;
plot(0:49,J1(1:50),'r-');
plot(0:49,J2(1:50),'k-');
plot(0:49,J3(1:50),'g-');
xlabel ( 'Number of iterations' );
ylabel ( ' Cost J ' );

theta=zeros(size(x(1,:)))';
alpha=0.4;
J=zeros(50,1);
for num_iterations=1:50
J(num_iterations)=loss(theta,x,y);
theta=iteration(theta,alpha,y,x);
end
plot(0:49,J(1:50),'b-');
xlabel ( 'Number of iterations' );
ylabel ( ' Cost J ' );
disp(theta);
% 數據預處理
t1=(1650-mu(2))./sigma(2);
t2=(3-mu(3))./sigma(3);
disp(h([1,t1,t2],theta));

% 使用 正則方程
u=(x'*x)\x'*y
%u=x\y
disp(u)
t1=(1650-mu(2))./sigma(2);
t2=(3-mu(3))./sigma(3);
disp(h([1,t1,t2],u));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章