1

簡単に問題を説明します。この問題は、 scipy.docに示されているものとまったく同じです。問題は、numpy.ndarray ではなく float 引数が必要なため、エラーが発生することです。

私が持っているもの:

  • 関数: 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()

私も同様の例を見つけようとしましたが、非常に似たものを見つけることができませんでした。これがあなたの考慮のためのコードです。前もって感謝します。

4

1 に答える 1