これは初歩的なことかもしれませんが、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
を期待しています。さらに、これらのパラメーターは両方とも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]]))
行列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になります。