如何使用Scipy的Kd-tree函数来加速K-Nearest Neighbors(KNN)

时间:2017-11-02 06:55:54

标签: python pandas machine-learning scipy scikit-learn

我希望使用Scipy's Kd-tree来加速KNN搜索,但我不清楚如何格式化数据1) - 创建树和2) - 使用树加速我的搜索。

详细说明,我有一个关于Netflix培训数据的pandas数据框,该数据框由用户列,他们评定的每个电影项以及他们给出的评级组成(见下文)。使用此训练数据,我现在通过计算测试用户的最近邻居(KNN)来预测测试用户的评级。使用Pearson相关系数计算最近邻居,而不是欧几里德距离。一旦计算出最近邻居,我想使用最近邻居预测/猜测测试用户的评级。

然而,我的用户和电影列表很大(netflix数据),并且计算数千个电影中数千个用户的最近邻居变得在计算上不可行。已经建议使用Kd树方法来加速K最近邻居。

有没有办法使用Scipy的Kd树加速这种方法?如果是这样,使用Kd树方法需要采用什么格式的数据?我知道有一个内置的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

1 个答案:

答案 0 :(得分:2)

Scipy的KD树仅支持p范数度量(例如p = 2是标准欧几里德距离)。如果您想要更多通用指标,scikit-learn的BallTree支持许多不同的指标。特别是,correlation metric与Pearson相关系数有关,因此您可以使用此指标对算法进行有效搜索。

也就是说,如果你有数千个维度,那么基于树的方法往往不比蛮力更好。更好的方法是使用某种近似算法,例如Locality Sensitive Hashing,以及为相关距离设计的散列函数。