加权 k 最近邻搜索

数据挖掘 机器学习 数据 搜索
2021-10-12 15:35:50

我已经搜索了很多,但没有找到任何有用的结果。

问题陈述是:给定一组向量,我希望找到它的近似 k 近邻。这里需要注意的是,我的每个维度都类似于不同的实体,因此我们在计算距离时不能对每个维度使用相同的权重。因此,像 kd-tree 这样的解决方案不能按原样工作。

是否有任何数据结构或任何替代算法可用于查找此类近似加权 k 最近邻。

注意:将初始输入数据与其权重相乘以获得统一的权重不是一种选择。

2个回答

我强烈建议使用上述缩放,因为它比手动方法更快。如果由于某种原因,缩放/预处理不可用,请使用该metric参数传递自定义加权函数。请参见下面的示例。

import numpy as np

from sklearn.neighbors import KNeighborsClassifier as KNN

arr = np.random.randn(500, 10) # train X data
y = np.random.randint(2, size=(500,)) # train y data

# define custom weight function
weights = np.abs(np.random.randn(100)) # set up the desired weights
def weighted_distance(sample_x, sample_y):
    global weights
    return np.sqrt(sum((w * w * x * x * y * y) for w, x, y in zip(weights, sample_x, sample_y)))

knn = KNN(n_neighbors=3, metric=weighted_distance)
knn.fit(arr, y)
test = np.random.randn(5,10) # validation or test data
knn.predict(np.random.randn(5,10)) # predict
```

根据@an6u5 的评论:

如果您想将一个维度的权重高于其他维度,那么我建议您将所有数据标准化,以使均值为零,标准差为一。然后,您可以将不太重要的维度乘以一个因子 (2-10),以便它们看起来离 KNN 距离度量更远,而最重要的维度不缩放。请注意,标准化和缩放都是完全可逆的过程,因此没有理由不使用这个简单的解决方案