【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,)

绘图:
在这里插入图片描述

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