第三篇就應用代碼進行實戰(zhàn)了南用,加油 \o^o/
首先裝載數(shù)據(jù)掏湾,并將數(shù)據(jù)分別存入X與y中,并將數(shù)據(jù)可視化:
data=load('ex1data1.txt');
X = data(:,1); y=data(:,2);
figure;
plot(X,y,'rx','MarkerSize',10);
然后對X進行預處理,使其第一列的值都為1
m=size(X,1);
X=[ones(m,1) X];
初始化參數(shù)值:
theta=zeros(2,1);
假設我們需要對數(shù)據(jù)集訓練1500次筑公,學習速率設為0.01:
iterations=1500;
alpha=0.01;
編寫梯度下降算法:
function [theta,J_history] = gradientDescent(X,y,theta,alpha,iterations)
m=size(X,1);
J_history = zeros(iterations,1);
for i =1:iterations:
temp1 = theta(1)-(alpha/m)*sum((X*theta-y).*X(:,1));
temp2 = theta(2)-(alpha/m)*sum((X*theta-y).*X(:,2));
theta(1) = temp1;
theta(2) = temp2;
J_history(i) = computeCost(X,y,theta);
end
end
當然我們還需要編寫cost function的代碼:
function J = computeCost(X,y,theta)
m = size(X,1);
J = (X*theta-y)'*(X*theta-y)/(2*m);
end
ok,我們完成上述代碼之后尊浪,開始對訓練集應用梯度下降算法進行訓練:
theta = gradientDescent(X,y,theta,alpha,iterations);
我們將計算出來的曲線擬合在圖表上:
hold on;
plot(X(:,2),X*theta,'-');
正規(guī)化方程
之前提到,如果樣本數(shù)據(jù)值過大的話我們需要對他們進行一些預處理捣作,使他們的值變小,以方便應用梯度下降算法惩坑,這里我直接采用正規(guī)化方程也拜,來計算他們的擬合曲線。
載入數(shù)據(jù)
data=load('ex1data2.txt');
X = data(:,1:2);
y = data(:,3);
m = size(X,1);
X = [ones(m,1) X];
編寫正規(guī)化方程的代碼:
theta = pinv(X'*X)*X'*y;
計算一下此時的代價函數(shù)值:
J = (X*theta-y)'*(X*theta-y)/(2*m);
此時其代價值應該在10的負3次方數(shù)量級左右稀轨。
最后
下一篇教程將開始考慮邏輯回歸的問題岸军,公式可能更加復雜,加油~