我希望使用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
答案 0 :(得分:2)
Scipy的KD树仅支持p范数度量(例如p = 2是标准欧几里德距离)。如果您想要更多通用指标,scikit-learn的BallTree支持许多不同的指标。特别是,correlation metric与Pearson相关系数有关,因此您可以使用此指标对算法进行有效搜索。
也就是说,如果你有数千个维度,那么基于树的方法往往不比蛮力更好。更好的方法是使用某种近似算法,例如Locality Sensitive Hashing,以及为相关距离设计的散列函数。