【002】迴歸之高級優化“BFGS”

回顧

【001】Python實現,單一變量的線性迴歸問題中,已經用Python簡單實現了單變量的線性迴歸和梯度下降問題。

BFGS

Scipy類庫中,已經實現了很多算法,BFGS L-BFGS等,這些類庫幫助我們快速解決問題,而不需要自己進行復雜的編碼,有時候也不一定要完全瞭解其內部的原理。因爲涉及到很多高深的數學知識。

如何調用

首先看一下scipy的官方文檔對optimize(最優化)的解釋說明
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html#scipy.optimize.minimize

scipy.optimize.minimize(fun,x0,args =(),method = None,jac = None,hess = None,hessp = None,bounds = None,constraints =(),tol = None,callback = None,options = None )

param name description
fun fun(theta, *args) -> float ,首參數爲theta,返回一個浮點數,即計算costFunction
x0 Array shape(2,),初步猜測,即傳入fun中的theta
args 元組,傳入fun函數需要的其他參數
method string ‘L-BFGS-B’ ‘BFGS’ 等等,詳情看官方文檔
其他 看文檔說明

對於之前寫的那段代碼,我們需要修改一些地方
首先按照官方要求,需要把theta參數放在第一位

def CostFunction(theta,X,y):
    '''
        h(x) = X * theta.T
        Cost =1/(2m)*sum[(h(x) - y)^2]
    '''
    len = X.shape[0]
    j = np.power(X.dot(np.transpose(theta)) - y,2)
    return np.sum(j) / (2 * len)

然後再導入必要的包,並且調用minimize

import scipy as sp
    from scipy.optimize import minimize
    mini = minimize(CostFunction,
                   x0=theta,
                   args=(X,boston_target),
                   method='BFGS')
    print(mini)

打印結果:
      fun: 14.733068874736421
 hess_inv: array([[ 1.24250516e+01, -1.69448468e-01],
       [-1.69448468e-01,  2.51313376e-03]])
      jac: array([ 1.19209290e-07, -4.29153442e-06])
  message: 'Optimization terminated successfully.'
     nfev: 32
      nit: 6
     njev: 8
   status: 0
  success: True
        x: array([31.27662827, -0.12489439])
        x就是擬合後的theta係數 shape:(2,)

繪圖:
在這裏插入圖片描述

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