我想使用Scipy的Kd树来加快KNN搜索,但我不清楚如何将数据格式化为1)-创建树和2)-使用树来加快搜索。
为了详细说明,我有一个Netflix训练数据的pandas数据帧,它由用户列、他们评分的每个电影项目以及他们给它的评分组成(见下文)。使用这些训练数据,我现在通过计算测试用户的最近邻居(KNN)来预测测试用户的评级。最近的邻居是使用皮尔逊相关系数计算的,而不是欧氏距离。一旦计算出最近邻居,我想使用最近邻居来预测/猜测测试用户的评级。
然而,我的用户和电影列表很大(netflix数据),计算数千部电影中数千名用户的最近邻居在计算上变得不可行。Kd树方法已被建议作为加速K最近邻的方法。
有没有一种方法可以使用Scipy的Kd树来加快这种方法?如果是,那么数据需要采用什么格式才能使用Kd树方法?我知道这个问题有一个内置的滑雪套件学习功能,但我需要能够独立实现。
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的KD树仅支持p-范数度量(例如,p=2是标准欧几里得距离)。如果您想要更通用的指标,scikit learn的BallTree支持许多不同的指标。特别是,相关度量与Pearson相关系数有关,因此您可以将算法建立在使用该度量进行有效搜索的基础上。
也就是说,如果你有数千个维度,基于树的方法通常不会比暴力更好。更好的方法是使用某种近似算法,如位置敏感哈希,并为相关距离设计哈希函数。