简答:否
长答案:
您在这里尝试将苹果与橙子进行比较:在高斯混合和 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 的不同实现(由于不同的初始化和/或随机种子),因为该算法可能会收敛到非最优局部最小值。