也许这是基本的,但我找不到使用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)
我在这里和这里检查了文档.但是,我没有看到它期待什么类型的论点.
有没有我可以看到使用马哈拉诺比斯距离的例子?
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]:
编辑:
由于某些原因(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]]))