web-dev-qa-db-ja.com

sklearn DistanceMetricsでマハラノビス距離を使用する方法は?

これは初歩的なことかもしれませんが、mahalanobissklearn距離を使用する良い例を見つけることができません。

私はこのようなメトリックを取得することさえできません:

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)

ドキュメントをチェックしました ここここ 。しかし、どのような種類の議論が期待されているのかわかりません。
私が見ることができるマハラノビス距離を使用した例はありますか?

8
Sother

MahalanobisDistanceは、共分散行列であるパラメーターVと、オプションで共分散行列の逆行列である別のパラメーターVIを期待しています。さらに、これらのパラメーターは両方ともnamedであり、定位置ではありません。

sklearn repo のファイルscikit-learn/sklearn/neighbors/dist_metrics.pyxにあるクラスMahalanobisDistanceの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>

編集:

いくつかの理由(バグ?)で、距離オブジェクトを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]])) 
15
tttthomasssss

行列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になります。

1
Jaewoolee