0

Python での最適化について学習しようとしているので、fmin 関数をテストするコードをいくつか書きました。

ただし、次のエラーが表示され続けます。

ValueError: operands could not be broadcast together with shapes (1,2) (100,)

問題は私の議論の次元に関係していると言えますが、それを修正する方法がわかりません。ラムダ関数ではなく、関数を定義しようとしましたが、それでも同じエラーが発生します。

かなり基本的なことだと思いますが、理解できないようです。どんな助けでも大歓迎です!

import numpy as np
import pandas as pd
from scipy.stats.distributions import norm
from scipy.optimize import fmin

x = np.random.normal(size=100)

norm_1 = lambda theta,x: -(np.log(norm.pdf(x,theta[0],theta[1]))).sum()

def norm_2(theta,x):
    mu = theta[0]
    sigma = theta[1]
    ll = np.log(norm.pdf(x,mu,sigma)).sum()
    return -ll

fmin(norm_1,np.array([0,1]),x)

fmin(norm_2,np.array([0,1]),x)
4

1 に答える 1

2

fmin のドキュメントには次のように書かれています。

Definition: fmin(func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None)
...
    args : tuple, optional
        Extra arguments passed to func, i.e. ``f(x,*args)``.

したがって、3 番目の引数argsはタプルである必要があります。

In [45]: fmin(norm_1,np.array([0,1]),(x,))
Warning: Maximum number of function evaluations has been exceeded.
Out[45]: array([-0.02405078,  1.0203125 ])

(x, )は 1 つの要素を含むタプルですx。ドキュメントf(x, *args)によると、呼び出されます。あなたの場合はどういう意味ですか

norm_1(np.array([0,1]), *(x,))

が呼び出されます。これは次と同等です

norm_1(np.array([0,1]), x)
于 2014-12-26T20:01:29.950 に答える