Я пытаюсь рассчитать индекс Данна, чтобы измерить производительность моего кластера Kmeans в указанном ниже наборе данных.
V1 V2 V3 V4 V5
-0.80688767 2.580938e-01 -2.310133e-01 -0.69172608 0.76195996
-0.80871432 5.357830e-01 -2.320617e-01 -1.09496541 0.71935607
-0.79147152 -6.051847e-01 -9.574660e-02 -1.02494869 0.89793288
-0.77096829 -1.859497e+00 -4.956332e-01 -0.77016532 1.20462390
-0.67800192 -1.595468e+00 -7.405667e-01 -0.89351545 0.92360485
-0.62255535 1.167977e+00 -1.656397e-01 -0.59319708 1.20205692
-0.81017300 -1.234912e+00 -5.714762e-01 -0.86877635 0.32971553
-0.72079901 5.085883e-01 -5.726607e-01 -0.91749111 0.46749543
-0.87377368 -5.650047e-01 -1.437415e-01 -0.65893811 0.61737109
Ниже приведен мой код для расчета индекса Данна.
import org.apache.spark.mllib.clustering.KMeans
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.mllib.linalg.{Vector, Vectors}
import org.apache.spark.rdd.RDD
val sc = spark.sparkContext
val data = sc.textFile("/FileStore/tables/sample.csv", 16)
val dataRDD = data
.map(s => s.split(",")
.map(_.toDouble))
.keyBy(_.apply(0))
.cache()
val parsedData = dataRDD.map(s => Vectors.dense(s._2)).cache()
val clusters = KMeans.train(parsedData,2,100)
//Global Center
val centroides = sc.parallelize(clusters.clusterCenters)
val centroidesCartesian = centroides.cartesian(centroides).filter(x => x._1 != x._2).cache()
// DUNN
val minA = centroidesCartesian.map(x => Vectors.sqdist(x._1, x._2)).min()
val maxB = parsedData.map( r => Vectors.sqdist(r, clusters.clusterCenters(clusters.predict(r)))).max
//Get Dunn index
val dunn = minA / maxB
Я получаю сообщение об ошибке при вычислении "maxB". Ошибка «org. apache .spark.SparkException: задача не сериализуема».
Это строка кода, которая выдает ошибку
val maxB = parsedData.map( r => Vectors.sqdist(r, clusters.clusterCenters(clusters.predict(r)))).max
Есть идеи, как решить эту проблему?
Кроме того, я открыт, чтобы знать, есть ли лучший способ для расчета индекса Данна в Spark Scala?