scipy fmin操作数不能与形状一起播放

时间:2014-12-26 19:57:55

标签: python numpy scipy mle

我正在尝试学习Python中的优化,所以我编写了一些代码来测试fmin函数。

但是我一直收到以下错误:

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

我可以说这个问题与我的论点的维度有关,但我不确定如何纠正它。我还试图def函数,而不是lambda函数,但我仍然得到相同的错误。

我确信这是非常基本的东西,但我似乎无法理解它。非常感谢任何帮助!

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)

1 个答案:

答案 0 :(得分:2)

The docs for 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)``.

因此,第三个参数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, )是一个包含一个元素x的元组。 文档说f(x, *args)被调用。在你的情况下意味着什么

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

将被调用,is equivalent to

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