使用scipy.optimize进行优化

使用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表示成功

参考链接

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值