0

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

但是我不断收到以下错误:

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

我可以说这个问题与我的论点有关,但我不确定如何纠正它。我也尝试定义一个函数,而不是一个 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)
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)``.

因此,第三个参数 ,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,))

将被调用,相当于

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