基于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使用循环实现批量创建文件夹示例
Mar 25 Python
Python爬虫番外篇之Cookie和Session详解
Dec 27 Python
Python中getpass模块无回显输入源码解析
Jan 11 Python
python中实现将多个print输出合成一个数组
Apr 19 Python
python操作excel的包(openpyxl、xlsxwriter)
Jun 11 Python
Python subprocess模块功能与常见用法实例详解
Jun 28 Python
在python中pandas的series合并方法
Nov 12 Python
numpy.random模块用法总结
May 27 Python
python 图片去噪的方法示例
Jul 09 Python
python剪切视频与合并视频的实现
Mar 03 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
Nov 25 Python
pandas数值排序的实现实例
Jul 25 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学习笔记之面向对象编程
2012/12/29 PHP
关于crontab的使用详解
2013/06/24 PHP
PHP截取指定图片大小的方法
2014/12/10 PHP
js 分栏效果实现代码
2009/08/29 Javascript
jQuery的each终止或跳过示例代码
2013/12/12 Javascript
解决jquery中美元符号命名冲突问题
2014/01/08 Javascript
jquery浏览器滚动加载技术实现方案
2014/06/03 Javascript
jQuery中hasClass()方法用法实例
2015/01/06 Javascript
jQuery制作仿Mac Lion OS滚动条效果
2015/02/10 Javascript
基于jquery实现全屏滚动效果
2015/11/26 Javascript
第四章之BootStrap表单与图片
2016/04/25 Javascript
动态JavaScript所造成一些你不知道的危害
2016/09/25 Javascript
jQuery获取随机颜色的实例代码
2018/05/21 jQuery
javascript少儿编程关于返回值的函数内容
2018/05/27 Javascript
php中and 和 &amp;&amp;出坑指南
2018/07/13 Javascript
详解vue中axios的封装
2018/07/18 Javascript
推荐一个基于Node.js的表单验证库
2019/02/15 Javascript
vue项目首屏加载时间优化实战
2019/04/23 Javascript
layui 实现表格某一列显示图标
2019/09/19 Javascript
vue配置多代理服务接口地址操作
2020/09/08 Javascript
Vue实现图书管理小案例
2020/12/03 Vue.js
Python判断变量是否已经定义的方法
2014/08/18 Python
Python中使用Boolean操作符做真值测试实例
2015/01/30 Python
Python实现屏幕截图的代码及函数详解
2016/10/01 Python
Python格式化日期时间操作示例
2018/06/28 Python
python微信撤回监测代码
2019/04/29 Python
tensorflow如何批量读取图片
2019/08/29 Python
基于Python实现大文件分割和命名脚本过程解析
2019/09/29 Python
如何基于Python实现word文档重新排版
2020/09/29 Python
python 实现一个图形界面的汇率计算器
2020/11/09 Python
Book Depository美国:全球领先的专业网上书店之一
2019/08/14 全球购物
高中打架检讨书
2014/02/13 职场文书
干部选拔任用方案
2014/05/26 职场文书
年度优秀员工获奖感言
2014/08/15 职场文书
2019最新婚庆对联集锦!
2019/07/10 职场文书
利用Pycharm连接服务器的全过程记录
2021/07/01 Python