Я пытаюсь построить коленчатый график, используя SparkML Kmeans
Я пытаюсь установить начальное значение, но когда я строю кривую, я вижу, что SumOfSquaredDistance не уменьшается правильно.
Это моя текущая кривая current_elbow
У кого-нибудь есть объяснения?
def getKmeansModel(k: Int, df_with_features: DataFrame,features_colname: String) : KMeansModel = {
// Trains a k-means model.
println("Trains a k-means model with n of clusters: "+k)
val kmeans = new KMeans().setK(k).setSeed(123456789L).setFeaturesCol(features_colname)
val model = kmeans.fit(df_with_features)
model
}
def getKmeanWithinSetSumSquaredErrors(model: KMeansModel): (Int,Double) = {
val training_summary = model.summary
(training_summary.k,training_summary.trainingCost)
}
def getElbowDf(min_k: Int, max_k: Int, df_with_features: DataFrame,features_colname: String) : List[(Int, Double)] =
{
val range_list: List[Int] = min_k until max_k+1 toList
var result = scala.collection.mutable.Map[Int, Double]()
@tailrec
def iter(range_list:List[Int], result:scala.collection.mutable.Map[Int,Double]):List[(Int, Double)] =
if(range_list.isEmpty) result.toList
else iter(range_list.tail,result + getKmeanWithinSetSumSquaredErrors(getKmeansModel(range_list.head,df_with_features,features_colname)))
iter(range_list, result)
}