如何在Python中调用scipy.optimize.fmin_cg(func)的函数
我将简要地解释这个问题。此问题与中所示完全相似。问题在于错误发生,因为需要浮点参数,而不是numpy.ndarray 我所拥有的:如何在Python中调用scipy.optimize.fmin_cg(func)的函数,python,numpy,scipy,Python,Numpy,Scipy,我将简要地解释这个问题。此问题与中所示完全相似。问题在于错误发生,因为需要浮点参数,而不是numpy.ndarray 我所拥有的: 函数:y=s*z^t 可变长度/尺寸 t-1…m s-1…m和1…n。所以,m是行数,n是列数 z-1…n 这可以是y,y[2],y[3],…,y[m] T-s[m,n]矩阵 像这样: y[1]=s[1][1]*z[1]^t[1]+s[1][2]*z[2]^t[1]+…s[1][n]*z[n]^t[1]) y[2]=s[2][1]*z[1]^t[2]+s[
- 函数:y=s*z^t
- t-1…m
- s-1…m和1…n。所以,m是行数,n是列数
- z-1…n
- 这可以是y,y[2],y[3],…,y[m]
- T-s[m,n]矩阵
y[1]=s[1][1]*z[1]^t[1]+s[1][2]*z[2]^t[1]+…s[1][n]*z[n]^t[1])
y[2]=s[2][1]*z[1]^t[2]+s[2][2]*z[2]^t[2]+…s[2][n]*z[n]^t[2])
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\u 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维空间中最小化。大多数非线性解算器无法在如此高的维数下正常工作。它可能工作得很好,但你很可能会遇到问题
综上所述,如果您对LM而不是CG(它们是相当类似的方法)满意的话,您可能会发现使用scipy.optimize.curve\u fit
界面比使用其他界面更直观
最后一件事:您正试图用20个观测值求解30个模型参数。这是一个未确定的问题。这个问题没有唯一的解决方案。您需要应用一些先验知识才能得到合理的答案。问题的根源在于
fmin\u 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维空间中最小化。大多数非线性解算器无法在如此高的维数下正常工作。它可能工作得很好,但你很可能会遇到问题
综上所述,如果您对LM而不是CG(它们是相当类似的方法)满意的话,您可能会发现使用scipy.optimize.curve\u fit
界面比使用其他界面更直观
最后一件事:您正试图用20个观测值求解30个模型参数。这是一个未确定的问题。这个问题没有唯一的解决方案。你需要运用一些先验知识才能得到一个合理的答案。Kingston:谢谢,但你认为我只搜索了一个分钟点吗?还是N?因为,通过使用func()我只得到一个解,而我应该得到N个解,但我不确定你得到了什么did@Spider-不,我想你正在搜索30个模型参数,给出20个观察值。您的解决方案应该是一个30项的数组,但它将是不稳定的(即非唯一的)。@Spider-另外,我可能误解了您的意图。你知道什么?你不知道什么?金斯顿——我应该告诉你的。我只测量了数据
y
和两个系数s
(或T
),T
,如代码所示。我的未知是z
。也许改变编码风格会怎么样,但是如何改变呢?我不能。再次感谢温金斯顿:谢谢,但你认为我只搜索了一分钟吗?还是N?因为,通过使用func()我只得到一个解,而我应该得到N个解,但我不确定你得到了什么did@Spider-不,我想你正在搜索30个模型参数,给出20个观察值。您的解决方案应该是一个30项的数组,但它将是不稳定的(即非唯一的)。@Spider-另外,我可能误解了您的意图。你知道什么?你不知道什么?金斯顿——我应该告诉你的。我只测量了数据y
和两个系数s
(或T
),T
,如代码所示。我的未知是z
。也许换个公司怎么样