警告:本文為小白入門學習筆記
數據集:
由房屋的面積和bedroom個數影響房價的高低。
加載數據
x = load('ex3x.dat');
y = load('ex3y.dat');
m = length(y);
x = [ones(m, 1), x]; (之所以加上一列1,因為x1 = 1);
看一下輸入值,注意房間面積是卧室數量的1000倍左右。這種差異意味着預處理輸入將顯着提高梯度下降的效率。
在您的程序中,按標准偏差縮放兩種類型的輸入,並將其均值設置為零。
%數據處理,特征值縮放
sigma = std(x);%標准差
mu = mean(x); %平均數
x(:,2) = (x(:,2) - mu(2))./ sigma(2);
x(:,3) = (x(:,3) - mu(3))./ sigma(3);
假設函數任然是:

梯度下降算法:

用居矩陣的方式計算:
theta = theta - x'*(x*theta-y)/m*a;
這里theta是一個3*1的矩陣,x是50*2矩陣,y是50*1矩陣,a表示alpha,m表示矩陣列長;
最終MATLAB程序是:
function [jVal] = multiLinerCost(a)
x = load('ex3x.dat');
y = load('ex3y.dat');
m = length(y);
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,:)))'; %3*1
J = zeros(50,1);
for iter = 1:50
theta = theta - x'*(x*theta-y)/m*a;
jVal = sum((x*theta-y).^2)/(2*m);
J(iter) = jVal;
end
%繪圖
plot(0:49,J(1:50),'-');
xlabel('Number of iterations')
ylabel('Cost J')
end
控制台:
multiLinerCost(0.07) %選取學習速率(learning rates )為0.07;

我們可以試試不同的learning rates 取值,對比曲線。

可以看到alpha =0.01時,曲線下降緩慢,迭代50次時還沒有下降到最低值,alpha = 0.3時曲線在5附近急劇下降,在之后迭代就沒有太大變化,所以選取0.07這個值相對合理。
如果alpha 再大會怎么樣呢?

設alpha=1.5,可以看到這個值太大以至於一開始就為零,到最后趨近於無窮大。
所以一般取值 :
使用梯度下降算法求得theta:
1.0e+05 *
3.4041
1.1063
-0.0665
使用矩陣計算求出:(如果用矩陣直接計算,不用特征值縮放)
![]()
1.0e+04 *
8.9598
0.0139
-0.8738
(梯度下降法)所以最后的曲線方程是 h(x1,x2) = 340413 + 110631*x1 - 6650*x2
假如一個房間面積為1650,bedroom個數是3個,那么預測價格是$293,081;
這是對於二元線性回歸問題,如果一般化X = [x1;x2;x3;........xn] ; theta = [theta0;theta1;......thetan]也可以解決。
這只是對多元線性回歸的簡單應用,還有很多東西要學習。
入門菜鳥,錯誤地方歡迎指教!
