使用scipy优化MLE估计和曲线拟合

时间:2016-10-24 13:15:46

标签: python scipy curve-fitting mle

我使用我知道的正态分布的权重随机生成了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=??))

我发现方程误差( w )= .5 * sum(poly(x_n, w ) - y_n)^ 2与最小化误差相关权重,因此最大化我的权重的可能性,但我不明白如何编码这...我发现sig ^ 2有类似的关系,但有相同的问题。有人可以澄清如何做到这一点,以帮助我的曲线拟合?也许可以发布我可以使用的psuedo代码了吗?

2 个答案:

答案 0 :(得分: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。)

答案 1 :(得分:1)

我认为您的设置存在问题。在最大可能性的情况下,您可以获得最大化观察数据概率的参数(给定某个模型)。你的模型似乎是:

enter image description here

其中epsilon是N(0,sigma)。

所以你最大化它:

enter image description here

或等效地获取日志以获取:

enter image description here

这种情况下的f是对数正态概率密度函数,可以使用stats.norm.logpdf得到。然后,您应该使用scipy.minimize来最大化表达式,该表达式将是在每个i点评估的stats.norm.logpdf的总和,从1到您的样本大小。

如果我理解正确,那么您的代码缺少y向量和x向量!向我们展示这些向量的样本,我可以更新我的答案,包括用于估计该日期的MLE的示例代码。