首页 > 解决方案 > Spark / PySpark - GMM 聚类返回完美等概率且只有 1 个聚类

问题描述

我尝试在给定的 DataFrame 上应用 GMM 聚类算法(如https://spark.apache.org/docs/latest/ml-clustering.html),如下所示:

vector.show(1)

身份证 | 特征

33.0 | [0.0,1.0,27043.0,....]

type(vector)

pyspark.sql.dataframe.DataFrame

type(vector.select('features'))

pyspark.sql.dataframe.DataFrame

vector.printSchema()

|-- id: double (可为空 = true)

|-- 特征:向量(可为空=真)

然后我尝试了以下代码来创建集群:

from pyspark.ml.clustering import GaussianMixture
gmm = GaussianMixture().setK(5).setSeed(538009335).setFeaturesCol("features")
gmm_model = gmm.fit(vector)
gmm_model.gaussiansDF.show()
gmm_predictions = gmm_model.transform(vector)
gmm_predictions.show()

这可以正常工作,没有任何错误或麻烦,但算法最终为所有集群返回相同的均值和协方差,并将每一行/ID 分配给同一个集群 0(对于任何集群,概率始终为 0.2([0.2,0.2,0,2,0.2 ,0.2]))。

你知道为什么它会给我这样的结果吗?

注意:数据不是造成这种“坏”聚类的原因:在使用 Scikit-learn 和 PySpark 尝试过 Kmeans 后,我得到了使用 Scikit-learn 的“现实”聚类。

预先感谢您的帮助。

此致

标签: pysparkcluster-analysisgmm

解决方案


我认为不良聚类背后的主要原因是 pyspark GMM 仅使用对角协方差矩阵,而不是完全协方差矩阵。对角协方差矩阵不考虑数据集中存在的特征之间的协方差,因此可能导致错误的聚类。

您可以在以下位置检查 GMM 的 pyspark 实现:https ://github.com/apache/spark/blob/master/mllib/src/main/scala/org/apache/spark/ml/clustering/GaussianMixture.scala

当你 Sklearn 的 GMM 实现时,默认情况下它们使用完整的协方差矩阵,该矩阵涉及与对角协方差矩阵相反的每个特征之间的协方差。


推荐阅读