Python中的对数正态混合模型

4 投票
1 回答
600 浏览
提问于 2025-04-18 15:20

我正在尝试将三种正态分布的混合模型应用到我转换过的数据日志上,但我有点困惑,不知道该怎么做。我试过使用Python中的scikit-learn库里的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。但是这并没有成功。

这是不是因为我在尝试将正态分布混合应用到对数正态数据上?

能不能请你解释一下我的错误,或者推荐一个可以用来拟合对数正态分布混合的工具包?

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)

三个对数正态分布的混合

这就是你想要的吗?

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

在这里输入图片描述

撰写回答