【问题标题】:how to calculate Euclidean distance between vectors of two INDArrays in ND4J?如何计算 ND4J 中两个 INDArrays 的向量之间的欧几里得距离?
【发布时间】:2020-04-26 18:26:13
【问题描述】:

我正在尝试计算两个 INDArray 之间的欧几里德距离(假设 INDArray 是 numpy 数组的替代品)。在python中,我实现了这一点:

import numpy as np
from scipy.spatial.distance import cdist
arr1 = np.array(of some size)
arr2 = np.array(of some size)
ans = cdist(arr2 , arr1)

示例:

arr1 = [[20.73 62.67 ]   # each row is a vector. so arr1 has 3 2-Dimensional vectors
        [93.47 13.83]
        [50.01 16.60]]

arr2 = [[20.66  6.09]    # arr2 has 2 2-Dimensional vectors
        [51.79 85.14]]

ans =  [[56.57 73.21 31.17]   # distances of vectors of arr2 with arr1
        [38.33 82.59 68.55]]

请帮助我在 java 中实现这一点。我对java不太了解。到目前为止,我得出的结论是 Nd4J 可以做到这一点。但我不知道怎么做。

注意: 不需要使用 for loops 计算欧几里得。实际上,我正在尝试查看矢量化对欧几里德距离计算的性能影响。我知道 Nd4J 像 Numpy 一样支持 SIMD 和矢量化。对于details

【问题讨论】:

    标签: java deeplearning4j nd4j


    【解决方案1】:

    Transforms.euclideanDistance(a,b) 用于相同形状张量之间的距离。或类似的“沿维度案例”

    @Test
    public void testEuclidean() {
        val arr1 = Nd4j.createFromArray(20.73, 62.67, 93.47, 13.83, 50.01, 16.60).reshape(3, 2);
        val arr2 = Nd4j.createFromArray(20.66, 6.09, 51.79, 85.14).reshape(2, 2);
    
        val result = Transforms.allEuclideanDistances(arr1, arr2, 1);
        log.info("Result: {}", result);
    }
    

    编辑:为 allEuclideanDistances 添加了代码示例。

    【讨论】:

    • Transforms.allEuclideanDistances(a, b, axis) 然后。
    • 我在答案中添加了 allEuclideanDistance() 的示例,它会为您的 python 脚本提供类似的值,但顺序不同。
    • 这与 python 脚本完全一样。在 python 示例中,arr2 在 arr1 之前给出:Transforms.allEuclideanDistances(arr2, arr1, 1);
    • 我们可以有效地做到这一点吗?因为这种方法需要更多时间,感谢使用常规 for 循环(这是不直观的)。 Nd4j 应该使用“所有数值运算的矢量化 c++ 代码”
    • javadoc.io/static/org.nd4j/nd4j-api/1.0.0-beta5/org/nd4j/linalg/… 这样会更好吗?我不知道如何实现这个
    猜你喜欢
    • 2019-06-06
    • 2014-05-31
    • 2021-02-11
    • 2014-06-14
    • 1970-01-01
    • 2018-06-14
    • 2014-11-12
    • 2020-09-25
    • 2020-06-10
    相关资源
    最近更新 更多