我尝试在给定的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进行了“现实”聚类。
预先感谢您的帮助。
最诚挚的问候
答案 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 实现时,默认情况下它们使用全协方差矩阵,其中涉及与对角协方差矩阵相反的每个特征之间的协方差。