我正在Spark Scala中使用k均值算法来训练模型。我想计算聚类中每个值到其余每个聚类的距离。以下是我为训练模型而实现的代码。
val Array(trainingData, testData) = df2.randomSplit(Array(0.8, 0.2))
val kmeans = new KMeans()
.setK(12)
.setFeaturesCol("features")
.setPredictionCol("prediction")
val kmeansModel = kmeans.fit(trainingData)
kmeansModel.clusterCenters.foreach(println)
val predictDf = kmeansModel.transform(testData)
predictDf.show()
答案 0 :(得分:0)
您将必须自己计算距离(这很容易做到,就这样!)。
尽管Spark实现的(差)算法确实具有这些距离,但当前不返回这些距离。因此,您需要修改Spark才能获取它们。
更好的算法避免计算所有这些距离都更快。这就是为什么这些算法比仅具有劳埃德天真的算法的Spark更快的原因。但是,这些算法也将无法返回它们。但是,有些距离可能会有所限制。但是您需要最后一次O(n)传递才能计算出精确的距离,并且通常需要您自己执行此操作。
在“预测”时(请注意,聚类通常不是预测性的,大多数都不会提供“预测”功能,因此通常也不进行火车测试拆分,因为它只是简单地不起作用),您也可以自己实现(即,自己编写代码而不是使用库函数)。然后,您将具有到所有群集中心的距离。这比之后再次重新计算距离(每点计算k + 1个距离而不是k个)更聪明。
最后但并非最不重要的一点是,您可能也对欧几里得感兴趣,而不是平方的欧几里得距离。这些不是用k均值最小化的(它只会使Bregman散度最小化,而不会使欧氏距离最小化),但是通常差异不会太大。只是不要假设结果是最佳的。