问题描述
我的目标是在 Julia 中从 pdist()
复制 SciPy
的功能。
我尝试使用 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,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
参考以上例子:
pdist() 的文档参考:--> https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.pdist.html
提前致谢!!
解决方法
根据您链接的文档页面,要从 python 获得与 Julia 相同的表单(是的,我知道,这与您的问题相反),您可以将其传递给 squareform。 IE。在您的示例中,添加
from scipy.spatial.distance import squareform
squareform(b)
另外,是的,从同一个文档页面,您可以看到如果没有明确定义,'metric' 参数默认为 'euclidean'。
对于相反的情况,只需注意 python 向量只是非对角线中的所有元素(因为对于“适当的”距离度量,结果距离矩阵是对称的)。
因此您可以简单地将非对角线上的所有元素收集到一个向量中。
,对于(1),根据您链接的文档,答案是肯定的,它在顶部说
scipy.spatial.distance.pdist(X,metric='euclidean',*args,**kwargs)
表明 metric
参数确实默认设置为 'euclidean'
。
我不确定我是否理解您的第二个问题 - 结果是否相同?对我来说唯一的区别似乎是 scipy 将上三角作为向量返回,所以如果只是这样做,请查看:https://discourse.julialang.org/t/vector-of-upper-triangle/7764