使用scipy的cdist函数时无法计算马氏距离

时间:2019-12-09 10:59:38

标签: python numpy scikit-learn scipy distance

我想计算矩阵的每一行和单个行向量之间的马氏距离。最初,我使用np.tile创建一个矩阵,该矩阵包含矢量的多个副本以创建一个均等形状的矩阵,然后使用sklearn.metrics.pairwise.paired_distances计算行距。

我想知道是否还有其他更可读的方法,这就是为什么几周前我问this question的原因。用户 Divakar 想到了使用cdist(a,b).ravel()的想法。我发现此替代方法更具可读性,因此使用了它。我用metric='euclidean'测试了这两个函数,发现它们产生相同的结果。但是,当我将指标切换为metric='mahalanobis'(我现在要使用)时,第一种方法似乎可以使用,但是cdist替代方法会引发以下错误:

  

ValueError:观察数(3)太小;的   协方差矩阵是奇异的。对于3维观测,   至少需要进行4次观察。

有人可以解释这里发生了什么吗?为什么使用欧几里得距离而不使用马氏距离时,这些函数会产生相同的结果?

这是我的代码:

import numpy as np
from sklearn.metrics.pairwise import paired_distances
from scipy.spatial.distance import cdist

# get matrix a and vector b
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[7],[8],[9]]).transpose()

# define metric
METRIC = 'mahalanobis'

# define distance function that computes the distance between each row of a matrix
# and another matrix that contains duplicates of the single input vector.
def vector_to_matrix_distance(matrix_array,vector_array,metric):
    vector_array_tiled = np.tile(vector_array,(matrix_array.shape[0],1))
    return paired_distances(matrix_array,vector_array_tiled)

# run distance function
distances_1 = vector_to_matrix_distance(matrix_array=a,
                                     vector_array=b,
                                     metric=METRIC)

# Use cdist to do the SAME calculation.This works when METRIC = 'euclidean' but
# not when METRIC = 'mahalanobis'
distances_2 = cdist(a,b,metric=METRIC).ravel()

0 个答案:

没有答案