Spark Kmeansの二乗オーステナイト距離と誤差の二乗和とソースコード分析


1.オーステナイト距離d(x,y)=√((x[1]-y[1])^2+(x[1]-y[2])^2+…+(x[n]-y[n])^2)2.squared Euclidean distance二乗ヨーロッパ式距離Spark KMeansの距離公式は二乗ヨーロッパ式距離を用いるが、二乗オーステナイト距離はヨーロッパ式距離の二乗(ルーツ番号を除く)d(x[1]-y[1])^2+(x[1]-y[2])^2+…+(x[n]-y[n])^2 3.誤差二乗和(Sum of Squared Error(SSE)Spark KMeansが用いた誤差評価指標は誤差二乗和式:Σ(acfual‐predicted)である.²注:つまり、各点からクラスタの中心までの平方ヨーロッパ式距離4.Spark関連コードはspark/mllib/src/main/scla/org/apache/spark/mllib/clustering/KMeansModelにある.scala
/**
   * Return the K-means cost (sum of squared distances of points to their nearest center) for this
   * model on the given data.
   */
  @Since("0.8.0")
  def computeCost(data: RDD[Vector]): Double = {
    val bcCentersWithNorm = data.context.broadcast(clusterCentersWithNorm)//     
    val cost = data.map(p =>
      distanceMeasureInstance.pointCost(bcCentersWithNorm.value, new VectorWithNorm(p)))
      .sum()//            
    bcCentersWithNorm.destroy()
    cost
  }

ここでdistanceMeasureInstanceはspark/mllib/src/main/scala/org/apache/spark/mllib/clustering/DistanceMeasureに位置する.scala
 /**
   * @return             ,    cost。
   */
  def findClosest(
      centers: Array[VectorWithNorm],
      point: VectorWithNorm): (Int, Double) = {
    var bestDistance = Double.PositiveInfinity
    var bestIndex = 0
    var i = 0
    while (i < centers.length) {
      val center = centers(i)
      val currentDistance = distance(center, point)//         
      if (currentDistance < bestDistance) {
        bestDistance = currentDistance
        bestIndex = i
      }
      i += 1
    }
    (bestIndex, bestDistance)
  }

  /**
   * @return             k-means  cost。
   */
  def pointCost(
      centers: Array[VectorWithNorm],
      point: VectorWithNorm): Double = {
    findClosest(centers, point)._2
  }

まとめ:実際にsparkの誤差二乗和コードはクラスタ中心を探す二乗オーステナイト距離公式を用いているので,誤差二乗和,すなわち各点からクラスタ中心までの二乗オーステナイト距離である