2017-10-27 10 views
0
ではIllegalArgumentException

以下のようなKMeans.train()内部ながら、私は例外に実行しています:スパーク - 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()にありましたが、これはトレーニング段階で起こっています。

+0

あなたの入力とコードは何ですか? – Shaido

+1

私はあなたがリンクしている人のための欺瞞としてこの質問を閉じることを検討していますが、私はあまりよく分かりません。これらの[ガイドライン](https://stackoverflow.com/help/how-to-ask)を考慮して質問を検討してください。 – eliasah

+0

@eliasah:[Spark ML Github](https://github.com/apache/spark/blob/master/mllib/src/main/scala/org/apache/spark/mllib/util)から重複している可能性があります/ XMLUtils.scala)、fastSquaredDistanceの2つの要件は、1)ベクトルは同じサイズであり、2)両方のノルムは正である。 –

答えて

0

このエラーの可能性が最も高いのは、ベクトルの入力値がさまざまな次元であることです。渡された入力(ベクトル入力)の詳細を共有することができれば、この理由でより確かなことができます。

渡されるベクターの寸法が同じであることを再確認してください。

+0

はい、寸法はすべてのベクトルで同じです。私がポスト(私が投稿したリンク)を調べた後、私は自分のプログラム内でこのチェックを追加して、そうでないことを確認しました。他者は、-veノルムが理由である可能性を示唆している。ベクトルを与えるためにノルムが+ veであることを保証するにはどうしたらいいですか? –

0

だけで、ソースコードを見て、それが明らかになるだろう:

  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

私の入力は#1を満たしています。ノルムが+ veか-veかどうかをどうやって確認するのですか?どのようにそれを扱うのですか? Pls。助けて –