我已经搜索了很多,但没有找到任何有用的结果。
问题陈述是:给定一组向量,我希望找到它的近似 k 近邻。这里需要注意的是,我的每个维度都类似于不同的实体,因此我们在计算距离时不能对每个维度使用相同的权重。因此,像 kd-tree 这样的解决方案不能按原样工作。
是否有任何数据结构或任何替代算法可用于查找此类近似加权 k 最近邻。
注意:将初始输入数据与其权重相乘以获得统一的权重不是一种选择。
我已经搜索了很多,但没有找到任何有用的结果。
问题陈述是:给定一组向量,我希望找到它的近似 k 近邻。这里需要注意的是,我的每个维度都类似于不同的实体,因此我们在计算距离时不能对每个维度使用相同的权重。因此,像 kd-tree 这样的解决方案不能按原样工作。
是否有任何数据结构或任何替代算法可用于查找此类近似加权 k 最近邻。
注意:将初始输入数据与其权重相乘以获得统一的权重不是一种选择。
我强烈建议使用上述缩放,因为它比手动方法更快。如果由于某种原因,缩放/预处理不可用,请使用该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 距离度量更远,而最重要的维度不缩放。请注意,标准化和缩放都是完全可逆的过程,因此没有理由不使用这个简单的解决方案