如何在pyspark中比较KMeans模型与GaussianMixture和LDA模型的性能?

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

我的Spark版本是2.1.1,Hadoop版本是2.7。

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

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


回答:

简短回答:没有

详细回答:

你在这里试图比较苹果和橙子:在Gaussian Mixtures和LDA模型中根本没有聚类中心的概念;因此,类似于computeCost()的函数不存在也就不足为奇了。

如果你查看Gaussian Mixture模型的实际输出,就很容易理解这一点;以下是根据文档调整的示例:

from pyspark.ml.clustering import GaussianMixturefrom pyspark.ml.linalg import Vectorsdata = [(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) # 这里我们请求k=3个高斯分布model = gm.fit(df)transformed_df = model.transform(df)  # 将数据分配到高斯分量(“聚类”)transformed_df.collect()# 这是输出:[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]))]

Gaussian Mixture“聚类”的实际输出是上面的第三个特征,即probability列:它是一个3维向量(因为我们请求了k=3),显示特定数据点属于每个3个“聚类”的“程度”。一般来说,向量分量将小于1.0,这就是为什么Gaussian Mixtures是“软聚类”的经典例子(数据点属于多个聚类,每个聚类属于某种程度)。现在,一些实现(包括这里的Spark实现)进一步进行,并通过简单地取probability中最大分量的索引来分配“硬”聚类成员身份(上面的prediction特征) – 但这只是一个附加功能。

那么模型本身的输出呢?

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

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

对于LDA情况也适用类似的论点(此处未显示)。

Spark MLlib聚类指南确实声称prediction列包括“预测的聚类中心”,但这个术语相当不幸,轻描淡写地说(直白地说,这是完全错误的)。

不用说,上述讨论直接来自Gaussian Mixture模型背后的核心概念和理论,并不特定于Spark实现…

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

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注