如何在Pyspark中将KMeans模型性能与GaussianMixture和LDA模型性能进行比较?

时间:2017-06-13 09:19:28

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

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

我的火花版本是2.1.1,我有hadoop 2.7。

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

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

1 个答案:

答案 0 :(得分:3)

简短回答:

答案很长:

你试图在这里比较苹果和橘子:高斯混合物和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列:它是一个三维向量(因为我们要求k=3),显示"度"特定数据点属于3"簇中的每一个"。通常,矢量分量将小于1.0,这就是为什么高斯混合物是"软聚类的典型例子" (属于多个集群的数据点,在某种程度上属于每个集群)。现在,一些实现(包括Spark中的一个实现)更进一步,并分配一个" hard"集群成员资格(上面的功能prediction),只需获取probability中最大组件的索引 - 但这只是一个附加组件。

模型本身的输出怎么样?

model.gaussiansDF.show()

+--------------------+--------------------+ 
|                mean|                 cov| 
+--------------------+--------------------+ 
|[0.82500000000150...|0.005625000000006...|  
|[-0.4649980711427...|0.133224999996279...|
|[-0.4600024262536...|0.202493122264028...| 
+--------------------+--------------------+

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

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

Spark MLlib群集Guide确实声称prediction列包含"预测群集中心",但这个词非常不幸,说得温和(坦率地说,这是完全错误的。)

毋庸置疑,上述讨论直接来自核心概念&高斯混合模型背后的理论,它不是特定于Spark实现...

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