java - Spark 的 OnlineLDAOptimizer 在 Java 中导致 IndexOutOfBoundsException

标签 java apache-spark apache-spark-mllib

我在 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/

相关文章:

apache-spark - 在 yarn 集群模式下运行 Spark 应用程序时找不到HADOOP_HOME

machine-learning - 逻辑回归训练数据集真/假比

scala - Spark MLlib/K-Means 直觉

java - NoClassDefFoundError for dependent library projects in Android app project(使用maven作为构建工具)

java - 使用 android Java 电话、电子邮件、日期进行正则表达式验证

java - 托管 bean 属性值未设置为 null

java - 如何在 SWT 中创建一个根据另一个 CCombo 的值而变化的 CCombo?

scala - spark RDD折叠方法的解释

python - 将 pyspark 数据框的列转换为小写

python - Spark MLlib 中的 StringIndexer