如何在sklearn DistanceMetrics中使用mahalanobis距离?

时间:2016-01-06 21:54:20

标签: python arrays scikit-learn mahalanobis

也许这是基本的,但我找不到在mahalanobis中使用sklearn距离的好例子。

我甚至无法得到这样的指标:

from sklearn.neighbors import DistanceMetric
DistanceMetric.get_metric('mahalanobis')

这会引发错误:TypeError: 0-dimensional array given. Array must be at least two-dimensional

但是,我甚至无法得到一个阵列:

DistanceMetric.get_metric('mahalanobis', [[0.5],[0.7]])

投掷:

TypeError: get_metric() takes exactly 1 positional argument (2 given)

我查看了文档herehere。但是,我没有看到它所期望的论点类型 有没有我能看到的使用马哈拉诺比斯距离的例子?

2 个答案:

答案 0 :(得分:15)

MahalanobisDistance期望参数V是协方差矩阵,并且可选地是另一参数VI,其是协方差矩阵的逆。此外,这两个参数都命名为而不是位置。

另请查看sklearn repo文件MahalanobisDistance中的课程scikit-learn/sklearn/neighbors/dist_metrics.pyx的docstring。

示例:

In [18]: import numpy as np
In [19]: from sklearn.datasets import make_classification
In [20]: from sklearn.neighbors import DistanceMetric
In [21]: X, y = make_classification()
In [22]: DistanceMetric.get_metric('mahalanobis', V=np.cov(X))
Out[22]: <sklearn.neighbors.dist_metrics.MahalanobisDistance at 0x107aefa58>

修改

由于某些原因(bug?),您无法将距离对象传递给NearestNeighbor构造函数,但需要使用距离度量的名称。此外,设置algorithm='auto'(默认为'ball_tree')似乎不起作用;所以从上面的代码中可以看出X

In [23]: nn = NearestNeighbors(algorithm='brute', 
                               metric='mahalanobis', 
                               metric_params={'V': np.cov(X)})
# returns the 5 nearest neighbors of that sample
In [24]: nn.fit(X).kneighbors(X[0, :])     
Out[24]: (array([[ 0., 3.21120892, 3.81840748, 4.18195987, 4.21977517]]), 
          array([[ 0, 36, 46,  5, 17]])) 

答案 1 :(得分:1)

在使用矩阵M(X x Y)创建cov矩阵时,需要转置矩阵M。 马哈拉诺比斯公式为(x-x1)^ t *逆covmatrix *(x-x1)。如您所见,第一个参数已转置,这意味着矩阵XY更改为YX。为了产生第一个参数和cov矩阵,cov矩阵应为YY形式。

如果您仅使用np.cov(M),它将是XX, 使用np.cov(M.T),它将为YY。