我想计算矩阵的每一行和单个行向量之间的马氏距离。最初,我使用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()