我在Spark的Java版本中使用了潜在的Dirichlet分配。
下面的代码行可以正常工作:
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中工作?据我所知,这是唯一的区别。
发布于 2016-04-20 01:10:42
我也遇到过类似的问题,结果发现我在为语料库创建SparseVectors时犯了一个错误。
我没有提供所有项的数量作为第一个参数,而是提供了索引和值数组的长度。
这导致了IndexOutOfBoundException
Vectors.sparse(indices.length,indices,values);
虽然这对我来说很有效
Vectors.sparse(numberOfTermsInCorpus,indices,values);
只有在使用OnlineLDAOptimizer时才会发生异常。当使用标准的EM优化器时,我的错误并没有影响模型的创建。
发布于 2015-10-21 00:59:06
我想,问题出在
.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
}https://stackoverflow.com/questions/32944219
复制相似问题