Python中的对数正态混合模型

4

我正在尝试将三个正态分布的混合拟合到我的对数转换数据上,但我有些困惑如何做。我尝试了scikit learn 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()

最终我希望得到一个包含三个组件的PDF图,即f=f1+f2+f3。但是它不能正常工作。
这是因为我试图将正态混合分布拟合到对数正态数据上吗?
请问您能否解释我的错误并/或建议一个用于拟合对数正态混合分布的软件包?

你是否遇到了特定的错误? - Al.Sal
不是的。只是我无法绘制由GMM计算出的混合分布,我很困惑为什么。 - user27241
我对这个模块其实不太熟悉,但是 g.fit(lines) 这行代码中的 lines 是什么?你是怎么生成它们的? - Al.Sal
使用 p = g.score_samples(x)[0] 来获取估计概率。 - Fanglin
1个回答

0

这是我使用OpenTURNS库混合三个对数正态分布的方法。

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)

mixture of 3 lognormal distributions

这是你要找的吗?

您可以通过调用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))

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接