如何使用 Scipy 的 Kd-tree 函数来加速 K-Nearest Neighbors (KNN) [关闭]
Posted
技术标签:
【中文标题】如何使用 Scipy 的 Kd-tree 函数来加速 K-Nearest Neighbors (KNN) [关闭]【英文标题】:How to use Scipy's Kd-tree function to speed up K-Nearest Neighbors (KNN) [closed] 【发布时间】:2018-04-14 14:57:33 【问题描述】:我希望使用 Scipy's Kd-tree 来加速 KNN 搜索,但我不清楚如何将数据格式化为 1)- 创建树和 2)-使用树来加速搜索。
详细地说,我有一个 Netflix 训练数据的 pandas 数据框,它由用户列、他们评分的每个电影项目以及他们给出的评分组成(见下文)。使用此训练数据,我现在通过计算测试用户的最近邻 (KNN) 来预测测试用户的评分。最近邻是使用皮尔逊相关系数计算的,而不是欧几里得距离。一旦计算出最近的邻居,我想使用最近的邻居来预测/猜测测试用户的评分。
但是,我的用户和电影列表很大(netflix 数据),为数千部电影中的数千名用户计算最近邻在计算上变得不可行。建议使用 Kd-tree 方法来加速 K 最近邻。
有没有办法使用 Scipy 的 Kd-tree 来加速这种方法?如果是这样,数据需要采用什么格式才能使用 Kd-tree 方法?我知道有一个针对这个确切问题的内置 Ski-kit 学习功能,但我需要能够独立实现。
Goal: predict user 1 rating on movie 10 by finding most similar users
Training data
user movie rating
2 7 5.0
3 10 3.0
4 4 1.0
50 3363 2.0
50 7 3.0
83 50 4.0
83 7 5.0
etc
【问题讨论】:
为什么允许 scipy 而不允许 sklearn?据我所知,Scipy 的 kdtree 仅支持 p-norm 指标,因此您无能为力!众所周知,kNN 不能很好地处理这类数据。 【参考方案1】:Scipy 的 KD 树仅支持 p 范数度量(例如 p=2 是标准欧几里德距离)。如果您想要更通用的指标,scikit-learn 的 BallTree 支持许多不同的指标。特别是,correlation metric 与 Pearson 相关系数相关,因此您可以将算法建立在使用此指标进行有效搜索的基础上。
也就是说,如果您有数千个维度,那么基于树的方法通常并不比蛮力更好。更好的是使用某种近似算法,例如Locality Sensitive Hashing,以及针对相关距离设计的哈希函数。
【讨论】:
您是否知道一种易于实现的局部敏感哈希算法可以用于此,最好已经在 python 包中实现?以上是关于如何使用 Scipy 的 Kd-tree 函数来加速 K-Nearest Neighbors (KNN) [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
当您想与目标函数一起计算梯度时,如何使用 scipy.optimize.minimize 函数?