Spark / PySpark-GMM群集返回完美的等概率,并且只有1个群集

时间:2019-05-31 09:06:30

标签: pyspark cluster-analysis gmm

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

height

ID |功能

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

Cell

pyspark.sql.dataframe.DataFrame

vector.show(1)

pyspark.sql.dataframe.DataFrame

type(vector)

|-id:双精度(nullable = true)

|-功能:矢量(可为空= true)

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

type(vector.select('features'))

此方法没有任何错误或麻烦,但算法最终为所有聚类返回了相同的均值和协方差,并将每个行/ ID分配给相同的聚类0(对于任何聚类,概率始终为0.2([0.2,0.2,0, 2,0.2,0.2]))。

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

NB:数据不对这种“不良”聚类负责:在使用Scikit-learn和PySpark尝试过Kmeans之后,我对Scikit-learn进行了“现实”聚类。

预先感谢您的帮助。

最诚挚的问候

1 个答案:

答案 0 :(得分:0)

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

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

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