我在 Java 版本的 Spark 中使用潜在狄利克雷分配。
以下行工作正常:
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 中工作吗?据我所知,这是唯一的区别。
最佳答案
我遇到了类似的问题,结果证明我在为语料库创建 SparseVectors
时犯了一个错误。
我没有提供所有项的数量作为第一个参数,而是提供了索引和值数组的长度。
这会导致IndexOutOfBoundException
Vectors.sparse(indices.length, indices, values);
虽然这对我有用
Vectors.sparse(numberOfTermsInCorpus, indices, values);
仅当使用OnlineLDAOptimizer
时才会出现异常。当使用标准 EM 优化器时,我的错误并没有影响模型的创建。
关于java - Spark 的 OnlineLDAOptimizer 在 Java 中导致 IndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32944219/