如何使用 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 中使用最小化函数

当您想与目标函数一起计算梯度时,如何使用 scipy.optimize.minimize 函数?

如何将参数传递给其他函数(通常通过 scipy)?

KD-tree

如何计算 lambda 以对 500 列的整个数据框使用 scipy.special.boxcox1p 函数?

如何对 SciPy 曲线拟合施加约束?