python - 如何在sklearn DistanceMetrics中使用马氏距离?

标签 python arrays scikit-learn mahalanobis

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

我什至无法获得这样的指标:

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

这会抛出一个错误:TypeError: 0-dimensional array given.数组必须至少是二维的

但是,我什至无法让它接受数组:

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

抛出:

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

我查看了文档 herehere .但是,我看不到它期望的参数类型。
有没有我能看到的使用马氏距离的例子?

最佳答案

MahalanobisDistance 需要一个参数 V,它是协方差矩阵,以及可选的另一个参数 VI,它是协方差矩阵的逆矩阵。此外,这两个参数都是命名而不是位置。

同时检查文件 scikit-learn/sklearn/neighbors/dist_metrics.pyx 中类 MahalanobisDistance 的文档字符串 sklearn repo .

示例:

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]])) 

关于python - 如何在sklearn DistanceMetrics中使用马氏距离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34643548/

相关文章:

c - 动态分配用户输入的字符串

python - 我无法将 ML 模型加载到尝试使用 joblib 和 pickle 的 flask 中

machine-learning - 逻辑回归对异常值敏感吗?在合成二维数据集上使用

python - 维护一个固定大小的堆-python

python - 运算符 "<>"在 Python 中是什么意思?

c - C中对象的指针矩阵

java - 按列的内容对矩阵或二维数组进行排序

python - 如何在 Scikit 中使用交叉验证进行多输出回归?

python - __name__ 的目的是什么?

python - 如何强制嵌入式 python 使用与命令行一相同的 sys.path?