(я думаю, что я почти уверен, что ответ)
вот мой код:
val fileName = """file:///home/user/data/csv/sessions_sample.csv"""
val df = spark.read.format("csv").option("header", "true").option("inferSchema", "true").load(fileName)
// calculate input for kmeans
val input1 = df.select("id", "duration", "ip_dist", "txr1", "txr2", "txr3", "txr4").na.fill(3.0)
val input2 = input1.map(r => (r.getInt(0), Vectors.dense((1 until r.size - 1).map{ i => r.getDouble(i)}.toArray[Double])))
val input3 = input2.toDF("id", "features")
// initiate kmeans
val kmeans = new KMeans().setK(100).setSeed(1L).setFeaturesCol("features").setPredictionCol("prediction")
val model = kmeans.fit(input3)
val model = kmeans.fit(input3.select("features"))
// Make predictions
val predictions = model.transform(input3.select("features"))
val predictions = model.transform(input3)
val evaluator = new ClusteringEvaluator()
// i get an error when i run this line
val silhouette = evaluator.evaluate(predictions)
java.lang.AssertionError: сбой подтверждения: Количество кластеровдолжно быть больше единицы.в scala.Predef $ .assert (Predef.scala: 170) в org.apache.spark.ml.evaluation.SquaredEuclideanSilhouette $ .computeSilhouetteScore (ClusteringEvaluator.scala: 416) в org.apache.spark.ml.evaluation.ClusteringEvaluator.eateate(ClusteringEvaluator.scala: 96) ... 49 elided
Но мои центроиды выглядят так:
model.clusterCenters.foreach(println)
[3217567.1300936914,145.06533614203505, Бесконечность, Бесконечность, Бесконечность]
я думаю, что из-за того, что некоторые центры бесконечны => kmeans нестабилен => мера силуэта идет не так.Но это все еще не отвечает, почему, если я пытаюсь изменить k, любое k> 1 до сих пор, у меня есть ошибка, говорящая, что "Число кластеров должно быть больше чем один".
пожалуйста, совет.