【推荐系统中的Hash 2】局部敏感哈希(利用冲突)

二、局部敏感哈希(利用冲突)

之前提到的向量检索方法中最主流的快速方法就是利用局部敏感哈希实现的,属于近似最近邻查找(Approximate Nearest Neighbor, ANN)的一种。

向量检索目标:在海量向量中为向量q检索出最相似的k个向量。

背景方法

KNN

KNN就不多说了,遍历整个向量物料库,一一计算向量内积,返回最大的K个。如果索引频率是用户访问请求级别的是承担不起的。

Kd-tree

Kd-Tree激光点云编程中经常使用的一个工具,比如在三维点云中kd-tree的维度是3,向量是k维就是kd-tree。这里以二维为例方便讲解。

在这里插入图片描述

首先将2维数据点组织成二叉树的结构,比如先用红色的线把点云一分为二,再用深蓝色的线把各自片区的点云一分为二,以此类推,直到每个片区只剩下一个点,这就完成了空间索引的构建。如果我们能够把这套索引“搬”到线上,就可以利用二叉树的结构快速找到邻接点。比如,希望找到点 q 的 k 个邻接点,我们就可以先搜索它相邻子树下的点,如果数量不够,我们可以向上回退一个层级,搜索它父片区下的其他点,直到数量凑够 k 个为止。

kd-tree的实现是改造的线段树。

kd-tree的准确度缺点是无法完全解决边缘点最近邻的问题。对于点 q 来说,它的邻接片区是右上角的片区,但是它的最近邻点却是深蓝色切分线下方的那个点。

kd-tree的性能缺点是构造和维护树结构的索引也比较复杂

Locality Sensitive Hashing——LSH

局部敏感哈希的基本思想是希望让相邻的点落入同一个“桶”,这样在进行最近邻搜索时,我们仅需要在一个桶内,或相邻几个桶内的元素中进行搜索即可。

理论基础:高维空间的点映射到低维空间,原本接近的点在低维空间中肯定依然接近,但原本远离的点则有一定概率变成接近的点。比如用内积作为相似度。

把二维空间中的点通过不同角度映射到 a、b、c 这三个一维空间时,可以看到原本相近的点,在一维空间中都保持着相近的距离。而原本远离的绿色点和红色点在一维空间 a 中处于接近的位置,却在空间 b 中处于远离的位置。

在这里插入图片描述

假设 v

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
局部敏感哈希(Locality Sensitive Hashing,简称LSH)是一种用于高维数据近似最近邻搜索的技术。它通过将相似的数据映射到相同的哈希,从而加速近似最近邻的查找过程。 在Matlab,可以使用以下步骤实现局部敏感哈希: 1. 定义哈希函数:LSH使用多个哈希函数来将数据映射到不同的哈希。在Matlab,可以使用随机投影或者随机超平面来定义哈希函数。 2. 构建哈希表:根据定义的哈希函数,将数据集的每个数据点映射到对应的哈希。可以使用Matlab哈希表数据结构来实现。 3. 查询最近邻:对于给定的查询点,使用相同的哈希函数将其映射到对应的哈希,并在该桶搜索近似最近邻。可以使用欧氏距离或余弦相似度等度量来评估近似最近邻的相似度。 以下是一个简单的局部敏感哈希Matlab实现示例: ```matlab % 定义哈希函数 function hash = hashFunction(data, randomMatrix) hash = sign(randomMatrix * data); end % 构建哈希表 function hashTable = buildHashTable(dataSet, numHashFunctions) hashTable = containers.Map; randomMatrix = randn(numHashFunctions, size(dataSet, 1)); for i = 1:size(dataSet, 2) data = dataSet(:, i); hash = hashFunction(data, randomMatrix); if isKey(hashTable, hash) hashTable(hash) = [hashTable(hash), i]; else hashTable(hash) = i; end end end % 查询最近邻 function nearestNeighbor = queryNearestNeighbor(query, hashTable, numHashFunctions) randomMatrix = randn(numHashFunctions, size(query, 1)); hash = hashFunction(query, randomMatrix); nearestNeighbor = []; if isKey(hashTable, hash) candidates = hashTable(hash); minDistance = Inf; for i = 1:length(candidates) candidate = candidates(i); distance = computeDistance(query, dataSet(:, candidate)); if distance < minDistance minDistance = distance; nearestNeighbor = candidate; end end end end % 示例数据集 dataSet = randn(100, 1000); % 构建哈希表 numHashFunctions = 10; hashTable = buildHashTable(dataSet, numHashFunctions); % 查询最近邻 query = randn(100, 1); nearestNeighbor = queryNearestNeighbor(query, hashTable, numHashFunctions); ``` 这是一个简单的局部敏感哈希的Matlab实现示例,其包括了定义哈希函数、构建哈希表和查询最近邻的步骤。你可以根据实际需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值