1. 程式人生 > >線性迴歸梯度下降 Octave

線性迴歸梯度下降 Octave

首先對一堆樣本點我們假設目標函式為:

一元線性迴歸梯度下降演算法的Octave模擬

在Gradient Descent Algorithm中,我們利用不斷推導得到兩個對此演算法非常重要的公式,一個是J(θ)是代價函式:

一元線性迴歸梯度下降演算法的Octave模擬

使用偏導數的方式使得theta的值逐步取得滿足當前代價函式的最小值,

一元線性迴歸梯度下降演算法的Octave模擬

我們在梯度下降中,直接使用這兩個公式,來繪製J(θ)的分佈曲面,以及θ的求解路徑。

命題為:我們為一家連鎖餐飲企業新店開張的選址進行利潤估算,手中掌握了該連鎖集團所轄店鋪當地人口資料,及利潤金額,需要使用線性迴歸演算法來建立人口與利潤的關係,進而為新店進行利潤估算,以評估店鋪運營前景。

首先我們將該企業的資料繪製在座標圖上,如下圖所示,我們需要建立的模型是一條直線,能夠在最佳程度上,擬合population與profit之間的關係。其模型為:

一元線性迴歸梯度下降演算法的Octave模擬

關鍵程式碼:

function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
%GRADIENTDESCENT Performs gradient descent to learn theta
%   theta = GRADIENTDESCENT(X, y, theta, alpha, num_iters) updates theta by 
%   taking num_iters gradient steps with learning rate alpha

% Initialize some useful values
m = length(y); % number of training examples
J_history = zeros(num_iters, 1);

for iter = 1:num_iters

    % ====================== YOUR CODE HERE ======================
    % Instructions: Perform a single gradient step on the parameter vector
    %               theta. 
    %
    % Hint: While debugging, it can be useful to print out the values
    %       of the cost function (computeCost) and gradient here.
    %
    x = X.*((X*theta)-y);
    
    theta = theta - (alpha*sum(x)/m)';
    

    % ============================================================

    % Save the cost J in every iteration    
    J_history(iter) = computeCost(X, y, theta);

end

end

下圖是J(θ)的分佈曲面:

一元線性迴歸梯度下降演算法的Octave模擬

取得最小theta值時的h(x)函式影象:

我們求得的最佳θ值在在影象得最低點,極小值也是最小值:

一元線性迴歸梯度下降演算法的Octave模擬