線性回歸理解及代碼實現


github:代碼實現之一元線性回歸代碼實現之多元線性回歸與多項式回歸
本文算法均使用python3實現


1. 什么是線性回歸

  《機器學習》對線性回歸的定義為:

給定數據集 $ D = \lbrace (x^{(1)}, y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m) } ,y^{(m)}) \rbrace $ ,其中 $ x^{(i)} = \lbrace x_1^{(i)},x_2^{(i)},...,x_n^{(i)} \rbrace $ , $ y^{(i)} \in R $ ,共有 $ m $ 個樣本,每個樣本含有 $ n $ 個特征 ,“線性回歸”(linear regression)試圖學得一個線性模型以盡可能准確地預測實值輸出標記。

  以一元線性回歸為例,我們通過例子來更好地理解什么是線性回歸。
  現在我們有關於南京夫子廟附近房價的一些數據,$ D =\lbrace (x^{(1)}, y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)}) \rbrace $ ,其中 $ x^{(i)} $ 只含有一個特征,表示房子的面積 , $ i = 1,2,...,m $ 表示是第 $ i $ 個訓練樣本 , $ y^{(i)} $ 是數值,表示房子的價格。我們將該數值繪制成下圖。

  通過觀察我們大致可以看出,房子的面積 $ x^{(i)} $ 與房子的價格 $ y^{(i)} $ 具有一定的線性關系,也就是說,我們可以畫出能夠大致表示 $ x^{(i)} $ 與 $ y^{(i)} $ 關系的一條直線,如下圖:

  在該直線中,房子的面積 $ x^{(i)} $ 為自變量,房子的價格 $ \hat{y}^{(i)} $ 為因變量。而“線性回歸”的目的就是,利用自變量 $ x^{(i)} $ 與因變量 $ \hat{y}^{(i)}$ ,來學習出這么一條能夠描述兩者之間關系的。對於一元線性回歸來說就是學習出一條直線,而對於多元線性回歸來說則是學習出一個超平面


2. 一元線性回歸模型

  在概念上理解了線性回歸是什么之后,我們就需要將線性回歸的問題進行抽象化,轉換成我們能夠求解的數學問題。
  在上面的例子中,我們可以看出自變量 $ x^{(i)} $ 與因變量 $ \hat{y}^{(i)} $ 大致成線性關系,因此我們可以對因變量做如下假設(hypothesis):$$ \hat{y}^{(i)}= \theta_1 x^{(i)} + \theta_0 $$
  或者記作: $$ h_{\theta}(x^{(i)}) = \theta_1 x^{(i)} + \theta_0 $$
  其中 $ i =1 ,2 ,...,m $
  在這里使用 $ \hat{y}^{(i)} $ 是由於通過觀察,我們可以發現直線並沒有完全擬合數據,而是存在一定的誤差。該假設即為一元線性函數的模型函數,其中含有兩個參數 $ \theta_1 與 \theta_0 $ 。其中 $ \theta_1 $ 可視為斜率, $ \theta_0 為則直線在 y $ 軸上的截距。接下來的任務就是如何求得這兩個未知參數。


3. 損失函數的定義

  通過觀察上圖,對於 $ x^{(i)} $ 其對應的直線上的值為 $ \hat{y}^{(i)} $ ,但所給的數據集中 $ x^{(i)} $ 對應的值為 $ y^{(i)} $ 。而預測值 $ \hat{y}^{(i)} $ 與實際值 $ y^{(i)} $ 存在誤差(或者也叫做殘差(residual),在機器學習中也被稱為代價(cost))。我們可以認為,預測值與實際值的誤差越小越好
  在這里我們使用均方誤差(Mean Squared Error)來描述所需要求解的目標函數(Objective function)代價函數(Loss function): $$ J(\theta_0,\theta_1) = \frac{1}{2m} \sum_{i=1}^m(\hat{y}^{(i)}-y^{(i)}) ^2 = \frac{1}{2m} \sum_{i=1}^m(h_{\theta}(x^{(i)})-y^{(i)})^2 $$
  其中 $ i = 1,2,..,m $
  目標函數 $ J(\theta_0,\theta_1) $ 描述了所有訓練樣本實際值與預測值之間的均方誤差,而我們的目的就是求解能夠使得該誤差 $ J(\theta_0,\theta_1) $ 值最小的參數 $ \theta_0, \theta_1 $ 。
  可將其表示為: $$ min_{\theta0,\theta1} J(\theta_0,\theta_1) $$
  在確定了代價函數以及所需要求解的目標( $ \theta_0 , \theta_1 $ )以及條件( $ minJ(\theta_0,\theta_1) $ )之后,接下來需要使用優化算法來進行參數的求解了。


4. 優化算法

  在這里我們將使用兩種方法進行參數的求解:(1)梯度下降法(2)最小二乘法
  我們先觀察一下目標函數:$$ J(\theta_0,\theta_1) = \frac{1}{2m} \sum_{i=1}^m(h_{\theta}(x^{(i)})-y^{(i)})^2 = \frac{1}{2m} \sum_{i=1}^m[(\theta_1 x^{(i)}+ \theta_0 )- y^{(i)} )]^2 $$
  此時將參數 $ \theta_1 $ 視作自變量,可將上式看成是 $ J(\theta_0,\theta_1) $ 是關於 $ \theta_1 $ 的二次函數並可作出下圖( $ \theta_0 $ 亦同)。

  可看出函數圖中存在最小點,而在該點處滿足 $ \frac{\Delta J(\theta_0, \theta_1)}{\Delta \theta_1} = 0 $。此點即為最小值點。

4.1 梯度下降法(gradient descent)

  我們可以使用梯度下降法來求得該點的參數值。其思想為:“走一步看一步”,總是在每一步的小范圍內找當前最優方向,再繼續前進。
  梯度下降法的邏輯為:
  (1)從某個 $ \theta_0, \theta_1 $ 開始(一般設置為0或者取隨機值)
  (2)不斷修改 $ \theta_0, \theta_1 $ ,以使得 $ J(\theta_0, \theta_1) $ 越來越小,直到接近最小值點。
  其算法過程為:
   repeat {
        $ \theta_j := \theta_j - \alpha \frac{\Delta J(\theta_0,\theta_1)}{\Delta \theta_j} $
   }
   其中 $ \alpha $ 為學習率(learning rate),也就是每一次的“步長”; $ \frac{\Delta J(\theta_0,\theta_1)}{\Delta \theta_j} $ 是方向,也可以看做是二次函數上每一點的切線斜率,可以使得整體上是朝着最小值點的方向進行。參見下圖進行理解:

  由上面的梯度下降算法過程可知,我們需要求解學習率 $ \alpha $ 以及梯度 $ \frac{\Delta J(\theta_0,\theta_1)}{\Delta \theta_j} ,其中 j = 0,1 $ 。而學習率是人為設定,並不需要從訓練集中學習,因此我們只需要求解梯度即可。
  對於一元線性回歸來說: $$ J(\theta_0,\theta_1) = \frac{1}{2m} \sum_{i=1}^m(h_{\theta}(x^{(i)})-y^{(i)})^2 = \frac{1}{2m} \sum_{i=1}^m(\theta_0+\theta_1 x^{(i)}-y^{(i)})^2 $$
  則 $$ \frac{\Delta J(\theta_0,\theta_1)}{\Delta \theta_j} = \frac{\Delta}{\Delta \theta_j} \frac{1}{2m} \sum_{i=1}^m (\theta_0 + \theta_1 x^{(i)} - y^{(i)})^2 $$
  當 $ j=0 $ 時: $$ \frac{\Delta J(\theta_0,\theta_1)}{\Delta \theta_0} = \frac{1}{m} \sum {i=1}^m (\theta_0 + \theta_1 x^{(i)} - y^{(i)}) = \frac{1}{m} \sum{i=1}^m (h_{\theta}(x^{(i)}) - y^{(i)}) $$
  當 $ j=1 $ 時:$$ \frac{\Delta J(\theta_0,\theta_1)}{\Delta \theta_1} = \frac{1}{m} \sum {i=1}^m (\theta_0 + \theta_1 x^{(i)} - y^{(i)}) \cdot x^{(i)} = \frac{1}{m} \sum{i=1}^m (h_{\theta}(x^{(i)}) - y^{(i)}) \cdot x^{(i)} $$
  於是對於一元線性回歸,梯度下降算法過程為:
   repeat {
         $ \theta_0 := \theta_0 - \alpha \frac{1}{m} \sum_{i=1}^m (h_{\theta}(x^{(i)}) - y^{(i)}) $
         $ \theta_1 := \theta_1 - \alpha \frac{1}{m} \sum_{i=1}^m (h_{\theta}(x^{(i)}) - y^{(i)}) \cdot x^{(i)} $
   }
   重復以上過程直到收斂,或達到最大迭代次數。
   收斂判斷條件為: $$ \mid J(\theta_0^{(k)},\theta_1^{(k)}) - J(\theta_0^{(k-1)},\theta_1^{(k-1)}) \mid < \epsilon $$
  其中 $ \epsilon $ 為閾值 ,當第 $ k $ 次所求代價值,與第 $ k-1 $ 代價值相差小於閾值時,可視為函數收斂到最優解附近。此時的 $ \theta_0^{(k)},\theta_1^{(k)} $ 即為所求參數。
  以上便是梯度下降算法的整個過程。

4.2 最小二乘法(least square method)

  梯度下降是通過迭代的方法求解參數 $ \theta $ ,而最小二乘法,或者叫正規方程,是解析地求解參數 $ \theta $。下面我們來介紹一下如何使用最小二乘法來求得參數。
  對於模型函數,我們可以表示為: $$ h(x) = X \cdot \Theta $$
  其中 $$ X = \begin{bmatrix} 1 & x^{(1)}1 \ 1 & x^{(2)}1 \ 1 & x^{(3)}1 \ \vdots & \vdots \ 1 & x^{(m)}1 \ \end{bmatrix} , \Theta = \begin{bmatrix} \theta_0 \ \theta_1 \ \end{bmatrix}, h(x) = \begin{bmatrix} h\theta(x^{(1)}) \ h\theta(x^{(2)}) \ h\theta(x^{(3)}) \ \vdots \ h\theta(x^{(m)}) \end{bmatrix} $$
  在這里我們對 $ X $ 添加了偏置項 ,$ x_0^{(i)}=1,其中 i = 1,2,...,m $
  這是因為 $ h_{\theta}(x^{(i)}) = \theta_1 x^{(i)} + \theta_0 = \theta_1 \cdot x_1^{(i)} + \theta_0 \cdot x_0^{(i)} = \theta_1 \cdot x_1^{(i)} + \theta_0 \cdot 1 $ 而 $ x_1^{(i)} $ 為訓練樣本集中給出的特征。
  對於代價函數我們可以表示為: $$ J(\theta_0,\theta_1) = \frac{1}{2m} \sum_{i=1}^m(\theta_0+\theta_1 x^{(i)}-y^{(i)})^2 = \frac{1}{2m} [h(x) - y]^T \cdot [h(x)-y] = \frac{1}{2m} [X \cdot \Theta - y]^T[X \cdot \Theta - y] $$
  其中 $$ y = \begin{bmatrix} y^{(1)} \ y^{(2)} \ y^{(3)} \ \vdots \ y^{(m)} \ \end{bmatrix} $$
  我們可以把 $ \sigma = [X \cdot \Theta - y]^T[X \cdot \Theta - y] $ ,因此 $ \sigma $ 是關於 $ \Theta $ 的二次函數。當 $ \frac{\Delta \sigma}{\Delta \Theta} = 0 $ 時,$ \sigma $ 取得最小值。
  因此我們需要直接求解 $ \frac{\Delta \sigma}{\Delta \Theta} = 0 $ ,即求解 $ \frac{\Delta}{\Delta \Theta} [(X \cdot \Theta - y)^T(X \cdot \Theta - y)] = 0 $
   而 $$ \frac{\Delta}{\Delta \Theta} [(X \cdot \Theta - y)^T(X \cdot \Theta - y)] = \frac{\Delta}{\Delta \Theta} [({\Theta}^T X^T - y^T)(X \cdot \Theta - y)] $$
   而 $$ \frac{\Delta}{\Delta \Theta} [({\Theta}^T X^T - y^T)(X \cdot \Theta - y)] = \frac{\Delta}{\Delta \Theta}({\Theta}^T X^T X \Theta - {\Theta}^T X^T y - y^T X \Theta + y^T y) $$
   而 $$ \frac{\Delta}{\Delta \Theta}({\Theta}^T X^T X \Theta - {\Theta}^T X^T y - y^T X \Theta + y^T y) = X^T X \Theta + X^T X \Theta - X^T y - X^T y $$
   因此 $ X^T X \Theta + X^T X \Theta - X^T y - X^T y = 0 $
   則 $ 2X^T X \Theta = 2 X^T y $ ,由於 $ X^T X $ 是方陣,因此 $ \Theta = (X^T X)^{-1} X^T y $
   以上便是使用最小二乘法進行參數求解的過程。另外一般來說,矩陣的逆運算算法復雜度為 $ O(n^3) $ ,當特征數很大時,計算非常耗時。

4.3 以上兩種方法的比較

   梯度下降法:(1)需要選擇學習率 $ \alpha $ (2)需要迭代 (3)即使特征數 $ n $ 很大也能很好地工作。
   最小二乘法:(1)不需要選擇學習率 $ \alpha $ (2)不需要迭代 (3)需要計算矩陣的逆,當特征數 $ n $ 很大時,計算速度很慢。


5. 多元線性回歸

5.1 多元線性回歸模型

   對於多元線性回歸模型,對訓練樣本集擬合時不再是一條“直線”,而是“面”或者“超平面”。
   擬合的方程為:$$ h_{\theta}(x^{(i)}) = \theta_0 + \theta_1 x_1^{(i)} +\theta_2 x_2^{(i)} + ... +\theta_n x_n^{(i)} $$
   其中 $ i = 1,2,...,m $ 表示第 $ i $ 個訓練樣本。
   或者記為:$$ h(x^{(i)}) = (X^{(i)})^T \cdot \Theta $$
  其中 $ m $ 表示訓練樣本數, $ n $ 表示特征數。

\[(X^{(i)})^T = \begin{bmatrix} 1 & x^{(i)}_1 & \cdots & x^{(i)}_n \\ \end{bmatrix} , \Theta = \begin{bmatrix} \theta_0 \\ \theta_1 \\ \vdots \\ \theta_n \\ \end{bmatrix} \]

  在此我們同樣添加了偏置項 $ x_0^{(i)} = 1 $ 相關解釋不再贅述。

5.2 損失函數定義

   對於多元線性回歸模型,其損失函數定義為: $$ J(\theta_0,\theta_1, ..., \theta_n) = \frac{1}{2m} \sum_{i=1}^m(h_{\theta}(X)-y)^2 $$
  其中 $$ h_\theta(X) = \begin{bmatrix} h_\theta(x^{(1)}) \ h_\theta(x^{(2)}) \ h_\theta(x^{(3)}) \ \vdots \ h_\theta(x^{(m)}) \end{bmatrix} , y = \begin{bmatrix} y^{(1)} \ y^{(2)} \ y^{(3)} \ \vdots \ y^{(m)} \ \end{bmatrix} $$

5.3 優化算法--梯度下降法

  其算法過程為:
   repeat {
        $ \theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^m (h_{\theta}(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} $
   }
  其中 $ i = 1,2,...,m,表示樣本數 ; j = 1,2,..,n,表示特征數 $
   梯度的計算過程同一元線性回歸中的梯度求解過程。


引用及參考:
[1]《機器學習》周志華著
[2] https://blog.csdn.net/perfect_accepted/article/details/78383434

寫在最后:本文參考以上資料進行整合與總結,屬於原創,文章中可能出現理解不當的地方,若有所見解或異議可在下方評論,謝謝!
若需轉載請注明https://www.cnblogs.com/lliuye/p/9120839.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM