2015-10-05 65 views
0

我在Spark的Java版本中使用潛在Dirichlet分配。Spark的OnlineLDAOptimizer導致Java中的IndexOutOfBoundsException

以下行正常工作:

LDAModel ldaModel = new LDA()// 
         .setK(NUM_TOPICS)// 
         .setMaxIterations(MAX_ITERATIONS)// 
         .run(corpus); 

這使用(我相信)默認的EM優化器。

然而,當我嘗試使用隨機變優化,具體如下:

OnlineLDAOptimizer optimizer = new OnlineLDAOptimizer()// 
            .setMiniBatchFraction(2.0/MAX_ITERATIONS); 
LDAModel ldaModel = new LDA()// 
        .setK(NUM_TOPICS)// 
        .setOptimizer(optimizer)// 
        .setMaxIterations(MAX_ITERATIONS)// 
        .run(corpus); 

我得到如下:

org.apache.spark.SparkException: Job aborted due to stage failure: Task 1 in stage 11.0 failed 1 times, most recent failure: Lost task 1.0 in stage 11.0 (TID 50, localhost): java.lang.IndexOutOfBoundsException: (0,2) not in [-3,3) x [-2,2) 
at breeze.linalg.DenseMatrix.apply(DenseMatrix.scala:84) 
at breeze.linalg.Matrix$class.apply(Matrix.scala:39) 
... 

沒有人有任何成功獲取在線優化工作在Spark版本的Java中?據我所知,這是唯一的區別。

回答

0

我認爲,問題出在

.setMiniBatchFraction(2.0/MAX_ITERATIONS); 

你有沒有嘗試

.setMiniBatchFraction(math.min(1.0, mbf))) 

與MBF是

val mbf = { 
    // add (1.0/actualCorpusSize) to MiniBatchFraction be more robust on tiny datasets. 
    val corpusSize = corpus.count() 
    2.0/maxIterations + 1.0/corpusSize 
} 
+0

這不能解決問題。這個改變意在解決什麼(以防我失去了一些東西?)。另請注意,這涉及Java,而不是Spark的Scala版本。 –

1

我有一個類似的問題,事實證明,我做到了爲語料庫創建SparseVectors時出錯。

作爲第一個參數,我提供了索引和值數組的長度,而不是提供所有項的數量。

這導致了IndexOutOfBoundException

Vectors.sparse(indices.length,索引,值);

雖然這對我的作品

Vectors.sparse(numberOfTermsInCorpus,指數值);

只有在使用OnlineLDAOptimizer時纔會發生異常。當使用標準EM優化器時,我的錯誤不會影響模型的創建。

+0

只是一個說明,這不是一個真正的錯誤。它是由設計 – Jake

+1

絕對@Jake,你是對的。我修改了我的措辭。 –

相關問題