【问题标题】:Alternate approach for pdist() from scipy in Julia?来自 Julia 的 scipy 的 pdist() 的替代方法?
【发布时间】:2021-05-20 01:28:43
【问题描述】:

我的目标是在 Julia 中从 SciPy 复制 pdist() 的功能。 我尝试使用Distances.jl 包对观测值之间的距离进行成对计算。但是,结果与下面提到的示例不同。

Python 示例:

from scipy.spatial.distance import pdist
a = [[1,2], [3,4], [5,6], [7,8]]
b = pdist(a)
print(b)

output --> array([2.82842712, 5.65685425, 8.48528137, 2.82842712, 5.65685425, 2.82842712])

朱莉娅示例:

using Distances
a = [1 2; 3 4; 5 6; 7 8]
dist_function(x)  = pairwise(Euclidean(), x, dims = 1)
dist_function(a)

output --> 
4×4 Array{Float64,2}:
 0.0      2.82843  5.65685  8.48528
 2.82843  0.0      2.82843  5.65685
 5.65685  2.82843  0.0      2.82843
 8.48528  5.65685  2.82843  0.0

参考以上例子:

  1. python 中 pdist() 来自 SciPy 的度量值是否默认设置为 Euclidean()
  2. 我该如何解决这个问题,以便在 Julia 中复制结果?

请提出解决此问题的解决方案。

pdist() 的文档参考:--> https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.pdist.html

提前致谢!!

【问题讨论】:

    标签: scipy julia pairwise-distance


    【解决方案1】:

    根据您链接的文档页面,要从 python 获得与 Julia 相同的表单(是的,我知道,这与您的问题相反),您可以将其传递给 squareform。 IE。在您的示例中,添加

    from scipy.spatial.distance import squareform
    squareform(b)
    

    另外,是的,从同一个文档页面中,您可以看到如果没有明确定义,“metric”参数默认为“euclidean”。

    对于相反的情况,只需注意 python 向量就是非对角线中的所有元素(因为对于“适当的”距离度量,得到的距离矩阵是对称的)。

    因此您可以简单地将所有非对角线元素收集到一个向量中。

    【讨论】:

    • 感谢您的回复。这真的有助于我理解这个函数的操作。太棒了!!!
    【解决方案2】:

    对于(1),根据您链接的文档,答案是肯定的,上面写着

    scipy.spatial.distance.pdist(X, metric='euclidean', *args, **kwargs)
    

    表示metric arg 确实默认设置为'euclidean'

    我不确定我是否理解您的第二个问题 - 结果是否相同?对我来说唯一的区别似乎是 scipy 将上三角形作为向量返回,所以如果只是这样做,请查看:https://discourse.julialang.org/t/vector-of-upper-triangle/7764

    【讨论】:

    • 感谢您的建议。 python 示例仅给出了一个向量,而 julia 给出了完整的数组,Tasos Papastylianou 在上一篇文章中解释了为什么会发生这种情况。我想知道如何实现类似于 python 的输出(单向量)。但是,我设法通过过滤方法从建议的链接中提取了数组的上三角形。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 2016-09-01
    相关资源
    最近更新 更多