【发布时间】:2017-12-01 05:03:58
【问题描述】:
Cosine similarity 两个相等大小的向量(实数)之间的定义为点积除以范数的乘积。
为了表示向量,我有一个float 数组的大表,例如CREATE TABLE foo(vec float[])'。给定某个 float 数组,我需要通过余弦相似度快速(使用索引,而不是 seqscan)找到该表中最接近的数组,例如SELECT * FROM foo ORDER BY cos_sim(vec, ARRAY[1.0, 4.5, 2.2]) DESC LIMIT 10; 但是我用什么?
pg_trgm 的余弦相似度支持不同。它比较文本,我不确定它到底做了什么。一个名为smlar (here) 的扩展也支持浮点数组的余弦相似度,但又做了一些不同的事情。我所描述的通常用于数据分析来比较文档的特征,所以我认为 Postgres 会支持它。
【问题讨论】:
-
你能解释一下你所说的“有索引”是什么意思吗?余弦相似度是一种二元运算,在您描述的结构中,它将对成对的行进行运算。索引不采用成对的行。
-
@rd_nielsen
<也是二元运算符,但 Postgres 中支持 btree 索引以通过过滤和排序加快查询。 -
那些俄罗斯人不会创建不支持索引的扩展 :) 他们是全文搜索(使用 GiST、GIN insexes)、数组索引功能(通过 GiST 的 GIN 和 RD-tree)的作者、GiST 版本的 R-tree(替换原始 R-tree 实现)、hstore、对 jsonb 的索引支持等等。如果在不支持索引的情况下实现“smlar”,我会感到非常惊讶。
-
通常,距离定义为 1/相似度。所以更大的相似性,“更相似”的对象——它们之间的距离更小。
-
哦。 “N_i 是交点中唯一元素的数量,N_a 和 N_b 是每个向量中唯一元素的数量”看起来更像 Jaccard 相似度(不完全是一些奇怪的变体),绝对不像余弦相似度......你在哪里接受那个定义?源代码或文档?能给个链接吗?
标签: postgresql cosine-similarity