如何使用高斯混合模型进行聚类?

Posted

技术标签:

【中文标题】如何使用高斯混合模型进行聚类?【英文标题】:How to use Gaussian Mixture Model for clustering? 【发布时间】:2019-08-05 15:23:17 【问题描述】:

我一直在使用 k-Means 将数据聚类为 2 个类。但是,现在,我想使用不同的方法并使用高斯混合模型将数据聚类为 2 个类。我已经阅读了 Scikit-Learn 文档和其他 SO 问题,但无法理解如何在我目前的上下文中使用 GMM 进行 2 类聚类。

我可以使用 k-Means 轻松地将数据聚类为 2 个类,如下所示:-

import pandas as pd
from scipy import stats
from sklearn.cluster import KMeans
import numpy as np

df = pd.read_pickle('my_df.pkl')
clmns = df.columns

df = df.fillna(df.mean())
df.isnull().any

df_tr_std = stats.zscore(df[clmns])

kmeans = KMeans(n_clusters = 2, random_state = 0, n_init = 100, max_iter=500, n_jobs = -1).fit(df_tr_std)
# >>> kmeans
# KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
#     n_clusters=2, n_init=10, n_jobs=None, precompute_distances='auto',
#     random_state=0, tol=0.0001, verbose=0)
labels = kmeans.labels_

我会很感激任何一个线性/短代码段,我可以用它来在我的数据上拟合 GMM 模型 (df_tr_std)。我确信这必须是一个相当简单的过程来适应 GMM 模型,但我对如何将我当前的 k-Means 上下文修改为 GMM 模型感到非常困惑。

【问题讨论】:

我们如何为您的(我们不知道的)df_tr_std 数据做到这一点?文档中的 iris 和 ellipsoids 示例究竟有什么问题或缺失? 感谢您的评论。我同意你不知道这些数据,但出于这个目的,我在 k-Means 模型中包含了一个样板代码,用于拟合 df_tr_std(训练数据框,由各种特征组成)。 iris 和其他类似的例子就是这样做的,但我不知道如何在当前的上下文中应用相同的例子。我的主要问题是我可以找到像 gmm = GMM(n_components=4).fit(X) labels = gmm.predict(X) 这样的东西,可以在类似的上下文中使用(参考jakevdp.github.io/PythonDataScienceHandbook/…)。 但是,它是否是将 GMM 放入基于 Pandas 的 Dataframe 中的最合适的方法并不明显,我当然可以将其转换为凹凸不平的数组。我将感谢您在这方面的帮助和建议。请将上面的 k-Means 代码视为当前上下文,其中 df_tr_std 是具有所有训练特征的数据框。 【参考方案1】:

考虑以下几点:

根据您的具体情况x 和组均值、方差σ2 和标准差σ,此方程将为您提供高斯分布。

Z 分数将为您提供在哪里削减类,假设此时概率为 0.5,从而正确生成不同的类。 C 是类的质心,N 是示例数。

【讨论】:

感谢您的回答。但是,我已经知道高斯分布的方程,并正在寻找在当前上下文中在代码中实现它的方法(如问题中所述),以便我可以将我的数据相应地分为 2 个类。

以上是关于如何使用高斯混合模型进行聚类?的主要内容,如果未能解决你的问题,请参考以下文章

如何用高斯混合模型 GMM 做聚类

高斯混合模型(GMM)和EM算法

2020/02/28 高斯混合模型以及GMM聚类

05 EM算法 - 高斯混合模型 - GMM

高斯混合模型聚类实战(Gaussian Mixtures)

高斯混合模型GMM的EM算法实现(聚类)