我使用我知道的正态分布的权重随机生成了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代码了吗?
答案 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
的作用,但也许以这段代码为例,你可以知道如何适应它。
如果没有,请告诉我您模型的完整数学公式,以便我可以进一步帮助您。
答案 1 :(得分:1)