簡體   English   中英

如何在Python中調用scipy.optimize.fmin_cg(func)的函數

[英]How to call function for scipy.optimize.fmin_cg(func) in Python

我將簡單地解釋一下這個問題。 此問題與scipy.doc中顯示的完全相似。 問題在於錯誤發生需要float參數,而不是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期望函數返回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(它們是相當類似的方法)沒問題。


最后一件事:你試圖通過20次觀察來解決30個模型參數。 這是一個未確定的問題。 此問題沒有唯一的解決方案。 您將需要應用一些先驗知識來獲得合理的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM