利用梯度下降的方式求線性迴歸中參數的一些經驗總結

這個是coursera裏的machine learning課程的作業,在用matlab實現的過程中我總結了一些經驗
1. 梯度下降也分成兩個部分,一個是cost function的實現,一個是θ 的實現
2. 這裏要儘量採用向量的計算方法,注意向量的計算方法不是矩陣的計算方法,總結一下向量的計算技巧,什麼情況下可以一氣計算,什麼情況下不行,只能循環計算。微批量處理
matlab的優勢就在於他可以像數學計算那樣,把批量的數據作爲單位一氣進行運算,而不是像傳統的程序一樣只能一個數字一個數字的算,最典型的就是向量和矩陣,在matlab裏面是可以以矩陣爲單位或者以向量爲單位進行計算的。如果你是以向量作爲單位來計算的,那麼在同一個數學等式裏面,你要保證參與運算的數據都是緯度一樣的向量。這裏多說一句,在《線性代數》同濟第五版裏面,並沒有專門介紹向量的運算法則,只說道一個向量的內積。我覺得可以這樣理解,因爲向量可以看成一個特殊的矩陣(n行1列的矩陣),那麼向量的運算很多都是和矩陣以一樣的,其實所謂的內積也是矩陣乘法的一種特殊形式。
3. θj:=θjα1mmi=1(hθ(x(i))y(i))xj(i) 這個式子能不能用向量的方式來進行求解,因爲這個式子比較複雜,憑空想難度還是比較高的,因此我們用一個小點數將其具體化來觀察它的特點(其實Ng就是利用這種方法來講課的,一個變量的線性迴歸)。
我們假設m=3,n=2,那麼hypothesis的形式爲hθ(x)=θ0+θ1x1+θ2x2 。我們要確定的參數爲θ=θ0θ1θ2 。而係數矩陣X
111x1(1)x1(2)x1(3)x2(1)x2(2)x2(3)
我們先令j=0,看一下θ 的迭代式子有什麼特點。θ0:=θ0α133i=1(hθ(x(i))y(i))xj(i) 。我們把這個求和公式展開,於是θ0:=θ0α13[(hθ(x(1))y(1))x0(1)+(hθ(x(2))y(2))x0(2)+(hθ(x(3))y(3))x0(3)] ,你可以看到方框號裏的這一部分,正好就是向量θTxY 與向量x0(1)x0(2)x0(3) 的內積。而這個向量x0(1)x0(2)x0(3) 正好就是係數矩陣X 的第一列,我們可以在matlab裏用X(:,1)來表示X矩陣的第一列,對於θ0 對應的X矩陣的第一列,也就是0+1 ,那麼我們可以推出來針對每一個θj 其取值的式子用向量的形式表示爲θj=θjα1m[θTxY,X(:,j+1)] 。用代碼的形式表示就是

predictions = X * theta ;
Err = predictions - y ;
theta0 = theta(1) - alpha / m * dot(Err , X(:,1));
theta1 = theta(2) - alpha / m * dot(Err , X(:,2));
theta = [theta0 ; theta1];

這個仍然是一個一個的計算向量θ 的分量,那我能不能一個式子就將θ 這個向量算出呢?我們還是用簡單具體的例子來觀察其中的規律:
θ0=θ0α13[Err,X(:,1)]
θ1=θ1α13[Err,X(:,2)]
θ2=θ2α13[Err,X(:,3)]
把這三個式子合成一個就是θ0θ1θ2=θ0θ1θ2α13ErrX(:,1)ErrX(:,2)ErrX(:,3) ,如果方括號括住的部分能夠用合適的方式(比如說以向量運算或者矩陣運算的方式)一次性的表現出來,那麼這個問題就解決了。我們仔細觀察一下這一部分,把這個地方細化一下,我令Err=e0e1e2 ,在ErrX(:,1)ErrX(:,2)ErrX(:,3) 中的每一個分量都是Err 這個向量和係數矩陣X=111x1(1)x1(2)x1(3)x2(1)x2(2)x2(3) 中的一列的進行內積的結果,可以觀察出來,ErrX(:,1)ErrX(:,2)ErrX(:,3) 其實就是矩陣XT 與向量Err 的積(這個矩陣乘法),即XTErr ,於是將θ 向量一次性求出來的式子爲

θ=θα1m(XTErr)

於是這個用matlab代碼表示爲:
    predictions = X * theta ;
    Err = predictions - y ;
    theta = theta - alpha / m * (X' * Err);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章