我使用已知的正态分布权重随机生成了1000个数据点。现在,我正在尝试最小化-log似然函数以估计sig ^ 2的值和权重。我在概念上有点了解该过程,但是当我尝试对其进行编码时,我只是迷路了。

这是我的模型:

p(y|x, w, sig^2) = N(y|w0+w1x+...+wnx^n, sig^2)


我已经搜索了一段时间,并且了解到scipy.stats.optimize.minimize函数对此很有用,但我无法使其正常工作。我尝试过的每个解决方案都适用于我从中获得解决方案的示例,但是我无法将其推断出我的问题。

x = np.linspace(0, 1000, num=1000)
data = []
for y in x:
        data.append(np.polyval([.5, 1, 3], y))

#plot to confirm I do have a normal distribution...
data.sort()
pdf = stats.norm.pdf(data, np.mean(data), np.std(data))
plt.plot(test, pdf)
plt.show()

#This is where I am stuck.
logLik = -np.sum(stats.norm.logpdf(data, loc=??, scale=??))


我发现等式error(w)= .5 * sum(poly(x_n,w)-y_n)^ 2与最小化权重的误差有关,因此最大化了我权重的可能性,但是我没有我不知道该如何编码...我发现sig ^ 2具有相似的关系,但是存在相同的问题。有人可以说明如何做到这一点以帮助我的曲线拟合吗?也许远可以发布我可以使用的伪代码?

最佳答案

是的,用minimize实现似然拟合很棘手,我花了很多时间。这就是我包裹它的原因。如果我可以无耻地插入自己的软件包symfit,则可以通过执行以下操作来解决您的问题:

from symfit import Parameter, Variable, Likelihood, exp
import numpy as np

# Define the model for an exponential distribution
beta = Parameter()
x = Variable()
model = (1 / beta) * exp(-x / beta)

# Draw 100 samples from an exponential distribution with beta=5.5
data = np.random.exponential(5.5, 100)

# Do the fitting!
fit = Likelihood(model, data)
fit_result = fit.execute()


我不得不承认我不完全了解您的发行版,因为我不了解您的w的角色,但是也许以这段代码为例,您将知道如何适应它。

如果没有,请告诉我您模型的完整数学方程式,以便我进一步帮助您。

有关更多信息,请检查docs。 (有关幕后情况的更多技术说明,请阅读herehere。)

关于python - 使用Scipy优化进行MLE估计和曲线拟合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40219476/

10-15 01:26