回顾
在【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,)
绘图: