1

我正在尝试在 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 个错误:

  1. java.library.path 中没有 jnijavacpp
  2. java.library.path 中没有 jniopenblas_nolapack
  3. 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 方法?

干杯

4

1 回答 1

2

哇,看来我自己也快要找到答案了。事实证明,您需要在 pom.xml中使用“-platform”版本和这些特定版本:

    <dependency>
        <groupId>org.bytedeco</groupId>
        <artifactId>javacpp-platform</artifactId>
        <version>1.5.3</version>
    </dependency>
    <dependency>
        <groupId>org.bytedeco</groupId>
        <artifactId>openblas-platform</artifactId>
        <version>0.3.9-1.5.3</version>
    </dependency>
    <dependency>
        <groupId>org.bytedeco</groupId>
        <artifactId>arpack-ng-platform</artifactId>
        <version>3.7.0-1.5.3</version>
    </dependency>

这使我的代码运行没有错误。我希望有一天这对其他人有用。

干杯!

于 2021-11-08T15:42:32.597 回答