我正在尝试学习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)
答案 0 :(得分:2)
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)