【问题标题】:Usage of arpack-ng/openblas/javacpp in the smile java library微笑java库中arpack-ng/openblas/javacpp的使用
【发布时间】:2021-12-21 09:37:59
【问题描述】:

我正在尝试在 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 类使用了一些额外的依赖项。从documentation 我可以找到(向下滚动到提到“某些算法依赖于 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 方法?

干杯

【问题讨论】:

    标签: maven openblas javacpp arpack smile


    【解决方案1】:

    哇,看来我自己也快找到答案了。事实证明,您需要在 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>
    

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

    干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-28
      • 1970-01-01
      • 2016-06-02
      • 1970-01-01
      • 2019-02-11
      • 1970-01-01
      相关资源
      最近更新 更多