我正在使用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的不同实现(由于不同的初始化和/或随机种子),因为算法可能会收敛到非最优的局部最小值。