基于Python fminunc 的替代方法


Posted in Python onFebruary 29, 2020

最近闲着没事,想把coursera上斯坦福ML课程里面的练习,用Python来实现一下,一是加深ML的基础,二是熟悉一下numpy,matplotlib,scipy这些库。

在EX2中,优化theta使用了matlab里面的fminunc函数,不知道Python里面如何实现。搜索之后,发现stackflow上有人提到用scipy库里面的minimize函数来替代。我尝试直接调用我的costfunction和grad,程序报错,提示(3,)和(100,1)dim维度不等,gradient vector不对之类的,试了N多次后,终于发现问题何在。。

首先来看看使用np.info(minimize)查看函数的介绍,传入的参数有:

fun : callable
 The objective function to be minimized.
 
  ``fun(x, *args) -> float``
 
 where x is an 1-D array with shape (n,) and `args`
 is a tuple of the fixed parameters needed to completely
 specify the function.
x0 : ndarray, shape (n,)
 Initial guess. Array of real elements of size (n,),
 where 'n' is the number of independent variables.
args : tuple, optional
 Extra arguments passed to the objective function and its
 derivatives (`fun`, `jac` and `hess` functions).
method : str or callable, optional
 Type of solver. Should be one of
 
  - 'Nelder-Mead' :ref:`(see here) <optimize.minimize-neldermead>`
  - 'Powell'  :ref:`(see here) <optimize.minimize-powell>`
  - 'CG'   :ref:`(see here) <optimize.minimize-cg>`
  - 'BFGS'  :ref:`(see here) <optimize.minimize-bfgs>`
  - 'Newton-CG' :ref:`(see here) <optimize.minimize-newtoncg>`
  - 'L-BFGS-B' :ref:`(see here) <optimize.minimize-lbfgsb>`
  - 'TNC'   :ref:`(see here) <optimize.minimize-tnc>`
  - 'COBYLA'  :ref:`(see here) <optimize.minimize-cobyla>`
  - 'SLSQP'  :ref:`(see here) <optimize.minimize-slsqp>`
  - 'trust-constr':ref:`(see here) <optimize.minimize-trustconstr>`
  - 'dogleg'  :ref:`(see here) <optimize.minimize-dogleg>`
  - 'trust-ncg' :ref:`(see here) <optimize.minimize-trustncg>`
  - 'trust-exact' :ref:`(see here) <optimize.minimize-trustexact>`
  - 'trust-krylov' :ref:`(see here) <optimize.minimize-trustkrylov>`
  - custom - a callable object (added in version 0.14.0),
   see below for description.
 
 If not given, chosen to be one of ``BFGS``, ``L-BFGS-B``, ``SLSQP``,
 depending if the problem has constraints or bounds.
jac : {callable, '2-point', '3-point', 'cs', bool}, optional
 Method for computing the gradient vector. Only for CG, BFGS,
 Newton-CG, L-BFGS-B, TNC, SLSQP, dogleg, trust-ncg, trust-krylov,
 trust-exact and trust-constr. If it is a callable, it should be a
 function that returns the gradient vector:
 
  ``jac(x, *args) -> array_like, shape (n,)``
 
 where x is an array with shape (n,) and `args` is a tuple with
 the fixed parameters. Alternatively, the keywords
 {'2-point', '3-point', 'cs'} select a finite
 difference scheme for numerical estimation of the gradient. Options
 '3-point' and 'cs' are available only to 'trust-constr'.
 If `jac` is a Boolean and is True, `fun` is assumed to return the
 gradient along with the objective function. If False, the gradient
 will be estimated using '2-point' finite difference estimation.

需要注意的是fun关键词参数里面的函数,需要把优化的theta放在第一个位置,X,y,放到后面。并且,theta在传入的时候一定要是一个一维shape(n,)的数组,不然会出错。

然后jac是梯度,这里的有两个地方要注意,第一个是传入的theta依然要是一个一维shape(n,),第二个是返回的梯度也要是一个一维shape(n,)的数组。

总之,关键在于传入的theta一定要是一个1D shape(n,)的,不然就不行。我之前为了方便已经把theta塑造成了一个(n,1)的列向量,导致使用minimize时会报错。所以,学会用help看说明可谓是相当重要啊~

import numpy as np
import pandas as pd
import scipy.optimize as op
 
def LoadData(filename):
 data=pd.read_csv(filename,header=None)
 data=np.array(data)
 return data
 
def ReshapeData(data):
 m=np.size(data,0)
 X=data[:,0:2]
 Y=data[:,2]
 Y=Y.reshape((m,1))
 return X,Y
 
def InitData(X):
 m,n=X.shape
 initial_theta = np.zeros(n + 1)
 VecOnes = np.ones((m, 1))
 X = np.column_stack((VecOnes, X))
 return X,initial_theta
 
def sigmoid(x):
 z=1/(1+np.exp(-x))
 return z
 
def costFunction(theta,X,Y):
 m=X.shape[0]
 J = (-np.dot(Y.T, np.log(sigmoid(X.dot(theta)))) - \
   np.dot((1 - Y).T, np.log(1 - sigmoid(X.dot(theta))))) / m
 return J
 
def gradient(theta,X,Y):
 m,n=X.shape
 theta=theta.reshape((n,1))
 grad=np.dot(X.T,sigmoid(X.dot(theta))-Y)/m
 return grad.flatten()
 
if __name__=='__main__':
 data = LoadData('ex2data1csv.csv')
 X, Y = ReshapeData(data)
 X, initial_theta = InitData(X)
 result = op.minimize(fun=costFunction, x0=initial_theta, args=(X, Y), method='TNC', jac=gradient)
 print(result)

最后结果如下,符合MATLAB里面用fminunc优化的结果(fminunc:cost:0.203,theta:-25.161,0.206,0.201)

fun: array([0.2034977])
  jac: array([8.95038682e-09, 8.16149951e-08, 4.74505693e-07])
 message: 'Local minimum reached (|pg| ~= 0)'
 nfev: 36
  nit: 17
 status: 0
 success: True
  x: array([-25.16131858, 0.20623159, 0.20147149])

此外,由于知道cost在0.203左右,所以我用最笨的梯度下降试了一下,由于后面实在是太慢了,所以设置while J>0.21,循环了大概13W次。。可见,使用集成好的优化算法是多么重要。。。还有,在以前的理解中,如果一个学习速率不合适,J会一直发散,但是昨天的实验发现,有的速率开始会发散,后面还是会收敛。

以上这篇基于Python fminunc 的替代方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 的 with 语句详解
Jun 13 Python
Python比较两个图片相似度的方法
Mar 13 Python
Python实现破解12306图片验证码的方法分析
Dec 29 Python
Flask入门之上传文件到服务器的方法示例
Jul 18 Python
python获取地震信息 微信实时推送
Jun 18 Python
Python使用APScheduler实现定时任务过程解析
Sep 11 Python
Django之使用celery和NGINX生成静态页面实现性能优化
Oct 08 Python
python orm 框架中sqlalchemy用法实例详解
Feb 02 Python
python3安装OCR识别库tesserocr过程图解
Apr 02 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
Apr 14 Python
Python使用Matlab命令过程解析
Jun 04 Python
如何基于Python爬取隐秘的角落评论
Jul 02 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
Feb 29 #Python
使用python求解二次规划的问题
Feb 29 #Python
Python龙贝格法求积分实例
Feb 29 #Python
python计算导数并绘图的实例
Feb 29 #Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
Feb 29 #Python
Pytorch对Himmelblau函数的优化详解
Feb 29 #Python
Pytorch中的自动求梯度机制和Variable类实例
Feb 29 #Python
You might like
php 传值赋值与引用赋值的区别
2010/12/29 PHP
php获取url参数方法总结
2014/11/13 PHP
PHP7创建COOKIE和销毁COOKIE的实例方法
2020/02/03 PHP
获取表单控件原始(初始)值的方法
2013/08/21 Javascript
jquery与js函数冲突的两种解决方法
2013/09/09 Javascript
扩展IE中一些不兼容的方法如contains、startWith等等
2014/01/09 Javascript
javascript工厂方式定义对象
2014/12/26 Javascript
JS两个数组比较,删除重复值的巧妙方法(推荐)
2016/06/03 Javascript
JQuery ZTree使用方法详解
2017/01/07 Javascript
Bootstrap 3浏览器兼容性问题及解决方案
2017/04/11 Javascript
深入浅析JavaScript中的RegExp对象
2017/09/18 Javascript
JS 实现微信扫一扫功能
2018/09/14 Javascript
在Web关闭页面时发送Ajax请求的实现方法
2019/03/07 Javascript
微信小程序实现订单倒计时
2020/11/01 Javascript
浅析Vue下的components模板使用及应用
2019/11/27 Javascript
node.js中module模块的功能理解与用法实例分析
2020/02/14 Javascript
DWR内存兼容及无法调用问题解决方案
2020/10/16 Javascript
python冒泡排序简单实现方法
2015/07/09 Python
vue.js实现输入框输入值内容实时响应变化示例
2018/07/07 Python
python将字符串转变成dict格式的实现
2019/11/18 Python
利用Python代码实现一键抠背景功能
2019/12/29 Python
python3中布局背景颜色代码分析
2020/12/01 Python
Numpy中的数组搜索中np.where方法详细介绍
2021/01/08 Python
详解Python openpyxl库的基本应用
2021/02/26 Python
基于PyInstaller各参数的含义说明
2021/03/04 Python
CSS3 box-shadow属性实例详解
2020/06/19 HTML / CSS
Delphi CS笔试题
2014/01/04 面试题
求职者应聘的自我评价
2013/10/16 职场文书
英语专业推荐信
2013/11/16 职场文书
求职简历中的自我评价分享
2013/12/08 职场文书
文秘应聘自荐书范文
2014/02/18 职场文书
激情洋溢的毕业生就业求职信
2014/03/15 职场文书
歌颂祖国的演讲稿
2014/05/04 职场文书
逃课检讨书
2015/01/26 职场文书
紫日观后感
2015/06/05 职场文书
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang