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

Python 如何在sklearn DistanceMetrics中使用马氏距离?,python,arrays,scikit-learn,mahalanobis,Python,Arrays,Scikit Learn,Mahalanobis,也许这是最基本的,但我在sklearn中找不到使用mahalanobis距离的好例子 我甚至不能得到这样的度量: from sklearn.neighbors import DistanceMetric DistanceMetric.get_metric('mahalanobis') 这会引发一个错误:TypeError:0维数组给定。数组必须至少是二维的 但是,我甚至不能让它接受数组: DistanceMetric.get_metric('mahalanobis', [[0.5],[0.7]

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

我甚至不能得到这样的度量:

from sklearn.neighbors import DistanceMetric
DistanceMetric.get_metric('mahalanobis')
这会引发一个错误:
TypeError:0维数组给定。数组必须至少是二维的

但是,我甚至不能让它接受数组:

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

TypeError: get_metric() takes exactly 1 positional argument (2 given)
我查了一下文件和文件。但是,我看不出它期望的是什么类型的参数。

是否有一个使用我能看到的马氏距离的例子?

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

还要检查文档字符串中的文件
scikit learn/sklearn/neights/dist_metrics.pyx
中的类
MahalanobisDistance

例如:

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>

在使用矩阵M(X X Y)创建cov矩阵时,需要转置矩阵M。 马氏公式是(x-x1)^t*逆矩阵*(x-x1)。正如你们所看到的,第一个参数被转置,这意味着矩阵XY变为YX。为了生成第一个参数和cov矩阵,cov矩阵应为YY形式

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

如何使用距离度量,比如说
最近邻
或聚类?当我尝试使用它时,我得到了
ValueError:Metric对算法'auto'无效
@Sother我在我的答案中添加了一个
NearestNeighbor
示例。适用于
nearestneighbories
,但我没有看到算法和聚类算法的
“Metric\u params”
?我尝试使用
dm=DistanceMetric.get\u Metric('mahalanobis',=icov)
distance function,然后是
db=DBSCAN(eps=x,min_samples=1,metric='pyfunc',func='dm',algorithm='brute').fit(np.array(x_train'u numeric))
但它不识别
“func”
作为参数。@因此我从未使用
mahalanobis
距离与
DBSCAN
,但是它看起来似乎还没有得到DBSCAN的正确支持——我建议在github上打开一个问题,或者在
sklearn
邮件列表上询问。
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]]))