关于scipy.optimize函数使用及说明
作者:大虾飞哥哥 发布时间:2022-10-19 04:24:04
scipy.optimize函数使用
简单使用scipy.optimize,训练逻辑回归损失函数,得到权值。
scipy.optimize模块包含什么?
该scipy.optimize包提供几种常用的优化算法。可以使用详细列表: scipy.optimize(也可以通过help(scipy.optimize)找到)。
该模块包含:
1、使用多种算法(例如BFGS,Nelder-Mead单形,牛顿共轭梯度,COBYLA或SLSQP)对多元标量函数进行无约束和无约束的最小化(最小化)
2、全局(强力)优化例程(例如,盆地跳动,differential_evolution)
3、最小二乘最小化(least_squares)和曲线拟合(curve_fit)算法
4、标量单变量函数最小化器(minimum_scalar)和根查找器(牛顿)
5、使用多种算法(例如,混合鲍威尔,莱文贝格-马夸特或大型方法,例如牛顿-克里洛夫)的多元方程组求解器(root)。
使用步骤
1、函数介绍
import numpy as np
from scipy.optimize import minimize
函数入参:
scipy.optimize.minimize(
fun, #可调用的目标函数。
x0, #ndarray,初值。(n,)
args=(), #额外的参数传递给目标函数及其导数
method=None, #类型的解算器。应该是其中之一:
#‘Nelder-Mead'、‘Powell'
#‘CG'、‘BFGS'
#‘Newton-CG'、‘L-BFGS-B'
#‘TNC'、‘COBYLA'
#‘SLSQP'、‘dogleg'
#‘trust-ncg'
jac=None, #目标函数的雅可比矩阵(梯度向量)。
#仅适用于CG, BFGS, Newton-CG,
#L-BFGS-B, TNC, SLSQP, dogleg,
#trust-ncg。如果jac是一个布尔值,
#且为True,则假定fun将随目标函数返回
#梯度。如果为False,则用数值方法估计梯
#度。Jac也可以是返回目标梯度的可调用对
#象。在这种情况下,它必须接受与乐趣相同
#的论点。
hess=None,
hessp=None,#目标函数的Hessian(二阶导数矩阵)或
#目标函数的Hessian乘以任意向量p。
#仅适用于Newton-CG, dogleg,
#trust-ncg。只需要给出一个hessp或
#hess。如果提供了hess,则将忽略
#hessp。如果不提供hess和hessp,则用
#jac上的有限差分来近似Hessian积。
#hessp必须计算Hessian乘以任意向量。
bounds=None, #变量的边界(仅适用于L-BFGS-B,
#TNC和SLSQP)。(min, max)
#对x中的每个元素,定义该参数的
#边界。当在min或max方向上没有边界
#时,使用None表示其中之一。
constraints=(), #约束定义
#(仅适用于COBYLA和SLSQP)
tol=None, #终止的边界。
callback=None,
options=None)
返回值: res : OptimizeResult
#以OptimizeResult对象表示的优化结果。重要的属性有:x是解决方案数组,
#success是一个布尔标志,指示优化器是否成功退出,以及描述终止原因的消息。
使用scipy.optimize进行优化
首先看一看这个函数的形式
scipy.optimize.fmin_cg(f, x0, fprime=None, args=(), gtol=1e-05, norm=inf, epsilon=1.4901161193847656e-08, maxiter=None, full_output=0, disp=1, retall=0, callback=None)
f
: 可调用,f(x, *args)
要最小化的目标函数。这里 x 必须是在搜索最小值时要更改的变量的一维数组,而 args 是 f 的其他(固定)参数。
x0
: ndarray
用户提供的 xopt 初始估计值,即 x 的最优值。它必须是一维值数组。
fprime
: 可调用,fprime(x, *args),可选
返回 f 在 x 处的梯度的函数。这里 x 和 args 与上面对 f 的说明相同。返回的值必须是一维数组。默认为 None,在这种情况下,梯度是数值近似的(参见下面的 epsilon)。
args
: 元组,可选
传递给的参数值f和fprime.当需要额外的固定参数来完全指定函数时,必须提供f和fprime.
gtol
:浮点数,可选
当梯度的范数小于 gtol 时停止。
norm
: 浮点数,可选
用于梯度范数的顺序(-np.Inf 是最小值,np.Inf 是最大值)。
epsilon
: float 或 ndarray,可选
何时使用的步长fprime是数值近似的。可以是标量或一维数组。默认为sqrt(eps), 用 eps 表示浮点机器精度。通常sqrt(eps)约为 1.5e-8。
maxiter
: int 可选
要执行的最大迭代次数。默认为 200 * len(x0) 。
full_output
: 布尔型,可选
如果为 True,除了 xopt 之外,还返回 fopt、func_calls、grad_calls 和 warnflag。有关可选返回值的更多信息,请参阅下面的返回部分。
disp
: 布尔型,可选
如果为 True,则返回收敛消息,然后是 xopt。
retall
: 布尔型,可选
如果为 True,则将每次迭代的结果添加到返回值中。
callback
: 可调用的,可选的
一个可选的用户提供的函数,在每次迭代后调用。称为callback(xk),其中xk是的当前值x0.
下面是返回值
xopt
: ndarray
最小化 f 的参数,即 f(xopt) == fopt 。
fopt
: 浮点数,可选
找到最小值,f(xopt)。仅在 full_output 为 True 时返回。
func_calls
: int 可选
function_calls 的数量。仅在 full_output 为 True 时返回。
grad_calls
: int 可选
进行的梯度调用次数。仅在 full_output 为 True 时返回。
warnflag
: int 可选
带有警告状态的整数值,仅在 full_output 为 True 时返回。
0:成功。
1:超过最大迭代次数。
2 梯度和/或函数调用没有改变。可能表明该精度丢失了,即例程没有收敛。
3:遇到NaN 结果。
allvecs
: ndarray 列表,可选
数组列表,包含每次迭代的结果。只有当retall 为True 时才返回。
下面是一个实际运行的实例
from scipy import optimize
args = (2, 3, 7, 8, 9, 10)
def f(x,*args): # args是该函数需要用到的其他值
u,v=x
a,b,c,d,e,f=args
return a*u**2 + b*u*v + c*v**2 + d*u + e*v + f
def gradf(x,*args):
u,v=x
a, b, c, d, e, f = args
gu=2*a*u+b*v+d
gv=b*u+2*c*v+e
return np.asarray((gu,gv))
x0 = np.asarray((0, 0)) # 迭代的初始点
res = optimize.fmin_cg(f, x0, fprime=gradf, args=args,full_output=True)
# 直接运行的话就会出现下面的东西
'''
Optimization terminated successfully.
Current function value: 1.617021
Iterations: 4
Function evaluations: 8
Gradient evaluations: 8
'''
# print(res) # [-1.80851064 -0.25531915] # 这是没有添加full_output=True的时候
# print(type(res)) # <class 'numpy.ndarray'>
# 添加过之后full_output=True
print(res) # (array([-1.80851064, -0.25531915]), 1.6170212765957448, 8, 8, 0)
print(type(res)) # <class 'tuple'>
# 第一个是代表最小化后的自变量的参数
# 第二个是函数的最小值
# 第三个是函数调用的次数
# 第四个是梯度调用的次数
# 第五个是带有警告状态的整数值,返回0表示成功
来源:https://blog.csdn.net/xu624735206/article/details/117320847
猜你喜欢
- PHP addslashes() 函数实例在每个双引号(")前添加反斜杠:<?php $str = addslashes(&
- 之前一直在windows环境使用pycharm加上virtualenv方式开发,最近由于本地多个virtualenv比较混乱,所以尝试切换a
- 注:使用的是Python2.7。一、实例方法实例方法就是类的实例能够使用的方法。如下:class Foo:  
- # 递归满足的条件# 1.自己调用自己# 2.必须有一个明确的结束条件# 优点:逻辑简单\定义简单# 缺点:防止内存消耗过多,容易导致栈溢出
- 如下所示:# 创建一个空的 DataFramedf_empty = pd.DataFrame()#或者df_empty = pd.DataF
- 本文实例讲述了Python面向对象类的继承。分享给大家供大家参考,具体如下:一、概述面向对象编程 (OOP) 语言的一个主要功能就是“继承”
- 平时在PL/SQL中的编程中遇到一些问题,这里以问答的形式来进行把它们总结下来,以供大家分享。1、当需要向表中装载大量的数据流或者需要处理大
- 一、利用Google API生成二维码Google提供了较为完善的二维码生成接口,调用API接口很简单,以下是调用代码:$urlToEnco
- 前言:pandas 中的索引意味着只需从系列中选择特定数据。索引可能意味着选择所有数据,其中一些数据来自特定列。索引也可以称为子集选择。使用
- 只是做笔记,没什么!! 代码如下:--创建测试表 CREATE TABLE [dbo].[Student]( [ID] [int
- 这段时间服务器崩溃2次,一直没有找到原因,今天看到论坛发出的错误信息邮件,想起可能是mysql的默认连接数引起的问题,一查果然,老天,默认
- 一、文章概述本文将要讲述的是Python环境下如何用OpenCV检测人脸,本文的主要内容分为:1、检测图片中的人脸2、实时检测视频中出现的人
- PHP get_html_translation_table() 函数实例输出 htmlspecialchars 函数使用的翻译表:<
- Sample:http://www.happyshow.org/sample/20060613/nav/nav.html<!DOCTY
- andot提出问题:在做 ajax 编程时,我们常常需要将 xmlhttp 获取到的页面内容通过 innerHTML 来赋给某个容器(比如
- 在最近一次项目有一个需求,点击按钮——异步提交——异步响应返回——根据响应返回值新开窗口。这有两个要点:异步响应之前不知道要打开窗口的URL
- 在编写 XMLHttpRequest 请求时,需要掌握服务器端返回的内容。针对 Firefox 浏览器,我们常用的 Firebug 就能非常
- 本文实例讲述了python实现的简单窗口倒计时界面。分享给大家供大家参考。具体分析如下:下面的代码通过Tkinter制作windows窗口界
- Line plotsAxes3D.plot(xs, ys, *args, **kwargs)绘制2D或3D数据参数描述xs, ysX轴,Y轴
- 因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。当然,其它字段可以辅助我们在执行这些操作时消除共