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
ここでdistanceMeasureInstanceはspark/mllib/src/main/scala/org/apache/spark/mllib/clustering/DistanceMeasureに位置する.scala
まとめ:実際にsparkの誤差二乗和コードはクラスタ中心を探す二乗オーステナイト距離公式を用いているので,誤差二乗和,すなわち各点からクラスタ中心までの二乗オーステナイト距離である
/**
* 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の誤差二乗和コードはクラスタ中心を探す二乗オーステナイト距離公式を用いているので,誤差二乗和,すなわち各点からクラスタ中心までの二乗オーステナイト距離である