機器學習算法手撕系列(一)----迴歸算法

一.迴歸算法是啥子?

迴歸算法是一種有監督算法(有監督是指有確定標籤(Y))

用來建立“解釋”變量(自變量X)和觀測值(因變量Y)之間的關係;從機器學習的角度來講,用於構建一個算法模型(函數)來做屬性(X)與標籤(Y)之間的映射關係,在算法的學習過程中,試圖尋找一個函數使得參數之間的關係擬合性最好。迴歸算法中算法(函數)的最終結果是一個連續的數據值,輸入值(屬性值)是一個d維度的屬性(數值向量)

二.算法原理

1.最簡單的單變量線性迴歸算法

針對數據集x跟y,預測函數會根據輸入的特徵輸出一個預測值h(x),其輸入和輸出的函數關係假設如下:

                            h_{\Theta }(x)=\Theta _{0}+\Theta _{1}x

從函數角度來說這是一條直線,表達一個線性關係,事實上我們的任務是構造一個h_{\Theta }函數,用來擬合數據集中輸入特徵x與輸出值y,同時使得通過預測函數計算出來的值h_{\Theta }(x)與真實值y的整體誤差最小,構造h_{\Theta }函數的關鍵是找到合適的\Theta _{0}\Theta _{1},\Theta _{0}\Theta _{1}稱爲模型參數.

假設我們有如下數據集:

                   特徵x:1,2,3,4     輸出y:4,6,10,15

假設模型參數\Theta _{0}=1, \Theta _{1}=3,則模型函數爲h_{\Theta }=1+3x,針對數據集中的第一個樣本,輸入爲1,模型預測值爲4,與數據真實值吻合,對於第二個樣本,輸入爲二,模型預測值爲7,實際數據值爲6,可以看出誤差爲1,模型參數求解過程就是找出一組最合適的模型參數\Theta _{0}\Theta _{1},以便能最好的擬合數據集.

1.1成本函數

單變量線性迴歸算法的成本函數是:

                                                         J(\Theta )=J(\Theta _{0},\Theta _{1})=\frac{1}{2m}\sum_{i=1}^{m}(h(x^{(i)})-y^{(i)})^{2}(m個樣本求和)

其中,h(x^{(i)})-y^{(i)}是預測值與實際值的差,故成本就是預測值和實際值的差的平方的平均值,之所以乘以1/2是爲了計算方便,這個函數稱爲均方差方程,成本函數是爲了精確的測量模型對訓練樣本擬合的好壞程度

1.2梯度下降算法

有了預測函數跟成本函數,我們怎麼求解模型參數\Theta _{0}\Theta _{1}?那麼我們的梯度下降算法就派上用場了,我們的任務是找到最合適的\Theta _{0}\Theta _{1},使得成本函數J(\Theta )最小.設在一個三維空間裏,\Theta _{0}爲x軸,\Theta _{1}爲y軸,成本函數J(\Theta _{0},\Theta _{1})爲z軸,,我們就是要找出當z軸的值最小的時候所對應的x軸上的值跟y軸上的值.

梯度下降法的原理:先隨機選擇一組\Theta _{0}\Theta _{1},同時選擇一個參數\alpha作爲移動的步長,然後讓x軸上的\Theta _{0}跟y軸上的\Theta _{1}分別向特定的方向移動一小步,這個步長的大小由參數\alpha指定,經過多次迭代,X軸跟y軸上的值決定的點就慢慢靠近z軸上的最小值處.那麼我們怎麼知道往哪個方向移動,才能靠近z軸上最小值附近?答案是往成本函數變小的方向移動?那麼又怎麼保證成本函數逐漸變小的方向呢?那就是偏導數!!!

可以先簡單的把偏導數理解爲斜率,我們讓\Theta _{j}不停地迭代,由當前的\Theta _{j}值,根據J(\Theta )的偏導數函數,算出J(\Theta )\Theta _{j}上的斜率,然後再乘以學習率\alpha,就可以讓\Theta _{j}J(\Theta )變小的方向邁一小步.

梯度下降過程的公式描述爲:

                                                                                    \Theta _{j}=\Theta _{j}-\alpha \frac{\partial J(\Theta )}{\partial \Theta _{j}}

公式中,下標j就是參數的序號,針對單變量線性迴歸,即0和1,\alpha稱爲學習率,它決定每次要移動的幅度大小,它乘以成本函數對參數\Theta _{j}的偏導數,以這個結果作爲參數移動的幅度,如果幅度過小,意味着要計算很多次才能到達目的地,如果幅度太大,可能會直接跨過目的地,從而無法收斂

把成本函數J(\Theta )的定義式代入上面的公式中,推導出梯度下降算法公式:

                                                                      \Theta _{0}=\Theta _{0}-\frac{\alpha }{m}\sum_{i=1}^{m}(h(x^{(i)})-y^{(i)})

                                                                      \Theta _{1}=\Theta _{1}-\frac{\alpha }{m}\sum_{i=1}^{m}((h(x^{(i)})-y^{(i)})x_{1}^{(i)})

2.多變量線性迴歸算法

工程應用中往往不止一個輸入特徵,那麼我們由單變量推廣到多變量線性迴歸算法

2.1預測函數

多個輸入特徵,此時輸出y的值由n個輸入特徵x1,x2,x3,...,xn決定,那麼預測函數的模型可以改寫如下:

                                                                          h_{\Theta }(x)=\Theta _{0}+\Theta _{1}x_{1}+\Theta _{2}x_{2}+\cdot \cdot \cdot +\Theta _{n}x_{n}

若x0爲常數1,用累加運算符重寫上面的預測函數:

                                                                        h_{\Theta }(x)=\sum _{j=0}^{n}\Theta _{j}x_{j}

\Theta _{0},\Theta _{1},\Theta _{2},\cdot \cdot \cdot ,\Theta _{n}統稱爲\Theta,是預測函數的參數,即一組\Theta值就決定了一個預測函數,記做h_{\Theta }(x),在不引起誤解的輕況下我們也把它簡寫爲h(x),理論上講,預測函數有無窮多個,我們求解的目標就是找出一個最優的\Theta

(1)向量形式的預測函數

根據向量的乘法運算法則,成本函數可重新寫爲:

                                                                   h_{\Theta }(x)=[\begin{matrix} \Theta _{0} &\Theta _{1} &\cdot \cdot \cdot &\Theta _{n} ][\begin{matrix} x_{0}\\ x_{1}\\ \cdot \cdot \cdot \\ x_{n} \end{matrix} \end{matrix}]=\Theta ^{T}x

此處,依然假設x_{0}=1,x_{0}稱爲模型偏置.爲什麼要寫成向量形式的預測函數?一是因爲簡潔,二是因爲在實現算法時,要用到數值計算裏面的矩陣運算來提高效率.

2.2成本函數

多變量線性迴歸算法的成本函數:

                                                                 J(\Theta )=\frac{1}{2m}\sum_{i=1}^{m}(h(x^{(i)})-y^{(i)})^{2}

其中,模型參數\Theta爲n+1維的向量,h(x^{(i)})-y^{(i)})是預測值和實際值的差,這個形式和單變量線性迴歸算法類似

成本函數有其對應的矩陣樣式版本:

                                                                J(\Theta )=\frac{1}{2m}(X\Theta -\vec{y})^{T}(X\Theta -\vec{y})

其中,X爲m\times(n+1)維的訓練樣本矩陣,上標T表示轉置矩陣;\vec{y}表示由所有的訓練的樣本輸出y^{(i)}構成的向量,這個公式的優勢是:由矩陣乘法化掉了累加,不需要循環,直接使用矩陣運算,可以一次性計算出對特定的參數\Theta下模型的擬合成本.

2.3梯度下降法

根據單變量線性迴歸算法的介紹,梯度下降公式爲:

                                                                                   \Theta _{j}=\Theta _{j}-\alpha \frac{\partial J(\Theta )}{\partial \Theta _{j}}

公式中,下標j是參數的序號,其值從0到n;\alpha爲學習率.把成本函數代入上式,利用偏導數的計算法則,易得梯度下降法的參數迭代公式:

                                                                                 \Theta _{j}=\Theta _{j}-\frac{\alpha }{m}\sum_{i=1}^{m}((h(x^{(i)})-y^{(i)})x_{j}^{(i)})

這個公式有些符合直覺的地方,比如( h(x^{(i)})-y^{(i)}) 表示的是預測值與真實值的誤差,當誤差比較大時,經過一輪的迭代,\Theta _{j} 的步幅就邁得比較大。即當我們的參數\Theta離我們的目標值很遠的時候,迭代一次的值變化比較大,可以快速地收斂,而當\Theta離目標值比較近的時候,迭代一次的值變化比較小,即慢慢地收斂到目標值.

這個公式怎麼樣用編程語言來實現呢?在編寫機器學習算法的時候,一般步驟如下:

  • 確定學習率\alpha
    \alpha太大可能會使成本函數無法收斂,太小計算太多,機器學習算法效率就比較低。
  • 確定參數起始點
    比如讓所有的參數都爲1作爲起點,即\theta _{0}=\theta _{1}=\cdot \cdot \cdot =\theta _{n}=1,這樣就得到了我們的預測函數:h_{\theta }(x)=\sum _{i=1}^{m}x^{(i)}.根據預測值和我們的成本函數,就可以算出我們在參數起始位置的成本. 需要注意的是,參數起始點可以根據實際情況靈活選擇,以便讓機器學習算法的性能更高,比如選擇比較靠近極點的位置.
  • 計算參數的下一組值
    根據 LSM 算法,分別同時算出新的\theta _{j}的值.然後用新的 θ 值得到新的預測函數h_{\theta }(x),再根據新的預測函數,代入成本函數就可以算出新的成本.
  • 確認成本函數是否收斂
    拿新的成本和舊的成本進行比較,看成本是不是變得越來越小. 如果兩次成本之間的差異小於誤差範圍,即說明我們已經非常靠近最小成本附近了. 就可以近似地認爲我們找到了最小成本了. 如果兩次成本之間的差異在誤差範圍之外,重複步驟 3 繼續計算下一組參數 θ. 直到找到我們的最優解.

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章