回顧
在【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,)
繪圖: