Spark - KMeans.train中的IllegalArgumentException

问题描述 投票:3回答:3

我在KMeans.train()内部遇到异常,如下所示:

java.lang.IllegalArgumentException: requirement failed
  at scala.Predef$.require(Predef.scala:212)
  at org.apache.spark.mllib.util.MLUtils$.fastSquaredDistance(MLUtils.scala:487)
  at org.apache.spark.mllib.clustering.KMeans$.fastSquaredDistance(KMeans.scala:589)
  at org.apache.spark.mllib.clustering.KMeans$$anonfun$runAlgorithm$3.apply(KMeans.scala:304)
  at org.apache.spark.mllib.clustering.KMeans$$anonfun$runAlgorithm$3.apply(KMeans.scala:301)
  at scala.collection.mutable.HashMap$$anonfun$foreach$1.apply(HashMap.scala:99)
  at scala.collection.mutable.HashMap$$anonfun$foreach$1.apply(HashMap.scala:99)
  at scala.collection.mutable.HashTable$class.foreachEntry(HashTable.scala:230)
  at scala.collection.mutable.HashMap.foreachEntry(HashMap.scala:40)
  at scala.collection.mutable.HashMap.foreach(HashMap.scala:99)
  at org.apache.spark.mllib.clustering.KMeans.runAlgorithm(KMeans.scala:301)
  at org.apache.spark.mllib.clustering.KMeans.run(KMeans.scala:227)
  at org.apache.spark.mllib.clustering.KMeans.run(KMeans.scala:209)
  at org.apache.spark.mllib.clustering.KMeans$.train(KMeans.scala:530)

这并没有给我任何关于从哪里开始调试的线索。 我发现了一个古老的post,但问题出在KMeans.predict(),而这种情况发生在训练阶段。

apache-spark apache-spark-mllib
3个回答
2
投票

只需看看源代码,它就会变得清晰:

  1. 你的向量必须具有相同的大小。
  2. 两种载体的规范应该是非负的。

https://github.com/apache/spark/blob/17af727e38c3faaeab5b91a8cdab5f2181cf3fc4/mllib/src/main/scala/org/apache/spark/mllib/util/MLUtils.scala#L500

private[mllib] def fastSquaredDistance( v1: Vector, norm1: Double, v2: Vector, norm2: Double, precision: Double = 1e-6): Double = { val n = v1.size require(v2.size == n) require(norm1 >= 0.0 && norm2 >= 0.0) ...


0
投票

导致此错误的最可能原因是矢量中的输入值具有不同的尺寸。如果您可以共享传递的输入(向量输入)的详细信息,我们可以更加确定这个原因。

请重新检查传递的向量是否具有相同的尺寸。


0
投票

您的某些行具有空值,请使用:“dropna”或等效值

© www.soinside.com 2019 - 2024. All rights reserved.