gpt4 book ai didi

python - 如何在 Python 中调用 scipy.optimize.fmin_cg(func) 的函数

转载 作者:太空宇宙 更新时间:2023-11-04 10:42:38 24 4
gpt4 key购买 nike

我简单的简单说明一下这个问题。此问题与 scipy.doc 中所示的完全相似.问题出在错误发生上,因为需要浮点参数,而不是 numpy.ndarray

我有什么:

  • 函数:y = s*z^t

可变长度/尺寸

  • t - 1...m,
  • s - 1...m 和 1...n。因此,m 是行号,n - 列号。
  • z - 1...n.
  • y - 这可以是 y 1 , y[2], y[3], ..., y[m],
  • T - s[m,n] 矩阵

像这样:

  1. y[1] = s[1][1]*z[1]^t[1]+s[1][2]*z[2]^t[1]+ ...s[1][n]*z[n]^t[1])

  2. y[2] = s[2][1]*z[1]^t[2]+s[2][2]*z[2]^t[2]+ ...s[2][n]*z[n]^t[2])

    ...

  3. y[m] = s[m][1]*z[1]^t[m]+s[m][2]*z[2]^t[2]+ ...s[m][n]*z[n]^t[m])

问题:发生错误。

Optimization terminated successfully.

Traceback (most recent call last):
solution = optimize.fmin_cg(func, z, fprime=gradf, args=args)
File "C:\Python27\lib\site-packages\scipy\optimize\optimize.py", line 952, in fmin_cg
res = _minimize_cg(f, x0, args, fprime, callback=callback, **opts)
File "C:\Python27\lib\site-packages\scipy\optimize\optimize.py", line 1072, in _minimize_cg
print " Current function value: %f" % fval
TypeError: float argument required, not numpy.ndarray

这是代码

import numpy as np
import scipy as sp
import scipy.optimize as optimize

def func(z, *args):
y,T,t = args[0]
return y - counter(T,z,t)

def counter(T, z, t):
rows,cols = np.shape(T)
res = np.zeros(rows)
for i,row_val in enumerate(T):
res[i] = np.dot(row_val, z**t[i])
return res


def gradf(z, *args):
y,T,t = args[0]
return np.dot(t,counter(T,z,t-1))

def main():
# Inputs
N = 30
M = 20
z0 = np.zeros(N) # initial guess
y = 30*np.random.random(M)
T = 10*np.random.random((M,N))
t = 5*np.random.random(M)
args = [y, T, t]

solution = optimize.fmin_cg(func, z0, fprime=gradf, args=args)
print 'solution: ', solution

if __name__ == '__main__':
main()

我也试图找到类似的例子,但找不到非常相似的东西。这是供您考虑的代码。提前致谢。

最佳答案

问题的根源在于 fmin_cg 期望函数返回失配的单个标量值而不是数组。

基本上,您想要的东西有点类似于:

def func(z, y, T, t):
return np.linalg.norm(y - counter(T,z,t))

我在这里使用 np.linalg.norm 因为 numpy 中没有用于均方根的内置函数。实际 RMS 将是 norm(x)/sqrt(x.size),但对于最小化,常数乘数没有任何区别。

您的代码中还有其他小问题(例如 args[0] 将成为单个项目。您需要 y, T, t = args 或更好的是,只是 func(z, y, T, t))。你的渐变函数对我来说没有任何意义,但无论如何它都是可选的。此外,解决方案目前无法产生合理的值,因为您正在针对纯噪声对其进行测试。不过,我认为这些只是占位符值。

但是,你有一个更大的问题。你试图在 30 维空间中最小化。大多数非线性求解器都不能很好地处理那么高的维度。它可能工作正常,但您很可能会遇到问题。

综上所述,您可能会发现使用 scipy.optimize.curve_fit 界面比使用其他界面更直观,如果您可以使用 LM 而不是 CG(他们' re 相当相似的方法)。


最后一件事:您正在尝试通过 20 个观测值求解 30 个模型参数。这是一个欠定的问题。这个问题没有唯一解。您将需要应用一些先验知识来获得合理的答案。

关于python - 如何在 Python 中调用 scipy.optimize.fmin_cg(func) 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19644698/

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