我正在尝试在 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 方法?
干杯