kmeans火花斯卡拉的无限质心

时间:2018-09-25 09:54:24

标签: scala apache-spark infinite centroid

(我想我几乎可以肯定答案是什么)

这是我的代码:

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.evaluate(ClusteringEvaluator.scala:96)   ... 49消失了

但是我的质心看起来像这样:

model.clusterCenters.foreach(println)
  

[3217567.1300936914,145.06533614203505,Infinity,Infinity,Infinity]

我认为,因为某些中心是无限的=> kmeans不稳定=>轮廓测量出错。 但这仍然无法回答为什么,如果我尝试更改k,到目前为止,任何k> 1,我都会出错,提示“簇数必须大于1”。

请咨询。

1 个答案:

答案 0 :(得分:0)

我曾经看到相同的消息。根本原因是每个数据都是相同的(我的数据是由程序生成的),因此当然只有一个群集。顺便说一句,我没有检查其中心,所以不确定我的案子是否与您的案子相同。