Scipy教程 - 距离计算库scipy.spatial.distance

http://blog.csdn.net/pipisorry/article/details/48814183

在scipy.spatial中最重要的模块应该就是距离计算模块distance了。

from scipy import spatial

距离计算

矩阵距离计算函数

矩阵参数每行代表一个观测值,计算结果就是每行之间的metric距离。Distance matrix computation from a collection of raw observation vectors stored in a rectangular array.

向量距离计算函数Distance functions between two vectors u and v

Distance functions between two vectors u and v. Computingdistances over a large collection of vectors is inefficient for thesefunctions. Use pdist for this purpose.

输入的参数应该是向量,也就是维度应该是(n, ),当然也可以是(1, n)它会使用squeeze自动去掉维度为1的维度;但是如果是多维向量,至少有两个维度>1就会出错。

e.g. spatial.distance.correlation(u, v)    #计算向量u和v之间的相关系数(pearson correlation coefficient, Centered Cosine)

Note: 如果向量u和v元素数目都只有一个或者某个向量中所有元素相同(分母norm(u - u.mean())为0),那么相关系数当然计算无效,会返回nan。

braycurtis(u, v)Computes the Bray-Curtis distance between two 1-D arrays.
canberra(u, v)Computes the Canberra distance between two 1-D arrays.
chebyshev(u, v)Computes the Chebyshev distance.
cityblock(u, v)Computes the City Block (Manhattan) distance.
correlation(u, v)Computes the correlation distance between two 1-D arrays.
cosine(u, v)Computes the Cosine distance between 1-D arrays.
dice(u, v)Computes the Dice dissimilarity between two boolean 1-D arrays.
euclidean(u, v)Computes the Euclidean distance between two 1-D arrays.
hamming(u, v)Computes the Hamming distance between two 1-D arrays.
jaccard(u, v)Computes the Jaccard-Needham dissimilarity between two boolean 1-D arrays.
kulsinski(u, v)Computes the Kulsinski dissimilarity between two boolean 1-D arrays.
mahalanobis(u, v, VI)Computes the Mahalanobis distance between two 1-D arrays.
matching(u, v)Computes the Matching dissimilarity between two boolean 1-D arrays.
minkowski(u, v, p)Computes the Minkowski distance between two 1-D arrays.
rogerstanimoto(u, v)Computes the Rogers-Tanimoto dissimilarity between two boolean 1-D arrays.
russellrao(u, v)Computes the Russell-Rao dissimilarity between two boolean 1-D arrays.
seuclidean(u, v, V)Returns the standardized Euclidean distance between two 1-D arrays.
sokalmichener(u, v)Computes the Sokal-Michener dissimilarity between two boolean 1-D arrays.
sokalsneath(u, v)Computes the Sokal-Sneath dissimilarity between two boolean 1-D arrays.
sqeuclidean(u, v)Computes the squared Euclidean distance between two 1-D arrays.
wminkowski(u, v, p, w)Computes the weighted Minkowski distance between two 1-D arrays.
yule(u, v)Computes the Yule dissimilarity between two boolean 1-D arrays.
[ 距离和相似度计算 ]

scipy.spatial.distance.pdist(X, metric=’euclidean’, p=2, w=None, V=None, VI=None)

pdist(X[, metric, p, w, V, VI])Pairwise distances between observations in n-dimensional space.观测值(n维)两两之间的距离。Pairwise distances between observations in n-dimensional space.距离值越大,相关度越小。

注意,距离转换成相似度时,由于自己和自己的距离是不会计算的默认为0,所以要先通过dist = spatial.distance.squareform(dist)转换成dense矩阵,再通过1 - dist计算相似度。

metric:

1 距离计算可以使用自己写的函数。Y = pdist(X, f) Computes the distance between all pairs of vectors in Xusing the user supplied 2-arity function f.

如欧式距离计算可以这样:

dm = pdist(X, lambda u, v: np.sqrt(((u-v)**2).sum()))

但是如果scipy库中有相应的距离计算函数的话,就不要使用dm = pdist(X, sokalsneath)这种方式计算,sokalsneath调用的是python自带的函数,会调用c(n, 2)次;而应该使用scipy中的optimized C version,使用dm = pdist(X, 'sokalsneath')。

再如矩阵行之间的所有cause effect值的计算可以这样:

def causal_effect(m):
    effect = lambda u, v: u.dot(v) / sum(u) - (1 - u).dot(v) / sum(1 - u)
    return spatial.distance.squareform(spatial.distance.pdist(m, metric=effect))

2 这里计算的是两两之间的距离,而不是相似度,如计算cosine距离后要用1-cosine才能得到相似度。从下面的consine计算公式就可以看出。

Y = pdist(X, ’euclidean’)    #d=sqrt((x1-x2)^2+(y1-y2)^2+(z1-z2)^2)

Y = pdist(X, ’minkowski’, p)


scipy.spatial.distance.cdist(XA, XB, metric=’euclidean’, p=2, V=None, VI=None, w=None)

cdist(XA, XB[, metric, p, V, VI, w])Computes distance between each pair of the two collections of inputs.

当然XA\XB最简单的形式是一个二维向量(也必须是,否则报错ValueError: XA must be a 2-dimensional array.),计算的就是两个向量之间的metric距离度量。

scipy.spatial.distance.squareform(X, force=’no’, checks=True)

squareform(X[, force, checks])Converts a vector-form distance vector to a square-form distance matrix, and vice-versa.

将向量形式的距离表示转换成dense矩阵形式。Converts a vector-form distance vector to a square-form distance matrix, and vice-versa.

注意:Distance matrix 'X' must be symmetric&diagonal must be zero.

皮皮blog



矩阵距离计算示例

示例1

x
array([[0, 2, 3],
       [2, 0, 6],
       [3, 6, 0]])
y=dis.pdist(x)
Iy
array([ 4.12310563,  5.83095189,  8.54400375])
z=dis.squareform(y)
z
array([[ 0.        ,  4.12310563,  5.83095189],
       [ 4.12310563,  0.        ,  8.54400375],
       [ 5.83095189,  8.54400375,  0.        ]])
type(z)
numpy.ndarray
type(y)
numpy.ndarray

示例2

print(sim)
print(spatial.distance.cdist(sim[0].reshape((1, 2)), sim[1].reshape((1, 2)), metric='cosine'))
print(spatial.distance.pdist(sim, metric='cosine'))
[[-2.85 -0.45]
 [-2.5   1.04]]

[[ 0.14790689]]

[ 0.14790689]

皮皮blog



检验距离矩阵有效性Predicates for checking the validity of distance matrices

Predicates for checking the validity of distance matrices, bothcondensed and redundant. Also contained in this module are functionsfor computing the number of observations in a distance matrix.

is_valid_dm(D[, tol, throw, name, warning])Returns True if input array is a valid distance matrix.
is_valid_y(y[, warning, throw, name])Returns True if the input array is a valid condensed distance matrix.
num_obs_dm(d)Returns the number of original observations that correspond to a square, redundant distance matrix.
num_obs_y(Y)Returns the number of original observations that correspond to a condensed distance matrix.
from: http://blog.csdn.net/pipisorry/article/details/48814183

ref: Distance computations (scipy.spatial.distance)

Spatial algorithms and data structures (scipy.spatial)

scipy-ref-0.14.0-p933


### 回答1: from scipy.spatial.distance import cdist是Python中的一个,用于计算两个数组之间的距离。这个可以计算各种距离,例如欧几里得距离、曼哈顿距离、切比雪夫距离等等。这个在数据分析和机器学习中非常有用,可以用于聚类、分类、回归等任务。 ### 回答2: from scipy.spatial.distance import cdist是一个函数中的方法,可以用于计算两组数据之间的距离。这个方法的使用需要引入scipy中的spatial模块,并且通过from语句来具体导入cdist方法。 cdist方法可以用于计算两组数据点之间的不同距离度量,包括欧氏距离、曼哈顿距离、切比雪夫距离等。这些距离度量可用于衡量两个向量之间的差异程度或相似度。 具体使用cdist方法时,需要传入两组数据点作为参数,分别表示两个点集合。这两组数据点必须是二维数组,其中每个数组表示一个数据点,每个数组的长度应该相同,以确保可以进行计算。 cdist方法的返回值是一个二维数组,其中每个元素代表两个数据点之间的距离。返回数组的行数和参数中第一个点集合的数据点数量相同,列数和参数中第二个点集合的数据点数量相同。 总的来说,from scipy.spatial.distance import cdist是一种方便计算两组数据点之间距离的方法,可以从scipyspatial模块中导入并使用。这个方法的返回结果是一个二维数组,代表了两组数据点之间的距离。 ### 回答3: `from scipy.spatial.distance import cdist`是Python中用于计算两个集合之间的距离的函数。 首先,需要在Python代码中导入`scipy.spatial.distance`模块,并且使用`cdist`函数。 `cdist`函数的主要功能是计算两个集合之间的距离。它接受4个参数,分别是集合A和集合B,以及一个指定距离度量的方法和一个可选参数(关于度量方法的更多信息可以查阅Scipy官方文档)。 其中,集合A和集合B是两个需要计算距离的集合,可以是数组、矩阵或列表等形式。它们的形状可以是n维的,但是需要保持一致。集合可以包含多个向量,其中每个向量都是一个数据点。 距离度量的方法是用于计算集合A中的每个点与集合B中的每个点之间的距离的方法。可以使用不同的度量方法,例如欧氏距离、曼哈顿距离、闵可夫斯基距离等。根据不同的问题需求,选择适合的度量方法。 最后,`cdist`函数会返回一个矩阵,其中每个元素都是集合A中的某个点与集合B中的某个点之间的距离。矩阵的大小为A中的数据点数目乘以B中的数据点数目。 总之,`from scipy.spatial.distance import cdist`模块提供了一个方便的函数,可以计算两个集合之间的距离。这对于聚类分析、分类问题、特征工程等数据科学任务非常有用。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值