在 Python 中拟合对数正态分布的混合

Posted

技术标签:

【中文标题】在 Python 中拟合对数正态分布的混合【英文标题】:Fitting a mixture of lognormal distributions in Python 【发布时间】:2016-04-17 21:30:12 【问题描述】:

scipy 提供了一种拟合单个对数正态分布的好方法。我看到scikit-learn 具有拟合正常(高斯)混合物的能力。有没有一种简单的方法来拟合两个对数正态分布的混合?如果没有,是否有一种更好的方法可以直接使用 scipy.optimize 或通过将混合分布定义为 scipy.stats.rv_continuous 的子类来“手动”优化参数?

【问题讨论】:

您可以log-转换您的数据并为其添加GMM,类似于X = np.log(X),但是...我相信没有easy 使用scikit-learn 精确拟合对数正态分布的方法,但是,您始终可以查看GMM code 并自己扩展它。你甚至可以将实现发回scikit-learn scipy 提供了适应对数正态分布位置的灵活性,这将在log 转换中丢失 - 预先做出这个选择感觉有问题,但也许它不在实践。如果事实证明 location 参数确实是必要的,那么扩展 GMM 可能是最好的方法。感谢您的建议! 是的,这就是数据对数转换的主要问题。您没有拟合对数正态混合,而是将高斯混合拟合到对数转换数据。它不一样,但取决于您的应用程序,它可能仍然有效。祝你好运扩展GMM,如果这是要走的路! 【参考方案1】:

我偶然发现了这个,它对我很有用:

https://pomegranate.readthedocs.io/en/latest/GeneralMixtureModel.html

示例用法:

from pomegranate import *

x = np.array(df['foo']).reshape(-1, 1)

model = GeneralMixtureModel.from_samples(LogNormalDistribution, n_components=2, X=x)
model.fit(x)
pomegranate_clusters = model.predict(x)

【讨论】:

以上是关于在 Python 中拟合对数正态分布的混合的主要内容,如果未能解决你的问题,请参考以下文章

怎样用Matlab拟合对数正态分布

曲线拟合——拉普拉斯/瑞利/对数正态 曲线

如何用MATLAB做数据正态分布拟合图像

matlab高斯拟合的初始值问题

高斯混合模型(GMM)及EM算法的初步理解

尝试 MLE 拟合 Weibull 分布时 scipy.optimize.minimize 中的 RuntimeWarning