Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中调用scipy.optimize.fmin_cg(func)的函数_Python_Numpy_Scipy - Fatal编程技术网

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

如何在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[

我将简要地解释这个问题。此问题与中所示完全相似。问题在于错误发生,因为需要浮点参数,而不是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[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
    。也许换个公司怎么样