今回は、このうち RealMatrix を使って、PageRank のプログラムを書き直してみます。
import org.apache.commons.math.linear.MatrixUtils; import org.apache.commons.math.linear.RealMatrix; public class PageRanker { ... public double[] solve() { int len = pages.length; double[][] a = new double[len][len]; for (int j = 0; j < len; j++) { int n = 0; for (int i = 0; i < len; i++) { n += links[i][j]; } double v = -1. * dampingFactor / (double)(n==0?(len-1):n); for (int i = 0; i < len; i++) { a[i][j] = (i==j)?1.:((double)(n==0?1:links[i][j])*v); } } if (dampingFactor == 1.) { for (int j = 0; j < len; j++) { a[0][j] = 1.; } } RealMatrix A = MatrixUtils.createRealMatrix(a); double[] b = new double[len]; if (dampingFactor == 1.) { b[0] = 1.; for (int i = 1; i < len; i++) { b[i] = 0.; } } else { double v = (1. - dampingFactor) / (double)len; for (int i = 0; i < len; i++) { b[i] = v; } } RealMatrix B = MatrixUtils.createRowRealMatrix(b).transpose(); RealMatrix X = A.solve(B); double[] pageRanks = new double[len]; for (int i = 0; i < len; i++) { pageRanks[i] = X.getEntry(i, 0); } return pageRanks; } } |
基本的には、Jama のときと、ほとんど変わりません。また、行列を扱っているのは、上記の solve() メソッドの中だけなので、PageRankExample1.java などは、そのままです。
$ javac -classpath commons-math-1.2.jar PageRanker.java $ java -classpath .:commons-math-1.2.jar PageRankExample1 A 0.0303 B 0.3854 C 0.3438 D 0.0392 E 0.0811 F 0.0392 g 0.0162 h 0.0162 i 0.0162 j 0.0162 k 0.0162 $ java -classpath .:commons-math-1.2.jar PageRankExample2 ID=1 0.3035 ID=2 0.1661 ID=3 0.1406 ID=4 0.1054 ID=5 0.1789 ID=6 0.0447 ID=7 0.0607 $ |
もちろん、実行結果も同じです。
Tags: programming