【问题标题】:Spark - IllegalArgumentException in KMeans.trainSpark - KMeans.train 中的 IllegalArgumentException
【发布时间】:2019-02-23 13:46:36
【问题描述】:

我在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(),而这发生在训练阶段本身。

【问题讨论】:

  • 你的输入和代码是什么?
  • 我正在考虑关闭这个问题作为你所链接的人的欺骗,但我不太确定。考虑到这些guidelines,您是否介意查看您的问题?
  • @eliasah: 很可能是重复的 - 从Spark ML Github 来看,fastSquaredDistance 的两个要求是 1) 向量的大小相同,2) 两个规范都是正数。
  • 谢谢@AlexandreDupriez!我怀疑这一点,但我给了 OP 一个机会,以防它不是一个完全的骗局,所以我不会单枪匹马地关闭它,在尖叫开始之后:)
  • @eliasah 我使用 limit() 和 except() 对数据集的行进行了二进制搜索,并缩小到导致此崩溃的确切特征向量。我发现其中一个向量在一列中有“NaN”,这一定是它导致崩溃的原因。感谢所有帮助并为我指明正确的方向。

标签: apache-spark apache-spark-mllib


【解决方案1】:

看看源码就明白了:

  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) ...

【讨论】:

  • 我的输入满足#1。如何检查规范是 +ve 还是 -ve ?我该如何处理它是 -ve 的情况?请。帮助
【解决方案2】:

此错误的最可能原因是向量中的输入值具有不同的维度。如果您可以分享正在传递的输入(向量输入)的详细信息,我们可以更确定这个原因。

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

【讨论】:

  • 是的,所有向量的尺寸都相同。在我遇到帖子(我发布的链接)后,我在我的程序中添加了这个检查以确保不是这种情况。其他人则认为 -ve norm 可能是原因。我如何确保给定向量的 norm 是 +ve ,如果是 -ve 我该如何处理?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-23
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多