13

也许这是基本的,但我找不到使用mahalanobis距离 in的好例子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)

我在这里这里查看了文档。但是,我看不出它期待什么类型的论点。
有没有使用我可以看到的马氏距离的例子?

4

2 回答 2

23

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

还要检查sklearn repoMahalanobisDistance文件scikit-learn/sklearn/neighbors/dist_metrics.pyx中类的文档字符串。

例子:

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>

编辑:

由于某些原因(错误?),您不能将距离对象传递给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]])) 
于 2016-01-07T08:23:50.437 回答
2

在使用矩阵 M (X x Y) 创建 cov 矩阵时,您需要转置矩阵 M. mahalanobis 公式为 (x-x1)^t * 逆 covmatrix * (x-x1)。如您所见,第一个参数已转置,这意味着矩阵 XY 更改为 YX。为了将第一个参数和cov矩阵相乘,cov矩阵应该是YY的形式。

如果你只使用 np.cov(M),它将是 XX,使用 np.cov(MT),它将是 YY。

于 2019-04-11T00:47:49.360 回答