pyspark - 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 的“现实”聚类。
预先感谢您的帮助。
此致
解决方案
我认为不良聚类背后的主要原因是 pyspark GMM 仅使用对角协方差矩阵,而不是完全协方差矩阵。对角协方差矩阵不考虑数据集中存在的特征之间的协方差,因此可能导致错误的聚类。
您可以在以下位置检查 GMM 的 pyspark 实现:https ://github.com/apache/spark/blob/master/mllib/src/main/scala/org/apache/spark/ml/clustering/GaussianMixture.scala
当你 Sklearn 的 GMM 实现时,默认情况下它们使用完整的协方差矩阵,该矩阵涉及与对角协方差矩阵相反的每个特征之间的协方差。
推荐阅读
- javascript - vb.net 这是反射吗
- fortran - Fortran if 显示全部且未选中
- linux - 核心转储未生成
- javascript - 发送到 PHP 时如何处理已发布的 multipart/form-data?
- c++ - 缓冲区参数为 NULL
- php - 如何调整openssl证书位置
- azure-functions - Azure 功能应用程序设置以选择生产、暂存和开发以外的环境
- javascript - OpenCV在python和javascript之间调整了大不相同的结果
- java - 如何使用 GZIPInputStream 修复 EOF 读取错误
- php - 正则表达式从字符串中查找带有国家代码的电话号码