如何在 pyspark 中比较 KMeans 模型性能与 GaussianMixture 和 LDA 模型性能?
How can I compare KMeans model performance with GaussianMixture and LDA model performances in pyspark?
我正在使用 pyspark.ml.clustering 库处理鸢尾花数据集,以便了解 pyspark 的基础知识并为我创建聚类模板。
我的 spark 版本是 2.1.1,我有 hadoop 2.7。
我知道 KMeans 和 BisectingKMeans 有 computeCost() 方法,该方法根据输入点与其相应聚类中心之间的平方距离之和给出模型性能。
有没有办法将 KMeans 模型性能与 GaussianMixture 和 LDA 模型在 iris 数据集上的性能进行比较,以便选择最佳模型类型(KMeans、GaussianMixture 或 LDA)?
简答:否
长答案:
您在这里试图比较苹果和橙子:在高斯混合和 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]))]
Gaussian Mixture"clustering"的实际输出是上面的第三个特征,即probability
列:它是一个三维向量(因为我们要求k=3
) ,显示了特定数据点属于 3 "clusters" 中的每一个的 "degree"。通常,矢量分量将小于 1.0,这就是为什么高斯混合是 "soft clustering" 的经典示例(数据点属于多个集群,在某种程度上属于每个集群)。现在,一些实现(包括这里的 Spark 中的实现)更进一步,通过简单地获取 probability
- 但这只是一个附加组件。
模型本身的输出如何?
model.gaussiansDF.show()
+--------------------+--------------------+
| mean| cov|
+--------------------+--------------------+
|[0.82500000000150...|0.005625000000006...|
|[-0.4649980711427...|0.133224999996279...|
|[-0.4600024262536...|0.202493122264028...|
+--------------------+--------------------+
同样,很容易看出没有聚类中心,只有 k=3
高斯分布的参数(均值和协方差)。
类似的论点适用于 LDA 案例(此处未显示)。
Spark MLlib Clustering Guide 声称 prediction
列包含 "Predicted cluster center" 是真的,但是这个术语很不幸,委婉地说(说坦率地说,这是完全错误的)。
不用说,以上讨论直接来自高斯混合模型背后的核心概念和理论,并不特定于 Spark 实现...
像computeCost()
这样的函数只是为了帮助你评估K-Means的不同实现(由于不同的初始化and/or随机种子),因为算法可能会收敛到一个非最优局部最小值。
我正在使用 pyspark.ml.clustering 库处理鸢尾花数据集,以便了解 pyspark 的基础知识并为我创建聚类模板。
我的 spark 版本是 2.1.1,我有 hadoop 2.7。
我知道 KMeans 和 BisectingKMeans 有 computeCost() 方法,该方法根据输入点与其相应聚类中心之间的平方距离之和给出模型性能。
有没有办法将 KMeans 模型性能与 GaussianMixture 和 LDA 模型在 iris 数据集上的性能进行比较,以便选择最佳模型类型(KMeans、GaussianMixture 或 LDA)?
简答:否
长答案:
您在这里试图比较苹果和橙子:在高斯混合和 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]))]
Gaussian Mixture"clustering"的实际输出是上面的第三个特征,即probability
列:它是一个三维向量(因为我们要求k=3
) ,显示了特定数据点属于 3 "clusters" 中的每一个的 "degree"。通常,矢量分量将小于 1.0,这就是为什么高斯混合是 "soft clustering" 的经典示例(数据点属于多个集群,在某种程度上属于每个集群)。现在,一些实现(包括这里的 Spark 中的实现)更进一步,通过简单地获取 probability
- 但这只是一个附加组件。
模型本身的输出如何?
model.gaussiansDF.show()
+--------------------+--------------------+
| mean| cov|
+--------------------+--------------------+
|[0.82500000000150...|0.005625000000006...|
|[-0.4649980711427...|0.133224999996279...|
|[-0.4600024262536...|0.202493122264028...|
+--------------------+--------------------+
同样,很容易看出没有聚类中心,只有 k=3
高斯分布的参数(均值和协方差)。
类似的论点适用于 LDA 案例(此处未显示)。
Spark MLlib Clustering Guide 声称 prediction
列包含 "Predicted cluster center" 是真的,但是这个术语很不幸,委婉地说(说坦率地说,这是完全错误的)。
不用说,以上讨论直接来自高斯混合模型背后的核心概念和理论,并不特定于 Spark 实现...
像computeCost()
这样的函数只是为了帮助你评估K-Means的不同实现(由于不同的初始化and/or随机种子),因为算法可能会收敛到一个非最优局部最小值。