大體上是Ng課week2的編程作業總結,作業中給出了實現非常好(主要是正常人都能看得懂。。)的linear regression比較完整的代碼。
因為是在MATLAB/Octave環境下編程,要面對的最大的一個問題同時也是這類數學語言最大的優點就是將數據的處理全都轉換成矩陣形式,即Ng所說的Vectorization,這樣似乎就和傳統的高級語言編程思維上有所不同,一開始這點是要注意的。本文就挑一些重點函數的實現進行講解。
(一)CostFunction
即在MATLAB中給出X,y和一個theta向量,返回J函數的值。
function J = computeCostMulti(X, y, theta)
J = (X*theta-y)'*(X*theta-y)/2*m;
此處X為m*n的矩陣,m為training set的個數,n為我們用來進行預測的屬性個數;y是m*1矩陣,即trainning set一開始給定的原始正確預測數據。
一開始實現的時候看到累加的第一反應就是用for。。。結果還忘寫end,找了好久才發現錯誤,后來用矩陣表示一行代碼就出來了。
(二)Gradient Descend
function [theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters) for iter = 1:num_iters theta = theta - alpha * 1/m * X'*(X*theta-y); J_history(iter) = computeCostMulti(X, y, theta); end
關於核心功能行的代碼沒什么好說的,就是按照公式然后寫成矩陣的表達形式即可。倒是想着重說一下J_history這個矩陣,或者說,向量。它的概念很好理解,其實就是一個J和iterations的函數。每次迭代都通過前面提到costFunction來計算J的值,然后存起來,這些數據在稍后用來畫圖的時候會很有用。
(三)feature normalize
function [X_norm, mu, sigma] = featureNormalize(X) mu = mean(X); sigma = std(X); X_norm -= mu; X_norm ./= sigma;
就是一些基礎的矩陣運算,分別求出每個屬性的mean和sigma,然后保存起來,返回去,並對X做好相應的修改。
此處注意在用feature normalize求得的theta,在稍后帶入新的數據進行預測時,還是要對新數據進行feature normalize的。
