【问题标题】:How can I compare KMeans model performance with GaussianMixture and LDA model performances in pyspark?如何在 pyspark 中将 KMeans 模型性能与 GaussianMixture 和 LDA 模型性能进行比较?
【发布时间】:2017-11-14 23:35:05
【问题描述】:

我正在使用 pyspark.ml.clustering 库处理 iris 数据集,以便了解 pyspark 的基础知识并为我创建一个聚类模板。

我的 spark 版本是 2.1.1,我有 hadoop 2.7。

我知道 KMeans 和 BisectingKMeans 具有 computeCost() 方法,该方法根据输入点与其对应聚类中心之间的平方距离之和给出模型性能。

有没有办法比较 KMeans 模型性能与 GaussianMixture 和 LDA 模型在 iris 数据集上的性能,以选择最佳模型类型(KMeans、GaussianMixture 或 LDA)?

【问题讨论】:

    标签: apache-spark machine-learning pyspark cluster-analysis apache-spark-ml


    【解决方案1】:

    简答:

    长答案:

    您在这里尝试将苹果与橙子进行比较:在高斯混合和 LDA 模型中,根本没有聚类中心的概念;因此,类似computeCost()的函数不存在也就不足为奇了。

    如果您查看高斯混合模型的实际输出,很容易看出这一点;改编 documentation 中的示例:

    from pyspark.ml.clustering import GaussianMixture
    from pyspark.ml.linalg import Vectors
    
    data = [(Vectors.dense([-0.1, -0.05 ]),),
             (Vectors.dense([-0.01, -0.1]),),
             (Vectors.dense([0.9, 0.8]),),
             (Vectors.dense([0.75, 0.935]),),
             (Vectors.dense([-0.83, -0.68]),),
             (Vectors.dense([-0.91, -0.76]),)]
    
    df = spark.createDataFrame(data, ["features"])
    gm = GaussianMixture(k=3, tol=0.0001,maxIter=10, seed=10) # here we ask for k=3 gaussians
    model = gm.fit(df)
    
    transformed_df = model.transform(df)  # assign data to gaussian components ("clusters")
    transformed_df.collect()
    
    # Here's the output:
    
    [Row(features=DenseVector([-0.1, -0.05]), prediction=1, probability=DenseVector([0.0, 1.0, 0.0])), 
     Row(features=DenseVector([-0.01, -0.1]), prediction=2, probability=DenseVector([0.0, 0.0007, 0.9993])),
     Row(features=DenseVector([0.9, 0.8]), prediction=0, probability=DenseVector([1.0, 0.0, 0.0])), 
     Row(features=DenseVector([0.75, 0.935]), prediction=0, probability=DenseVector([1.0, 0.0, 0.0])), 
     Row(features=DenseVector([-0.83, -0.68]), prediction=1, probability=DenseVector([0.0, 1.0, 0.0])), 
     Row(features=DenseVector([-0.91, -0.76]), prediction=2, probability=DenseVector([0.0, 0.0006, 0.9994]))]
    

    高斯混合“聚类”的实际输出是上面的第三个特征,即probability列:它是一个3维向量(因为我们要求k=3),显示了它的“度数”特定数据点属于 3 个“集群”中的每一个。通常,向量分量将小于 1.0,这就是为什么高斯混合是“软聚类”的经典示例(数据点属于多个聚类,在某种程度上属于每个聚类)。现在,一些实现(包括此处 Spark 中的实现)更进一步,通过简单地获取probability 中最大组件的索引来分配一个“硬”集群成员(上面的功能prediction)——但这很简单一个附加组件。

    模型本身的输出呢?

    model.gaussiansDF.show()
    
    +--------------------+--------------------+ 
    |                mean|                 cov| 
    +--------------------+--------------------+ 
    |[0.82500000000150...|0.005625000000006...|  
    |[-0.4649980711427...|0.133224999996279...|
    |[-0.4600024262536...|0.202493122264028...| 
    +--------------------+--------------------+
    

    同样,很容易看出没有聚类中心,只有我们的k=3 gaussians 的参数(均值和协方差)。

    类似的论点适用于 LDA 案例(此处未显示)。

    Spark MLlib Clustering Guide 确实声称prediction 列包含“Predicted cluster center”,但是这个词很不幸,说得客气一点(说白了,这是完全错误的)。

    不用说,上面的讨论直接来自高斯混合模型背后的核心概念和理论,并不特定于Spark的实现......

    computeCost() 之类的函数仅用于帮助您评估 K-Means 的不同实现(由于不同的初始化和/或随机种子),因为该算法可能会收敛到非最优局部最小值。

    【讨论】:

      猜你喜欢
      • 2023-04-11
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      相关资源
      最近更新 更多