python中的对数正态混合

时间:2014-07-30 12:45:41

标签: python statistics mixture-model

我试图将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。然而,它不起作用。

是不是因为我试图将常态混合到对数正态数据?

你能解释一下我的错误和/或告诉我一个用于拟合对数正态混合的包吗?

1 个答案:

答案 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)

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