我在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中工作?据我所知,这是唯一的区别。
答案 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
}