Spark的OnlineLDAOptimizer在Java中导致IndexOutOfBoundsException

时间:2015-10-05 08:31:50

标签: java apache-spark apache-spark-mllib

我在Spark版本的Java版本中使用Latent Dirichlet Allocation。

以下行正常:

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

有没有人能够让在线优化器在Java版本的Spark中工作?据我所知,这是唯一的区别。

2 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,结果发现在为语料库创建SparseVectors时我犯了一个错误。

不是提供所有术语的数量作为第一个参数,而是提供了索引和值数组的长度。

这会导致IndexOutOfBoundException

  

Vectors.sparse(indices.length,indices,values);

虽然这对我有用

  

Vectors.sparse(numberOfTermsInCorpus,indices,values);

仅在使用OnlineLDAOptimizer时才会发生异常。使用标准EM优化器时,我的错误不会影响模型的创建。

答案 1 :(得分: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
}