当前位置: 首页 > 知识库问答 >
问题:

如何优化查找相似性?

赵英资
2023-03-14

我有一组由浮点向量表示的30000个文档。所有向量都有100个元素。我可以通过使用向量之间的余弦度量来比较两个文档来找到相似性。问题是找到最相似的文档需要很多时间。有什么算法可以帮助我加快速度吗?

编辑

现在,我的代码只计算第一个向量和所有其他向量之间的余弦相似度。大约需要3秒钟。我想加快速度;)算法不一定要精确,但应该给出与全搜索相似的结果。

每个向量的元素之和等于1。

start = time.time()

first = allVectors[0]
for vec in allVectors[1:]:
    cosine_measure(vec[1:], first[1:])

print str(time.time() - start)

共有3个答案

淳于嘉树
2023-03-14

如果向量被归一化,则余弦与欧几里得距离有关:||a-b||²=(a-b)²=||a||²||b|||²-2||a| ||b| | cos(t)=11-2cos(t)。所以你可以用欧几里得最近邻来重新定义你的问题。

kD树是一种很好的方法,kD树是一种概括二分搜索法的空间数据结构(http://en . Wikipedia . org/wiki/K-d _ tree)。反正kD树在高维度(你的情况)效率低是众所周知的,所以首选所谓的Best-bin-first-search(http://en . Wikipedia . org/wiki/Best-bin-first _ search)。

赏弘
2023-03-14

有一篇论文《如何逼近内积:欧几里德相似性的快速动态算法》描述了如何执行内积的快速逼近。如果这还不够好或不够快,我建议建立一个包含所有文档的索引。一个类似于四叉树但基于测地线网格的结构可能会非常有效,参见使用分层三角网格索引球体。

更新:我完全忘记了你在处理100维。对高维数据进行索引是出了名的困难,我不确定对一个球体进行索引将如何推广到100维。

贺元明
2023-03-14

局部敏感散列(LHS)会有帮助吗?在LHS的情况下,散列函数根据您选择的概率将相似的项目映射到彼此附近。据称它特别适合高维相似性搜索/最邻近搜索/接近重复检测,在我看来,这正是您正在努力实现的。

参见 如何理解局部性敏感哈希?

 类似资料:
  • 我正在尝试开发一个简单的搜索引擎,以获得匹配的句子在一个文本文件与nodejs,但我想改进我的搜索引擎,以获得相似的文本,而不仅仅是准确的文本,有什么建议,我可以如何做到这一点? 这是我的代码:

  • 问题内容: 如何查询相似度排序的记录? 例如。搜索“库存溢出”将返回 堆栈溢出 SharePoint溢出 数学溢出 政治溢出 视觉特效溢出 例如。搜索“ LO”将返回: 巴勃罗毕加索 米开朗基罗 杰克逊·波洛克 我需要什么帮助: 使用搜索引擎索引和搜索MySQL表,以获得更好的结果 使用Sphinx搜索引擎和PHP 在PHP中使用Lucene引擎 使用全文索引,查找相似/包含的字符串 什么不好 L

  • 18.4. 优化字典查找 Soundex 算法的第二步是依照特定规则将字符转换为数字。 做到这点最好的方法是什么? 最明显的解决方案是定义一个以单字符为键并以所对应数字为值的字典,以字典查找每个字符。这便是 soundex/stage1/soundex1c.py 中使用的方法(目前最好的结果): charToSoundex = {"A": "9", "B": "

  • 问题内容: 我有一个查询,使用带通配符的“ like”来搜索客户端。例如: 它还可以在“ where”子句中使用较少的参数,例如: 谁能说出优化这种查询性能的最佳方法是什么?也许我需要创建一个索引?该表在生产中最多可以有1000K条记录。 问题答案: 要在模式具有表单的位置上做很多事情,您需要查找SQL Server的全文本索引功能,并使用代替。照原样,您正在执行全表扫描,因为普通索引对搜索以通配

  • 我试图找出关键的优化选项。首先,用 -Q-v列出了启用的标志(-faggressive loop optimizations-falign labels-fasynchronous unwind tables等)。然后,如果将这些标志直接提供给gcc而不是-O3,那么如果禁用了优化,则生成的程序的性能将降低。 gcc文件指出 并不是所有的优化都由一个标志直接控制 会是这个问题还是我错过了其他的?

  • 问题内容: 我在Java中有一个缓冲的图像,我想根据颜色值记录每个像素与另一个像素的相似程度。因此具有“相似”颜色的像素将具有较高的相似度值。例如,红色和粉红色的相似度值为1000,但是红色和蓝色的相似度为300或更小。 我怎样才能做到这一点。当我从缓冲的图像像素获得RGB时,它返回一个负整数,我不确定该如何实现它。 问题答案: 首先,如何获得整数值? 获得RGB值后,您可以尝试 ((r2-r1)