两种使用局部敏感哈希查找最近邻居的算法,哪一种?

2024-01-21

目前我正在研究如何使用局部敏感哈希来查找最近邻居。然而,当我阅读论文和搜索网络时,我发现了两种执行此操作的算法:

1-使用L个哈希表和L个随机LSH函数,从而增加两个相似文档获得相同签名的机会。例如,如果两个文档的相似度为 80%,那么它们有 80% 的机会从一个 LSH 函数获得相同的签名。但是,如果我们使用多个 LSH 函数,则从其中一个 LSH 函数获得文档相同签名的机会就更高。这种方法在维基百科中有解释,我希望我的理解是正确的:

http://en.wikipedia.org/wiki/Locality-sensitive_hashing#LSH_algorithm_for_nearest_neighbor_search http://en.wikipedia.org/wiki/Locality-sensitive_hashing#LSH_algorithm_for_nearest_neighbor_search

2-另一种算法使用来自 Moses S. Charikar 的论文(第 5 节)中的方法,该论文名为:来自舍入算法的相似性估计技术。它基于使用一个 LSH 函数生成签名,然后对其应用 P 排列,然后对列表进行排序。其实我不太明白这个方法,希望有人能澄清一下。

我的主要问题是:为什么有人会使用第二种方法而不是第一种方法?我发现它更容易、更快。

我真的希望有人能帮忙!!!

编辑: 实际上我不确定@Raff.Edward 是否混合了“第一”和“第二”。因为只有第二种方法使用半径,而第一种方法只是使用由哈希族 F 组成的新哈希族 g。请检查维基百科链接。他们只是使用许多 g 函数来生成不同的签名,然后对于每个 g 函数都有一个相应的哈希表。为了找到一个点的最近邻居,您只需让该点通过 g 函数并检查相应的哈希表是否有冲突。因此,我将其理解为更多的功能……更多的碰撞机会。

我没有发现任何关于第一种方法的半径的提及。

对于第二种方法,他们只为每个特征向量生成一个签名,然后对其应用 P 排列。现在我们有 P 个排列列表,其中每个排列包含 n 个签名。现在,他们对 P 中的每个列表进行排序。在给定查询点 q 后,他们为其生成签名,然后对其应用 P 排列,然后对每个排列和排序的 P 列表使用二分搜索来查找最相似的签名查询 q。我在阅读了很多有关它的论文后得出了这个结论,但我仍然不明白为什么有人会使用这种方法,因为它在找到汉明距离方面似乎并不快!!!!

对我来说,我只需执行以下操作即可找到查询点 q 的最近邻居。给定一个签名列表 N,我将为查询点 q 生成签名,然后扫描列表 N 并计算 N 中每个元素与 q 签名之间的汉明距离。因此我最终会得到 q 的最近邻居。而且需要 O(N)!!!


你对第一个的理解有点偏差。碰撞发生的概率与相似度不成正比,而与是否小于预先定义的半径成正比。目标是半径内的任何物体都有很高的几率发生碰撞,半径 * (1+eps) 之外的任何物体发生碰撞的几率都很低(并且中间的区域有点模糊)。

第一种算法实际上很难实现,但是可以得到很好的结果。特别是,第一个算法适用于 L1 和 L2(以及技术上的更多)指标。

第二种算法实现起来非常简单,但根据问题的大小,简单的实现可能会占用太多内存而无法发挥作用。在这种情况下,碰撞概率与输入的相似度成正比。但是,它仅适用于余弦相似度(或基于相似度变换的距离度量。)

因此,您将使用哪一个主要取决于您为最近邻居(或任何其他应用程序)使用的距离度量。

第二个实际上比第一个更容易理解和实现,只是论文非常罗嗦。

简短版本:取一个随机向量 V 并为每个索引赋予一个独立的随机单位正态值。根据签名长度创建任意数量的向量。签名就是做矩阵向量乘积时每个索引的符号。现在,任意两个签名之间的汉明距离与各个数据点之间的余弦相似度相关。

因为您可以将签名编码为 int 数组,并使用带有位计数指令的 XOR 来非常快速地获取汉明距离,所以您可以非常快速地获得近似余弦相似度分数。

LSH 算法没有太多标准化,而且两篇论文(以及其他论文)使用不同的定义,因此有时会有点令人困惑。我最近才实现了这两种算法JSAT https://code.google.com/p/java-statistical-analysis-tool/,并且仍在努力充分理解它们。

编辑:回复您的编辑。维基百科的文章对 LSH 来说不太好。如果您阅读了原纸 http://people.csail.mit.edu/indyk/nips-nn.ps,您所说的第一种方法仅适用于固定半径。然后根据该半径创建哈希函数,并将其连接起来以增加碰撞中接近点的概率。然后,他们构建了一个系统,通过确定他们想要的 k 的最大值,然后找到最大的值,在此基础上进行 k-NN合理的他们找到第 k 个最近邻的距离。这样,半径搜索很可能会返回 k-NN 集合。为了加快速度,他们还创建了一些额外的小半径,因为密度通常不均匀,并且使用的半径越小,结果越快。

您链接的维基百科部分取自“稳定分布”部分的论文描述,该部分提供了搜索半径 r=1 的哈希函数。

对于第二篇论文,您描述的“排序”不是散列的一部分,而是更快地搜索汉明空间的单一方案的一部分。正如我所提到的,我最近实现了这个,你可以看到快速基准 I http://jsatml.blogspot.com/2013/06/cosine-similarity-locality-sensitive.html使用暴力搜索确实比朴素的神经网络方法快得多。同样,如果您需要 L2 或 L1 距离上的余弦相似度,您也可以选择此方法。您会发现许多其他论文提出了不同的方案来搜索签名创建的汉明空间。

如果您需要帮助来说服自己,即使您仍在使用蛮力,拟合也会更快 - 只需这样看:假设平均稀疏文档与另一个文档有 40 个常见单词(根据我的经验,这是一个非常保守的数字)。您有 n 个文档可供比较。强力余弦相似度将涉及大约 40*n 浮点乘法(以及一些额外的工作)。如果您有 1024 位签名,则只有 32 个整数。这意味着我们可以在 32*n 整数运算中进行强力 LSH 搜索,这比浮点运算快得多。

这里还有其他因素在起作用。对于稀疏数据集,我们必须保留双精度和整数索引来表示非零索引,因此稀疏点积会执行大量额外的整数运算来查看它们有哪些共同索引。 LSH 还允许我们节省内存,因为我们不需要为每个向量存储所有这些整数和双精度数,相反我们可以只保留它的散列 - 这只有几个字节。 减少内存使用可以帮助我们更好地利用CPU缓存。

你的 O(n) 是我在博客文章中使用的天真的方式。而且速度很快。但是,如果您事先对位进行排序,则可以在 O(log(n)) 中进行二分搜索。即使你有 L 个这样的列表,L

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

两种使用局部敏感哈希查找最近邻居的算法,哪一种? 的相关文章

  • 如何为多边形创建内部螺旋?

    对于任何形状 我如何在其内部创建类似形状的螺旋 这与边界 使用 Minkowski 和 类似 尽管它会是相同形状的螺旋 而不是在形状内部创建相同的形状 我找到了这个 http www cis upenn edu cis110 13su le
  • 如何在 python 中使用 libSVM 计算精度、召回率和 F 分数

    我想计算precision recall and f score using libsvm在Python中 但我不知道如何 我已经发现这个网站 http www csie ntu edu tw cjlin libsvmtools eval
  • 如何将多边形放入另一个多边形内[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有两个多边形 如下图所示 左边是 粗多边形 右边是 最终多边形 现在 我正在寻找算法来将 最终多边形 拟合到 粗糙多边形 内 并具有
  • 预处理 csv 文件以与 tflearn 一起使用

    我的问题是关于在将 csv 文件输入神经网络之前对其进行预处理 我想使用 python 3 中的 tflearn 为著名的 iris 数据集构建一个深度神经网络 数据集 http archive ics uci edu ml machine
  • 什么是“朴素”算法,什么是“封闭式”解决方案?

    我有一些关于描述算法时使用的术语语义的问题 首先 朴素 算法是什么意思 这与给定问题的其他解决方案有何不同 解决方案还可以采取哪些其他形式 其次 我听到很多人提到 封闭式 解决方案 我也不知道这意味着什么 但在尝试解决递归关系时经常会出现
  • 坐标算法 - 绕中心旋转

    通过查看这张图片 我想您会很好地理解我的问题 图片已删除 网址不再有效 现在返回广告 所以基本上我想要一个函数 它接受一个对象作为参数 并根据我之前添加的对象数量为该对象提供正确的坐标 假设我将所有这些对象添加到一个数组中 objectAr
  • heapq.nlargest 的时间复杂度是多少?

    我在看演讲者说 获得t列表中最大的元素n元素可以在O t n 这怎么可能 我的理解是创建堆将是O n 但是复杂度是多少nlargest本身就是O n t or O t 实际的算法是什么 在这种情况下 说话者是错误的 实际成本是O n log
  • 为什么这个算法的Big-O复杂度是O(n^2)?

    我知道这个算法的大O复杂度是O n 2 但我不明白为什么 int sum 0 int i 1 j n n while i lt j sum 即使我们设定了j n n一开始 我们在每次迭代期间递增 i 并递减 j 因此最终的迭代次数不应该比n
  • 求先递增后递减列表的最大值和最小值

    我尝试用谷歌搜索这个问题 但没有取得太大成功 我确信这个问题或类似问题有一个技术名称 但我似乎找不到答案 给定一个列表L整数 即严格递增 然后严格递减 找到该列表的最大值和最小值 例如 L可能 1 2 3 4 5 4 3 2 or 2 4
  • 贝尔曼福特算法可以有任意的边顺序吗?

    我刚刚开始学习新算法 但当我阅读 极客为极客而写的贝尔曼福特算法 时 我陷入了困境 http www geeksforgeeks org dynamic programming set 23 bellman ford algorithm h
  • 删除近排序数组中未排序/离群元素

    给定一个像这样的数组 15 14 12 3 10 4 2 1 我如何确定哪些元素乱序并删除它们 在本例中为数字 3 我不想对列表进行排序 而是检测异常值并将其删除 另一个例子 13 12 4 9 8 6 7 3 2 我希望能够删除 4 和
  • 如何区分结构化数据和非结构化数据?

    结构化数据和非结构化数据有什么区别 这种差异如何影响各自的数据挖掘方法 我熟悉的术语是结构化的 and 非结构化的数据 除了后缀之外 与 Q 中的内容相同 我在机器学习中使用这两种类型的数据 但我不知道任何正式的定义 然而 我怀疑几乎每个工
  • 计算序列而无法存储值?

    问题陈述 here http www spoj com problems EC SER 令 S 为无限整数序列 S0 a S1 b Si Si 2 Si 1 对于所有 i gt 2 你有两个整数 a 和 b 您必须回答有关序列中第 n 个元
  • 大 ר 符号到底代表什么?

    我真的很困惑大 O 大 Omega 和大 Theta 表示法之间的区别 我知道大 O 是上限 大 Omega 是下限 但是大 theta 到底代表什么 我读过这意味着紧束缚 但是 这是什么意思 首先我们来了解一下什么是大O 大Theta和大
  • scikit-learn 适合大数据任务吗?

    我正在研究一项涉及使用机器学习技术的 TREC 任务 其中数据集由超过 5 TB 的 Web 文档组成 计划从中提取词袋向量 scikit learn有一组不错的功能似乎可以满足我的需求 但我不知道它是否能够很好地扩展以处理大数据 例如 是
  • 从二叉堆中查找第 k 个最小元素的 O(klogk) 时间算法

    我们有一个 n 节点二叉堆 其中包含n不同的项目 根部的最小项目 为一个k lt n 发现O klogk 时间算法选择kth堆中的最小元素 O klogn 很明显 但无法找出O klogk 一 也许我们可以使用第二个堆 但不确定 好吧 你的
  • 使用 scikit 时 scipy.sparse 矩阵的缩放问题

    在使用 scikit learn 解决机器学习问题时 我需要在使用 SVM 进行训练之前对 scipy sparse 矩阵进行缩放 但在文档 http scikit learn org stable modules preprocessin
  • 实时战略战争游戏人工智能算法

    我正在设计一款实时策略战争游戏 其中 AI 将负责控制大型六边形地图上的大量单位 可能超过 1000 个 一个单位有许多行动点 可以用于移动 攻击敌方单位或各种特殊行动 例如建造新单位 例如 一辆拥有 5 个行动点的坦克可以花费 3 个行动
  • while循环的时间复杂度是多少?

    我正在尝试找出 while 循环的时间复杂度 但我不知道从哪里开始 我了解如何找到 for 循环的复杂性类别 但是当涉及到 while 循环时 我完全迷失了 关于从哪里开始有什么建议 提示吗 这是一个问题的示例 x 0 A n some a
  • 找到一个数字所属的一组范围

    我有一个 200k 行的数字范围列表 例如开始位置 停止位置 该列表包括除了非重叠的重叠之外的所有类型的重叠 列表看起来像这样 3 5 10 30 15 25 5 15 25 35 我需要找到给定数字所属的范围 并对 100k 个数字重复该

随机推荐

  • 生成 M 个箱中 N 个球的所有排列

    我想生成一组排列n球进m垃圾箱 以下一组嵌套列表生成这些排列 n lt 3 m lt 4 v lt rep 0 m for i in n 0 for j in n sum i 0 for k in n sum i j 0 for l in
  • 敲除 javascript foreach 绑定

    我试图允许用户创建一个铸造并向该铸造对象添加一组类别 我试图使用淘汰赛的 foreach 绑定到类别数组 并让用户向铸造添加新类别 我创建了一个 jsfiddle 来说明我在这里试图解释的内容 http jsfiddle net msell
  • Ruby 中的大指数?

    我只是在做一些与大学相关的 Diffie Hellman 练习 并尝试使用 ruby 遗憾的是 Ruby 似乎无法处理大指数 警告 在 a b 中 b 可能太大 NaN 有什么办法解决吗 例如 特殊的数学课或类似的课程 附注这是有问题的代码
  • 获取 Azure 队列中的消息 ID

    有没有办法在将消息插入队列Azure后获取消息ID CloudStorageAccount storageAccount CloudStorageAccount parse storageConnectionString CloudQueu
  • 我可以克隆未来吗?

    我想为未来编写一些通用的重试逻辑 我知道具体的返回类型 并且想在未来重试相同的操作 我的代码只能访问未来 我不想将每个 fn 调用站点包装在闭包中以启用重新创建它 似乎 未来 是 fn args 的组合 并且当 await被调用后 它会运行
  • 如何解决“无法读取 null 的属性‘appendChild’”错误?

    我尝试使用下面的代码 它在我的网站上的幻灯片中添加按钮 window onload function loadContIcons var elem document createElement img elem src http arno
  • Django 模板看不到 CSS 文件

    我正在构建一个 django 应用程序 但无法获取模板来查看 CSS 文件 我的 settings py 文件如下所示 MEDIA ROOT os path join os path abspath os path dirname file
  • Spring Boot未加载application.dev.properties文件

    在我的项目中 我想使用环境特定的属性文件 例如 如果我将其运行到开发中 它应该使用 application dev properties 对于生产它应该使用 application prod properties 等等 我的资源文件夹中有以
  • 当内容较长时,itextsharp 不会创建新页面

    我尝试从 3 天开始寻找制作一份 pdf 文档的方法 如果有任何帮助 我将不胜感激 我有几个表单字段可以毫无问题地访问和填写 我想在此字段下方放置动态创建的表 该表可以足够长 可以包含多个页面 这是我的问题 我无法将此表添加到其下方带有表单
  • 使用上次响应中的数据预填写 Google 表单

    我正在构建一个 Google 表单 我是唯一使用的表单 我每天使用该表单两次 或多或少 我希望某些字段预先填写我上次给出的响应值 因为它们的值不会经常更改 我将我的回复保存在 Google 电子表格中 以便可以从那里获取它们 但我对 Goo
  • 渲染多对多字段

    我试图在模板中显示多个字段 但我得到的只是空白 我将其显示如下 for vehicle in vehicle features features li vehicle features li endfor 我的模型如下 class Vehi
  • 如何使用最新版本的 FFMPEG 在视频录制中创建时间间隙?

    我是论坛的新手 所以我希望我正确地提出了这个问题 我已经下载了最新版本的 FFMPEG 我想用它通过在其中插入时间间隙来修改现有视频 这就是我所说的时间间隔 如果我输入的视频持续 2 秒并以 FPS 10 录制 则其帧的时间戳将如下 0 1
  • 删除 apk 后,每当我启动调试时,它都会告诉我该包尚未安装

    我打开了模拟器 并使用命令提示符删除了我的应用程序 我没有关闭模拟器 然后我进入 Eclipse 并点击 调试 但没有将 apk 部署到模拟器 只是告诉我该包尚未在系统中注册 New package not yet registered w
  • gtk2hs:删除小部件后请求重新计算窗口大小

    我有一个带有三个条目小部件和一个按钮的窗口 我使用该按钮以编程方式删除其中一个小部件 问题是主窗口在被删除后不会改变其大小以适应新的布局 我可以想象我需要向主循环发送一些信号或事件 这会导致重新计算 但我一直无法找到这样的功能 这是一些示例
  • Django的bulk_create函数示例

    我试图理解 Django 中的bulk create 这是我试图转换的原始查询 for e in q msg Message objects create recipient number e mobile content batch co
  • 如何更改 TreeView 节点高度,在节点中绘制 3 条线

    我将 D7 与 TreeView 不是 VirtualTreeView 一起使用 如何更改节点高度以使用 OwnerDraw 并在节点矩形中绘制 3 或 5 或更多 行 文本 所以树应该看起来像这样 显示根节点 2 个节点 aaa 和 bb
  • 使用 PM2 运行自定义 npm 脚本

    我目前正在开发几个 Telegram 机器人 但我想将它们全部保存在同一个 git 存储库中 问题是 另一方面 我想将它们作为单独的进程运行 由于我使用的是 Telegraf 框架 因此要运行机器人 请执行以下操作 micro bot sr
  • 如何在容器内保存对不同元素的多个引用?

    考虑这个简单的例子 v Vec
  • mailchimp api 2.0通过php订阅?

    我需要一个如何通过电子邮件地址订阅 mailchimp 时事通讯的示例 请在此处查看新的 api 链接 https bitbucket org mailchimp mailchimp api php https bitbucket org
  • 两种使用局部敏感哈希查找最近邻居的算法,哪一种?

    目前我正在研究如何使用局部敏感哈希来查找最近邻居 然而 当我阅读论文和搜索网络时 我发现了两种执行此操作的算法 1 使用L个哈希表和L个随机LSH函数 从而增加两个相似文档获得相同签名的机会 例如 如果两个文档的相似度为 80 那么它们有