数据集的最小距离

时间:2020-10-25 23:41:30

标签: python numpy scikit-learn distance

from scipy.spatial.distance import cdist
from sklearn.datasets import make_moons

X, y = make_moons()
cdist(X,X).min(axis=1)

给我

array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

这不是我想要的。我想要Xi不等于j的所有点之间的最小距离。当然,如果i=j,那么我会得到0。如何使用cdist来做到这一点?

1 个答案:

答案 0 :(得分:1)

cdist对于计算数组的成对距离是一个过大的杀伤力。对于一个数组,上三角是所有可能距离的最小有意义表示,但不包括与自身的0距离。做到这一点的方法是使用pdist

from scipy.spatial.distance import pdist
from sklearn.datasets import make_moons

X, y = make_moons()
# desired output
pdist(X).min()

它返回上三角数组ndarray:

Y:ndarray 返回一个简化的距离矩阵Y。对于每个i和j(其中i

您可能会了解有关凝聚矩阵here

的更多信息

时间比较:

%timeit pdist(X)
73 µs ± 825 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit cdist(X,X)
112 µs ± 315 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
相关问题