gpt4 book ai didi

Python:如何防止Scipy的optimize.minimize函数改变初始猜测x0的形状?

转载 作者:行者123 更新时间:2023-11-30 22:28:53 29 4
gpt4 key购买 nike

我正在尝试实现 Scipy 的优化算法。当我在不输入雅可比梯度函数的情况下实现它时,它工作得很好。我相信输入梯度时遇到的问题是因为最小化函数本身正在改变初始猜测 x0 的形状。您可以从下面代码的输出中看到这一点。

输入:

import numpy as np
from costFunction import *
import scipy.optimize as op

def sigmoid(z):

epsilon = np.finfo(z.dtype).eps

g = 1/(1+np.exp(-z))
g = np.clip(g,epsilon,1-epsilon)
return g

def costFunction(theta,X,y):
m = y.size
h = sigmoid(X@theta)
J = 1/(m)*(-y.T@np.log(h)-(1-y).T@np.log(1-h))
grad = 1/m*X.T@(h-y)
print ('Shape of theta is',np.shape(theta),'\n')
print ('Shape of gradient is',np.shape(grad),'\n')
return J, grad

X = np.array([[1, 3],[5,7]])
y = np.array([[1],[0]])

m,n = np.shape(X)
one_vec = np.ones((m,1))
X = np.hstack((one_vec,X))
initial_theta = np.zeros((n+1,1))

print ('Running costFunction before executing minimize function...\n')
cost, grad = costFunction(initial_theta,X,y) #To test the shape of gradient before calling minimize

print ('Executing minimize function...\n')
Result = op.minimize(costFunction,initial_theta,args=(X,y),method='TNC',jac=True,options={'maxiter':400})

输出:

Running costFunction before executing minimize function...

Shape of theta is (3, 1)
Traceback (most recent call last):

Shape of gradient is (3, 1)

Executing minimize function...

Shape of theta is (3,)

File "C:/Users/#####/minimizeshapechange.py", line 34, in <module>
Shape of gradient is (3, 2)

Result = op.minimize(costFunction,initial_theta,args=(X,y),method='TNC',jac=True,options={'maxiter':400})
File "C:\Users\#####\anaconda3\lib\site-packages\scipy\optimize\_minimize.py", line 453, in minimize
**options)
File "C:\Users\#####\anaconda3\lib\site-packages\scipy\optimize\tnc.py", line 409, in _minimize_tnc
xtol, pgtol, rescale, callback)
ValueError: tnc: invalid gradient vector from minimized function.

Process finished with exit code 1

最佳答案

我不会分析你的精确计算,而是一些评论:

  • (1) 你的梯度被破坏了!
    • scipy 期望 partial derivative生成形状等于您的 x0 的数组。
    • 您的渐变形状为 (3,2),而预期为 (n+1, 1)
    • 与教程中使用scipy.optimize.rosen_der(der =导数)的示例进行比较
  • (2) 看来你的 scipy 版本有点旧,因为我的 (0.19.0) 告诉我:
    • ValueError:tnc:最小化函数的梯度向量无效。

一些支持源代码来自scipy :

if (PyArray_SIZE(arr_grad) != py_state->n)
{
PyErr_SetString(PyExc_ValueError,
"tnc: invalid gradient vector from minimized function.");
goto failure;

备注:上面的代码是 5 年前更改/触及/引入的。如果您在使用列出的代码时确实没有收到此错误(删除了 costFunction 的导入),那么您似乎正在使用 scipy < v0.13.0b1,我不推荐!我假设您正在使用一些已弃用的基于 Windows 的非官方发行版以及过时的 scipy。你应该改变它!

关于Python:如何防止Scipy的optimize.minimize函数改变初始猜测x0的形状?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46507736/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com