计算向量与 K 均值聚类中心的距离



>我有训练数据集,我在 K=4 的情况下运行 K 均值,得到了四个聚类中心。对于新的数据点,我不仅想知道预测的聚类,还想知道与该聚类中心的距离。有没有 API 来计算与中心的欧氏距离?如果需要,我可以进行 2 次 API 调用。我正在使用 Scala,我在任何地方都找不到任何示例。

因为 Spark 2.0 Vectors.sqdist 可用于计算两个 Vector 之间的平方距离。

您可以使用 UDF 计算每个点到其中心的距离,如下所示:

import org.apache.spark.ml.linalg.{Vectors, Vector}
import org.apache.spark.ml.clustering.KMeans
import org.apache.spark.sql.functions.udf
// Sample points
val points = Seq(Vectors.dense(1,0), Vectors.dense(2,-3), Vectors.dense(0.5, -1), Vectors.dense(1.5, -1.5))    
val df = points.map(Tuple1.apply).toDF("features")
// K-means
val kmeans = new KMeans()
  .setFeaturesCol("features")
  .setK(2)
val kmeansModel = kmeans.fit(df)
val predictedDF = kmeansModel.transform(df)
// predictedDF.schema = (features: Vector, prediction: Int)
// Cluster Centers
kmeansModel.clusterCenters foreach println
/*
[1.75,-2.25]
[0.75,-0.5]
*/
// UDF that calculates for each point distance from each cluster center
val distFromCenter = udf((features: Vector, c: Int) => Vectors.sqdist(features, kmeansModel.clusterCenters(c)))
val distancesDF = predictedDF.withColumn("distanceFromCenter", distFromCenter($"features", $"prediction"))
distancesDF.show(false)
/*
+----------+----------+------------------+
|features  |prediction|distanceFromCenter|
+----------+----------+------------------+
|[1.0,0.0] |1         |0.3125            |
|[2.0,-3.0]|0         |0.625             |
|[0.5,-1.0]|1         |0.3125            |
|[1.5,-1.5]|0         |0.625             |
+----------+----------+------------------+
*/

注意:Vectors.sqdist计算 2 个向量之间的平方距离(无平方根)。如果你一定需要欧几里得距离,你可以使用Math.sqrt(Vectors.sqdist(...))

以下内容对我有用...

def EuclideanDistance(x: Array[Double], y: Array[Double]) = {
  scala.math.sqrt((xs zip ys).map { case (x,y) => scala.math.pow(y - x, 2.0) }.sum)
}

相关内容

  • 没有找到相关文章

最新更新