Java でSmile機械学習ライブラリーをセットアップしようとしていますが、いくつかの依存関係を機能させるのに問題があります。現在、私は Fedora マシンを使用していますが、通常の jar と同じように、どのマシンでも動作するようにしたいと考えています。
エラーが発生するコードの例を次に示します。
double threshold = 1;
DistanceMeasure measure = new EuclideanDistance();
double[][] data = embedding.getVectors();
AdjacencyMatrix adj = new AdjacencyMatrix(embedding.getNumberOfPoints());
for(int i = 0; i < embedding.getNumberOfPoints(); i++) {
for(int j = 0; j < embedding.getNumberOfPoints(); j++ ) {
if(i == j) {
adj.addEdge(i, j, threshold);
continue;
}
double weight = measure.compute(data[i], data[j]);
if(weight <= threshold) {
adj.addEdge(i, j, weight);
}
}
}
SpectralClustering clusters = SpectralClustering.fit(adj.toMatrix(), 3); // <-- Error here
double[][] reduced = PCA.fit(data).setProjection(3).project(data);
ScatterPlot.of(reduced, clusters.y, '*').canvas().window();
現在、SpectralClustering クラスはいくつかの追加の依存関係を利用しています。私が見つけたドキュメントから(「一部のアルゴリズムは BLAS と LAPACK に依存している」という部分まで下にスクロールすると、これらの依存関係を pom.xml に追加する必要があることがわかります。
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp</artifactId>
<version>1.5.5</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>openblas</artifactId>
<version>0.3.13-1.5.5</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>arpack-ng</artifactId>
<version>3.8.0-1.5.5</version>
</dependency>
ただし、これにより、次の 3 つのエラーが発生します。
- java.library.path に jnijavacpp がありません
- java.library.path に jniopenblas_nolapack がありません
- java.library.path に openblas_nolapack がありません
そのため、さらに調査を行ったところ、これらのさまざまな依存関係に出くわしました。(「-platform」がどのように異なるかはわかりません。) 上記をこれら 3 つの新しい依存関係に置き換えると、次のようになります。
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp-platform</artifactId>
<version>1.5.5</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>openblas-platform</artifactId>
<version>0.3.13-1.5.5</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>arpack-ng-platform</artifactId>
<version>3.8.0-1.5.5</version>
</dependency>
今回は、ある程度の進歩があり (願わくば)、新しいエラーが発生します。
Exception in thread "main" java.lang.NoSuchMethodError: void org.bytedeco.arpackng.global.arpack.dseupd_c(boolean, byte[], int[], double[], double[], int, double, byte[], int, byte[], int, double, double[], int, double[], int, int[], int[], double[], double[], int, int[])'
at smile.math.matrix.ARPACK.syev(ARPACK.java:180)
最後の部分を手伝ってくれる人はいますか?別の依存関係を追加する必要がありますか、それとも「dnf install ...」を使用して外部からソフトウェアをインストールする必要がありますか? おそらく、Smile クラスには特定のバージョンの dseupd_c メソッドが必要ですか?
乾杯