我试图将3种正态分布混合到我的转换数据日志中,我有点困惑如何去做。我尝试了scikit学习python的gmm函数,但它似乎无法正常工作。
g = mixture.GMM(n_components=3)
g.fit(lines)
f1 = arange(0, 13, 0.01)
f2 = arange(0, 13, 0.01)
f3 = arange(0, 13, 0.01)
f = arange(0, 13, 0.01)
for x in arange(0, 13, 0.01):
f1[x] = numpy.round(g.weights_[0],5) * numpy.exp(-numpy.power(x - means[0], 2) / 2 * numpy.power(covars[0], 2)) * (1 / (covars[0] * numpy.power(2 * pi, 0.5)))
f2[x] = numpy.round(g.weights_[1],5) * numpy.exp(-numpy.power(x - means[1], 2) / 2 * numpy.power(covars[1], 2)) * (1 / (covars[1] * numpy.power(2 * pi, 0.5)))
f3[x] = numpy.round(g.weights_[2],5) * numpy.exp(-numpy.power(x - means[2], 2) / 2 * numpy.power(covars[2], 2)) * (1 / (covars[2] * numpy.power(2 * pi, 0.5)))
f=f1+f2+f3
plt.plot(f)
plt.show()
最后我想得到3个分量的pdf图,即f = f1 + f2 + f3。然而,它不起作用。
是不是因为我试图将常态混合到对数正态数据?
你能解释一下我的错误和/或告诉我一个用于拟合对数正态混合的包吗?
答案 0 :(得分:0)
这是我使用OpenTURNS库混合制作3个LogNormal分布的混合物
import openturns as ot
from openturns.viewer import View
distribution1 = ot.LogNormal(0.01, 0.8, 3.)
distribution2 = ot.LogNormal(0.01, 0.5, 0.)
distribution3 = ot.LogNormal(0.1, 1., 7.)
final_dist = ot.Mixture([distribution1, distribution2, distribution3])
graph = final_dist.drawPDF()
View(graph, add_legend=False)
是您要找的吗?
您可以通过调用final_dist.computePDF([p])
在任何点p上访问生成的PDF的值并将其适合您的数据。
如果您熟悉matplotlib和numpy,这是使用它们的同一情节
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-3, 18, 100).reshape(-1, 1)
plt.plot(x, final_dist.computePDF(x))