KNN高效实现

数据挖掘 决策树 表现 k-nn 执行 表示
2022-02-28 12:57:41

KNN 算法非常方便,特别适合我的一些问题,但我找不到任何关于如何在生产中实现它的资源。

作为一个比较示例,当我使用神经网络时,我已经可以使用高级工具,允许我将神经网络应用于示例(任何一个库都允许我在我想做嵌入式时巧妙地利用我的设备的硬件) ,或者基础设施,如果我想在云上运行它们,我可以以较低的成本使用我的神经网络),这些工具通常是黑盒子,并且经过了很好的优化,尤其是当你向它们传递一批示例时。

似乎没有这样的工具可以大规模使用 KNN,例如在云上,我想必须自己实现它。

一个简单的 KNN 实现,包括计算从推断示例到所有已知和记录示例的距离,使得计算成本和使用它的财务成本爆炸式增长(奇怪的是,这比我使用神经网络时支付的成本高得多网络,尽管算法看起来更简单)。

你认识分享高效且廉价的 KNN 实现的人吗?或者你对这个主题有什么想法?

我开始想象启发式方法可以快速取消距离太远的示例,而无需一一查看。

具体来说,这将由一组 n 维嵌套网格组成,这样在每个嵌套网格序列中搜索就像在树或哈希表中搜索一样,并且允许将示例定位在与嵌套网格序列一样多的 bin 中。然后,人们期望最接近的示例要么在同一个 bin 中,要么在一个连续的 bin 中(因为该示例可能靠近 bin 边界)。

我想人们也可以想象将空间划分为决策区域(例如,1-KNN 会生成 Voronoi 图)。

但是,我不是研究人员,我的想法肯定无法挑战最先进的技术或已经存在和探索的想法。

2个回答

我建议你使用 facebook 的faiss它是一个用于相似性搜索的库,可用于在大型向量集合上计算 kNN。

来自facebook自己的号码

  • 通过近似索引,可以在 35 分钟内在四个 Maxwell Titan X GPU 上构建 YFCC100M 数据集的 9500 万张图像的 128D CNN 描述符上的蛮力 k 最近邻图 (k = 10),其中 10 交点为 0.8 ,包括索引构建时间。
  • 十亿向量 k 最近邻图现在很容易实现。一个人可以在四个 Maxwell Titan X GPU 上在 12 小时内创建一个 0.65 的 10 个交叉点的 Deep1B 数据集的蛮力 k-NN 图 (k = 10),或者在八个 Pascal P100-PCIe 上在 12 小时内创建一个 0.8 个交叉点GPU。在 Titan X 配置上,可以在 5 小时内生成质量较低的图表。

要添加@noe 写的非常真实的内容,

KNN 的复杂性总是取决于 1) 维数 2) 距离函数

如果您有很多维度,则可以使用降维算法并在顶部执行 KNN。降维可以是非常简单的,例如 PCA,您在前 N 个组件上执行 KNN,或者更复杂的自动编码器,其中有许多嵌入层。如果您正在考虑实时场景,解码也将添加到运行时间中,因此您可以看到降维 + knn 的哪种组合可以为您提供最佳性能。

你谈到了“生产”——好吧,在生产中你不会训练模型。这意味着您应该有一个训练有素的模型(训练点之间的所有距离)(不是 N*N-1/2),并且只需计算“测试/传入”观察与训练对象之间的距离。因此,如果您有 N 个训练点,将是 N 次计算。

当然,我也推荐Dask它有一个内置的 KNN 实现,例如herehere