3

2 つの n 次元ベクトル間の距離を測定する必要があります。ここはマハラノビスディスタンスが良さそうなので試してみたいと思います。

私のコードは次のようになります。

import numpy as np
import scipy.spatial.distance.mahalanobis

x = [19, 8, 0, 0, 2, 1, 0, 0, 18, 0, 1673, 9, 218]
y = [17, 6, 0, 0, 1, 2, 0, 0, 8, 0, 984, 9, 30]
scipy.spatial.distance.mahalanobis(x,y,np.linalg.inv(np.cov(x,y)))

しかし、次のエラー メッセージが表示されます。

/usr/lib/python2.7/dist-packages/scipy/spatial/distance.pyc in mahalanobis(u, v, VI)
    498     v = np.asarray(v, order='c')
    499     VI = np.asarray(VI, order='c')
--> 500     return np.sqrt(np.dot(np.dot((u-v),VI),(u-v).T).sum())
    501 
    502 def chebyshev(u, v):

ValueError: matrices are not aligned

Scipy Docによると、それは共分散行列の逆数であり、共分散行列VIであり、行列の逆数であると思います...np.covnp.linalg.inv

しかし、ここで何が問題なのかがわかります (行列が整列していません): Matrix VI の寸法が間違っています (13x13 ではなく 2x2)。したがって、可能な解決策はこれを行うことです:

VI = np.linalg.inv(np.cov(np.vstack((x,y)).T))

残念ながら detnp.cov(np.vstack((x,y)).T)は 0 です。これは、逆行列が存在しないことを意味します。

では、共分散行列を計算することさえできない場合、どのようにマハラノビス距離測定を使用できますか?

4

2 に答える 2