線性回歸預測算法


單變量的線性回歸非常容易理解,就是生成一元一次方程:

y=ax+b。x表示自變量,特征屬性的值;y表示因變量,預測標簽的值。
二維圖像更直觀:x是橫坐標,y是縱坐標,a是斜率,b是與縱坐標的截距。
樣本的坐標點有限,也不會都在一條直線上。如何擬合一條合理的直線,本文會詳細解析。
 
看懂一元一次方程的推導,就不難理解多元一次方程、一元m次方程、多元m次方程。后面的就不解析了。
不管幾元幾次,都可以直接調用sklearn庫相關模塊: sklearn.linear_model和sklearn.preprocessing
sklearn.linear_modlel封裝的是線性函數:
• 普通線性回歸函數( LinearRegression ) 
• 嶺回歸(Ridge) 
• Lasso(Lasso)
sklearn.preprocessing封裝的是非線性函數:
• 多項式回歸(PolynomialFeatures)
 
在實際項目中非線性回歸遠遠多於線性回歸。多項式回歸實際上是先將變量X處理成多項式特征,然后使用線性模型學習多項式特征的參數,以達到多項式回歸的目的。例如:X = [x1, x2]
1.使用PolynomialFeatures構造X的二次多項式特征X_Poly:
X_Poly=[x1,x2,x1x2,x1^2,x2^2]
2.使用linear_model學習X_Poly和y之間的映射關系。
多項式回歸的最大優點是可以通過增加x的高次項對樣本進行逼近,直至滿意為止。
PolynomialFeatures(degree=4)表示4次項,PolynomialFeatures(degree=9)表示9次項。
degree設置過高,會讓樣本看起來完全擬合,其實就是過擬合現象。過擬合會導致新樣本嚴重失真。
合理設置degree,可以加大測試樣本比較損失函數來挑選[1,10]間的自然數。也可以考慮矯正擬合方法: https://www.jianshu.com/p/f238457f505b 

 

單變量線性回歸推導示例:
項目案例:某商企開業初期,在不同試點安排了若干名地推人員,推銷會員活動。
該商企想分析下地推人員數量和賣出會員數量的關系,以便后期類似活動時提前部署。
數據信息如下(為了推演方便,僅選取5條數據):
地推人員數量 賣出會員數量
       1        14
       2        24
       2        18
       1        17
       3        27
     
將地推人員數量作為自變量X,賣出會員數量當做因變量Y,坐標軸上幾個點的圖形:
線性回歸預測算法
 
這幾個點上下交錯,相互連接是構不成一條直線的。如何構建線性模型 y = ax + b 呢?
這里就要提到線性回歸的平方和損失函數:  
線性回歸預測算法
Yi是樣本真實值,Y'i是樣本預測值,n表示樣本數量。
如果這條直線和各個點之間的距離損失和達到最小,那它就是最優直線。也就是對損失函數求最小值。
線性回歸預測算法
對損失函數求最小值就是運用的最小二乘法思想:最小表示min,二乘表示平方。
兩點之間的距離更容易想到絕對值,用平方是因為比起取絕對值,更便於數據計算處理。
 
因為Yi=a*Xi+b,所以需要求解的是:
線性回歸預測算法
 
直接看求解答案:

機器學習簡單線性回歸模型

機器學習簡單線性回歸模型

橫線頭代表樣本均值,通過上面的公式可以計算得到a和b,從而得到線性方程 y = ax + b 。
  

應用層面可以直接拿公式套,甚至公式也不用記,開源庫都封裝好了方法,傳入樣本數據即可得方程式。

本着不光知其然還要知其所以然的態度,查閱了一些資料,總結成自己最易理解的語言闡述下求解過程。

 

求解過程:

令f(x,y)=∑(Yi-(a*Xi+b))^2,將樣本點代入,並將a、b轉為常見的x、y變量。得出:

f(x,y)=(1x+y-14)^2+ (2x+y-24)^2+ (2x+y-18)^2 + (1x+y-17)^2+ (3x+y-27)^2 

f(x,y)是一個二元二次分布式,看一下它的三維圖像:

線性回歸預測算法

上圖x、y坐標顯示很清晰,但是z坐標不立體,換個角度看:

線性回歸預測算法

從上圖可以看出,這個圖像是有谷底的,谷底就是f(x,y)的最小值。

在谷底處,不管x坐標,還是y坐標,其斜率都是0,也就是x和y的導數都是0。

所以,求f(x,y)的最小值就是求x導數=0和y導數=0。這個結論是重點、重點、重點!

為什么強調它,是因為查閱的N多文章都直接拋出:求f(x,y)的最小值就是求x和y的導數。這句話有2個問題:

一、怎么得出這個結論的?

二、x和y的導數是個函數,f(x,y)的最小值應該是個固定值,怎么能划等號?

后來看到一篇嚴謹的文章說:求f(x,y)的最小值是求x和y的導數等於0,並不能僅僅說求x和y的導數。

問題二解決了,可是問題一依然困惑。

一元二次方程求極值=求一元變量導數等於0,這個容易理解是因為拋物線的圖像深入我心。

那不如類比一下,看看二元二次方程的圖像吧。這才有了上面兩個三維圖像的來源。用python Axes3D畫的。

看這個圖像就很容易理解為什么要求導、為什么求兩個變量的、為什么導數應該等於0了!

 

現在來重溫下求導的知識點:

  • 基本求導公式
       給出自變量增量     ;
       得出函數增量  ;
       作商  ;
       求極限

       比如 y=x^2,求y的導數,按照上述步驟:

        Δy=(x+Δx)^2-x^2=2xΔx+Δx^2 ;Δy/Δx=2x+Δx ;Δx趨於0,所以y的導數=2x。

  • 導數的四則運算法則

       (u+v)'=u'+v'

       (u-v)'=u'-v'

       (uv)'=u'v+uv'

       (u/v)'=(u'v-uv')/v^2

  • 復合函數維度下降法求導

       f[g(x)]中,設g(x)=u,則f[g(x)]=f(u),f'[g(x)]=f'(u)*g'(x)

       比如y=(3x-2)^2,令y=u^2,u=3x-2. y'(x)=y'(u)*u'(x)=2*(3x-2)*3=18x-12.

 

現在可以對 f(x,y)=(1x+y-14)^2+ (2x+y-24)^2+ (2x+y-18)^2 + (1x+y-17)^2+ (3x+y-27)^2 求導了 :

x導數=2*(x+y-14)*1+2*(2x+y-24)*2+2*(2x+y-18)*2+2*(x+y-17)*1+2*(3x+y-27)*3

y導數=2*(x+y-14)*1+2*(2x+y-24)*1+2*(2x+y-18)*1+2*(1x+y-17)*1+2*(3x+y-27)*1

目的是求得x導數=0、y導數=0時的x、y值。即:

(x+y-14)+(2x+y-24)*2+(2x+y-18)*2+(x+y-17)+(3x+y-27)*3=0

(x+y-14)+(2x+y-24)+(2x+y-18)+(x+y-17)+(3x+y-27)=0

即:

19x+9y=196

9x+5y=100

這是一個二元一次方程,很容易求得:x=5.7142,y=9.7142.

 

下面證明簡化版的求解公式是怎么來的:

 分別對a和b求一階偏導,求導后讓其等於0,然后聯立方程組解得參數a和b。

機器學習簡單線性回歸模型

機器學習簡單線性回歸模型

機器學習簡單線性回歸模型

套用這個公式,依然求得:a=5.7142,b=9.7142.

 

看下二元方程圖像求極值的代碼,比較結果是否和求導/套用公式的一致:

import numpy as np

if __name__ == '__main__': 

   x = np.arange(0, 20, 0.1)

   y = np.arange(0, 20, 0.1)

   x, y = np.meshgrid(x, y) 

   z = (1*x+y-14)**2+ (2*x+y-24)**2+ (2*x+y-18)**2 + (1*x+y-17)**2+ (3*x+y-27)**2      

   q=[]

   for i in range(0,200,1):

      q.append(z[i])

   z=z.flatten()

   w= min(z)

   print ("損失函數的最小值是: "+str(w))

   for i in range(200):

       for j in range(200):

          if q[i][j]==w:

             break

      else: 

          continue

       break

   print ("a、b參數的值分別是: "+str(x[i][j])+" , "+str(y[i][j]))

  輸出:

  損失函數的最小值是: 22.58

  a、b參數的值分別是:5.7 , 9.7

 

這個結果精度不如前面兩個。原因在於x、y坐標移動步長0.1還可以更小。

如果步長太小又會導致性能變差。順着這個思路,就不難理解梯度下降法了。

實際項目都是用計算機的梯度下降法來求極值,所以求導部分理解即可,不用強記。

 

最后看下最優直線長什么樣子吧:

 

 

 

 


免責聲明!

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



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