向量相似度
cosine相似度:衡量两个向量之间的夹角。
c
o
s
(
x
⃗
,
y
⃗
)
=
x
⃗
⋅
y
⃗
∣
x
⃗
∣
∣
y
⃗
∣
cos(\vec{x}, \vec{y})=\frac{\vec{x}\cdot \vec{y}}{\left | \vec{x} \right |\left | \vec{y} \right |}
cos(x,y)=∣x∣∣y∣x⋅y
jaccard相似度:衡量两个集合之间的相似性。
j a c c a r d ( A , B ) = ∣ A ∩ B ∣ ∣ A ∪ B ∣ jaccard(A, B)=\frac{\left | A \cap B \right |}{\left | A\cup B \right |} jaccard(A,B)=∣A∪B∣∣A∩B∣
皮尔逊相似系数:衡量两个变量集合之间的相似性。
ρ ( X , Y ) = ∑ ( X − X ˉ ) ( Y − Y ˉ ) ∑ ( X − X ˉ ) 2 ∑ ( Y − Y ˉ ) 2 \rho_{ (X, Y)}=\frac{\sum (X-\bar{X})(Y-\bar{Y})}{\sqrt{\sum(X-\bar{X})^2 \sum(Y-\bar{Y})^2}} ρ(X,Y)=∑(X−Xˉ)2∑(Y−Yˉ)2∑(X−Xˉ)(Y−Yˉ)
NSW
基本思想
通过把所有item放入图中,并在图中进行检索的方法提升海量数据近邻检索的速度。根据这一基本思想,NSW主要有两个步骤,下文会简要阐述这两个步骤。
- 构建图
- 图上进行检索
构建图
NSW构建图的过程简单描述为边查找边插入,首先NSW规定每个节点最多链接m个友点(有边连接),进而采用边查找边插入的思想构建图,即先随机找一个点 i t e m 0 item_0 item0放入图中,之后每次当向图中插入一个点 i t e m i item_i itemi时,首先查找图中与待插入点 i t e m i item_i itemi最相近的m个点,将这m个点与 i t e m i item_i itemi进行连接,这个点插入完毕,因而下文的重点在于如何查找待插入点 i t e m i item_i itemi最相近的m个点。
- 构建如下数据结构:废弃列表junk_list、动态列表dynamic_list、影子动态列表shadow_dynamic_list。
- 随机选择一个点 i t e m 0 item_0 item0放入dynamic_list中,置空junk_list和shadow_dynamic_list。
- 并行寻找dynamic_list所有点的"友点",如果查找的友点在junk_list中,则不做记录;如果不在junk_list中,把这些点放入junk_list中,且并行计算这些点与待插入点 i t e m i item_i itemi之间的距离,并将这些点以及距离存入dynamic_list中。
- 对dynamic_list中的点按照距离进行升序排序,保留前m个点。
- 查看shadow_dynamic_list与dynamic_list中的点,如果相同则结束查找;如果不同,则将dynamic_list复制到shadow_dynamic_list,继续完成第3步。
图检索
图检索的过程和<构建图>的查找过程相同。
HNSW
构建图
与NSW不同的是,HNSW构建的图是分层级的,具体来说,先随机选择一部分点进行第一层的构建,之后再从剩余节点中选择一部分点添加至图中与第一层的节点构成第二层…,以此类推,直到构建完最后一层,使得这一层涵盖所有节点。
![](https://img-blog.csdnimg.cn/20181221204511661.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEyMzMzNTE=,size_16,color_FFFFFF,t_70)
图检索
先在一层中进行查找,查找的方式和NSW相同,如果shadow_dynamic_list与dynamic_list相同,则结束查找;如果不同,则将dynamic_list复制到shadow_dynamic_list,接着在下一层进行查找。