Python 不确定点的最近邻

Python 不确定点的最近邻,python,scikit-learn,nearest-neighbor,mahalanobis,Python,Scikit Learn,Nearest Neighbor,Mahalanobis,我有两个2D点集A和B。我想为B中的每个点找到A中的第一个最近邻。 但是,我处理的是不确定点(即点具有平均值(2D向量)和2*2协方差矩阵) 因此,我希望使用马氏距离,但在scikit learn(例如)中,我无法为每个点传递协方差矩阵,因为它需要一个协方差矩阵 目前,仅考虑平均位置(即2D正态分布的平均值),我有: 对于我的不确定点,我宁愿计算(在a中的点a和b中的点b之间)它们的马氏距离: d(a, b) = sqrt( transpose(mu_a-mu_b) * C * (mu_a-mu

我有两个2D点集
A
B
。我想为
B
中的每个点找到
A
中的第一个最近邻。 但是,我处理的是不确定点(即点具有平均值(2D向量)和2*2协方差矩阵)

因此,我希望使用马氏距离,但在
scikit learn
(例如)中,我无法为每个点传递协方差矩阵,因为它需要一个协方差矩阵

目前,仅考虑平均位置(即2D正态分布的平均值),我有:

对于我的不确定点,我宁愿计算(在
a
中的点
a
b
中的点
b
之间)它们的马氏距离:

d(a, b) = sqrt( transpose(mu_a-mu_b) * C * (mu_a-mu_b))
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:])))
其中
C=inv(cov_a+cov_b)


其中
mu_a
(resp
mu_b
)和
cov_a
(resp
cov_b
)是不确定点
a
(resp
b
)的二维均值和2*2协方差矩阵.

您可以使用自己的距离函数,通过简单的列表理解来实现KNN解决方案。这是一个使用内置于OpenCV库中的Mahalanobis距离实现的示例

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]))

在第一种情况下,我使用了一种插入排序的变体,并考虑了参数K。当N>>K

我使用自定义距离时,这种方法会更有效:

d(a, b) = sqrt( transpose(mu_a-mu_b) * C * (mu_a-mu_b))
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个特征:

  • x
    y
    坐标
  • x
    y
    方差(在我的例子中,协方差矩阵是对角的)

向我们展示您的代码尝试、输入和预期输出想到的唯一想法是使用6D向量作为输入(存储位置及其协方差矩阵的四个分量),并定义我自己的距离函数。