余弦相似度 faiss
时间: 2025-02-19 22:21:15 浏览: 59
### 如何在Faiss中使用余弦相似度进行向量检索
为了实现基于余弦相似度的向量检索,通常会先标准化向量使得它们具有单位长度。这是因为余弦相似度本质上衡量的是角度差异而非距离,而L2范数归一化后的向量正好满足这一需求[^1]。
下面是一个简单的Python代码片段来展示如何利用Facebook AI Similarity Search (FAISS)库执行带有余弦相似性的最近邻搜索:
```python
import faiss
import numpy as np
# 假设有如下数据集,其中每行代表一个文档对应的词频-逆文档频率(tf-idf)特征向量
d = 64 # 向量维度
nb = 1000 # 数据集中样本数量
np.random.seed(1234) # 设置随机种子以获得可重复的结果
xb = np.random.random((nb, d)).astype('float32')
faiss.normalize_L2(xb) # 对所有向量进行L2规范化处理
index = faiss.IndexFlatIP(d) # 创建索引对象用于计算内积(即余弦相似度)
index.add(xb) # 将训练好的向量加入到索引结构里
k = 4 # 查询返回最接近目标查询点的数量
q = xb[:5].copy() # 取前五个作为测试用例
faiss.normalize_L2(q) # 测试之前同样要对查询向量也做一次L2正则化操作
D, I = index.search(q, k) # 执行实际查找过程并获取结果的距离矩阵D以及对应ID列表I
print(I)
```
上述脚本创建了一个`IndexFlatIP`实例来进行内部乘法运算,这实际上就是实现了余弦相似度测量方法;同时通过调用`normalize_L2()`函数确保输入的数据已经被转换成单位向量形式。
值得注意的是,在构建索引时还可以考虑采用其他类型的索引来加速大规模数据库上的近似KNN搜索效率,比如IVF或HNSW等复杂结构,但这超出了当前讨论范围[^4]。
阅读全文
相关推荐




















