这几天我一直在尝试理解
fmin
的参数传递。
这是为了我们的练习而给出的:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import fsolve, fmin
from scipy.misc import derivative
from numpy import array
MU = 1.3
SIGMA = 4.5
N = 1000
N_BINS=20
data = np.random.normal(MU, SIGMA, N)
#print(data)
法线函数的定义(从绘图来看似乎可行):
def normalpdf(x,mu,sigma):
return ((1/(sigma*np.sqrt(2*np.pi)))*(np.exp(-(((x-mu)**2))/(2*sigma**2))))
plt.plot(data, normalpdf(data,MU,SIGMA),'.', color='purple')
似然函数的定义(不确定它是否正确,请参阅下面的注释以及其他学生版本的替代方案,我确实得到了一个图,所以从技术上讲,它是一个工作函数):
def vect_q():
q=[MU,SIGMA]
return q
Logln=0
def LogL(q):
return Logln + (- np.log(normalpdf(data,q[0],q[1])))`
#q=vect_q()
#result_LogL=LogL(q)
#print (result_LogL)
#LnL=sorted(LogL(q))
#plt.plot(LnL)
这是带有
fmin
的块不起作用。查看我尝试过的所有内容,并进一步查看不同的错误消息。
x0 = 1
q=vect_q
minimum = fmin(LogL,x0,(q[0],q[1]))
print(minimum)
我尝试过的:
所以我搜索
fmin
-错误并得到了与我的情况类似的答案:Scipy fmin参数传递
但还是不行(数组的显式表示法,而且args
似乎不是问题)。
从1和2我推断出我不能使用向量,从另一个我不明白元组和列表之间的区别(我读到元组是不可修改的,但我不知道为什么我有它)。但我认为我真正的问题是给出的 1 个位置参数而不是 2 个(或 3 个)?
这就是我尝试过的(我想要的是该
LogL
函数的最小值)
TypeError: can only concatenate tuple (not "function") to tuple
q=vect_q
minimum = fmin(LogL,x0,q)
TypeError: 'function' object is not subscriptable
q=vect_q
minimum = fmin(LogL,x0,(q[0],q[1]))
TypeError: can only concatenate tuple (not "list") to tuple
minimum = fmin(LogL,x0,args=q)
TypeError: LogL() takes 1 positional argument but 2 were given
minimum = fmin(LogL,x0,args=(q,))
TypeError: can only concatenate tuple (not "list") to tuple
minimum = fmin(LogL,x0,args=[MU,SIGMA])
TypeError: LogL() takes 1 positional argument but 3 were given
minimum = fmin(LogL,x0,(MU,SIGMA))
TypeError: can only concatenate tuple (not "float") to tuple
minimum = fmin(LogL,x0,args=(MU))
ValueError: setting an array element with a sequence.
minimum = fmin(LogL,x0,args=())
从其他学生那里,我得到了这个解决方案:
def LogL(q):
return -np.sum(np.log(normalpdf(data, q[0],q[1])))
minimum = fmin(LogL, [MU,SIGMA])
所以我想知道为什么它对我不起作用,为什么那个学生似乎得到了一个值而不是一个函数,以及为什么它仍然可以获得最小值。
删除所有代码并编写
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
MU = 1.3
SIGMA = 4.5
N = 1000
N_BINS=20
rand = np.random.default_rng(seed=0) # for repeatability
data = np.random.normal(loc=MU, scale=SIGMA, size=N)
# Log-likelihood of a normal distribution
loc, scale = norm.fit(data=data)
fig, ax = plt.subplots()
ax.hist(data, density=True)
x = np.linspace(start=MU - 12, stop=MU + 12, num=200)
ax.plot(x, norm.pdf(x, loc=loc, scale=scale))
plt.show()