standford nlp包中OWLQNMinimizer的bug一则

Published: 22 Dec 2012 Category:
Orthant-Wise Limited-memory Quasi-Newton(OWL-QN)算法的最初实现是C++版本,standford nlp包中曾经提供了该算法的java版本,后来由于授权问题不再提供该程序。目前可以在这里找到算法的java实现。
但是这个实现有bug,在OWLQNMinimizer.java中,LogisticRegressionProblem类中的Pair<List<Integer>[], List<Double>[]> readMatrixFile(String filename, boolean coordinate)方法用于读取Matrix Market Exchange Formats格式的矩阵文件,其中有两行代码用于计算矩阵元素的行列坐标:

[code lang=”java”] int row = numNonZero / numFeats; int col = numNonZero % numIns;[/code]

由于Matrix Market Exchange Formats格式里,采用array方式输入矩阵时,矩阵元素是按列排列的,上面的计算错误。正确的代码是:

[code lang=”java”] int row = numNonZero % numIns; int col = numNonZero / numIns; [/code]

写出来意义不大,但是也许有人会遇到同样的问题,可以作为参考。

</br> Matrix Market Exchange Formats: http://math.nist.gov/MatrixMarket/formats.html#MMformat http://people.sc.fsu.edu/~jburkardt/data/mm/mm.html