2015-10-05 30 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,你是对的。我修改了我的措辞。 –

相关问题