3

2 つの 2D ポイント セットAとがありBます。Aの各点について、最初の最近傍を見つけたいと思いますB。しかし、私は不確実な点を扱っています (つまり、点には平均 (2D ベクトル) と 2*2 共分散行列があります)。

したがって、マハラノビス距離を使用したいと思いますが、scikit-learn(たとえば) では、単一の共分散行列が必要なため、各点の共分散行列を渡すことができません。

現在、平均的な位置 (つまり、2D 正規分布の平均) のみを考慮すると、次のようになります。

nearest_neighbors = NearestNeighbors(n_neighbors=1, metric='l2').fit(A)
distance, indices = nearest_neighbors.kneighbors(B)

L2 ノルムを距離として使用する代わりに、私の不確かな点を使用して、( B 内の点と Ba内の点の間、それらのマハラノビス距離:Ab

d(a, b) = sqrt( transpose(mu_a-mu_b) * C * (mu_a-mu_b))

どこC = inv(cov_a + cov_b)

ここでmu_a(それぞれmu_b) とcov_a(それぞれ ) は不確定点(cov_bそれぞれ ) の 2D 平均と 2*2 共分散行列です。ab

4

2 に答える 2

0

カスタム距離を使用することになりました:

def my_mahalanobis_distance(x, y):
    '''
    x: array of shape (4,) x[0]: mu_x_1, x[1]: mu_x_2, 
                            x[2]: cov_x_11, x[3]: cov_x_22
    y: array of shape (4,) y[0]: mu_ y_1, y[1]: mu_y_2,
                            y[2]: cov_y_11, y[3]: cov_y_22 
    '''     



    return sp.spatial.distance.mahalanobis(x[:2], y[:2], 
                                           np.linalg.inv(np.diag(x[2:]) 
                                           + np.diag(y[2:])))

したがって、ポイントには 4 つの機能があります。

  • xy座標
  • xおよびy分散(私の場合、共分散行列は対角です)
于 2017-01-09T09:06:39.737 に答える
0

リスト内包表記を使用して、独自の距離関数を使用して KNN ソリューションを簡単に実装できます。これは、OpenCV ライブラリに組み込まれているマハラノビス距離の実装を使用した例です。

import numpy as np
import cv2

np_gallery=np.array(gallery)
np_query=np.array(query)

K=12

ids=[]

def insertionsort(comp_list):
    for i in range( 1, len(comp_list)):
    tmp = comp_list[i]
    k = min(i,K)
    while k > 0 and tmp[1] < comp_list[k - 1][1]:
        comp_list[k] = comp_list[k - 1]
        k -= 1
    comp_list[k] = tmp

def search():
    for q in np_query:
        c = [(i,cv2.Mahalanobis(q, x, icovar)) for i, x in enumerate(np_gallery)]
        insertionsort(c)
        ids.append(map(lambda tup: tup[0], c[0:K]))

また

def search():
    for q in np_query:
        c = [(i,cv2.Mahalanobis(q, x, icovar)) for i, x in enumerate(np_gallery)]
        ids.append(map(lambda tup: tup[0], sorted(c, key=lambda tup: tup[1])[0:K]))

最初のケースでは、パラメータ K を考慮した挿入ソートの変形を使用します。これは、N >> K の場合により効率的です。

于 2017-01-06T21:23:59.820 に答える