码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 向量检索/向量相似性计算方法(持续更新ing...)


    诸神缄默不语-个人CSDN博文目录

    本文介绍各种用于向量检索的向量相似性计算方法,将会简单介绍各种方法的优缺点等信息,并用toy example给出代码示例。

    文章目录

    • 1. 余弦相似度
    • 2. 线性核(点积)
      • 2.1 sklearn实现
    • 3. 向量检索
      • 解决方案
      • 理论和术语
    • 4. 排序
    • 5. 向量存储(向量数据库)
    • 其他参考资料

    1. 余弦相似度

    使用sklearn.metrics.pairwise.cosine_similarity实现。
    最终得到的值会在[-1,1]之间。

    API官方文档:sklearn.metrics.pairwise.cosine_similarity — scikit-learn 1.1.2 documentation
    对计算公式的介绍:https://scikit-learn.org/stable/modules/metrics.html#cosine-similarity

    计算公式:
    k ( x , y ) = x y ⊤ ∥ x ∥ ∥ y ∥ k(x, y) = \frac{x y^\top}{\|x\| \|y\|} k(x,y)=∥x∥∥y∥xy⊤​

    计算一组向量之间的两两相似度,代码撰写方法:

    from sklearn.metrics.pairwise import cosine_similarity
    cos_sim_matrix = cosine_similarity(train_feature)
    #入参是一个二维矩阵,每行是一个样本特征
    

    2. 线性核(点积)

    2.1 sklearn实现

    使用sklearn.metrics.pairwise.linear_kernel实现。

    API官方文档:sklearn.metrics.pairwise.linear_kernel — scikit-learn 1.1.2 documentation

    计算公式:
    k ( x , y ) = x ⊤ y k(x, y) = x^\top y k(x,y)=x⊤y

    3. 向量检索

    解决方案

    1. Faiss包:L2和/或点积向量。速度飞快
      原理:聚合键,基于簇中心查找邻居
      facebookresearch/faiss: A library for efficient similarity search and clustering of dense vectors.
    2. annoy库:可以在大规模数据上检索(200W条已试可用)
      spotify/annoy: Approximate Nearest Neighbors in C++/Python optimized for memory usage and loading/saving to disk
      pip install annoy
      示例代码:
    #用TFIDF做向量(一个做文本表征的示例),然后用annoy算法计算相似度
    
    #TFIDF部分
    from sklearn.feature_extraction.text import TfidfVectorizer
    
    tfidf=TfidfVectorizer(max_features=500)
    sp_tfidf=tfidf.fit_transform(corpus)  #corpus是一个文本列表
    
    #annoy部分
    from annoy import AnnoyIndex
    from tqdm import tqdm
    
    #存储
    f=sp_tfidf.shape[1]  # Length of item vector that will be indexed
    
    t = AnnoyIndex(f, 'angular')
    for i in tqdm(range(len(corpus))):
        t.add_item(i, sp_tfidf[i].toarray().squeeze())  #第2个元素是一个数组
    
    t.build(10) # 10 trees
    t.save('存储路径.ann')
    
    #调用
    u = AnnoyIndex(f, 'angular')
    u.load('存储路径.ann') # super fast, will just mmap the file
    print(u.get_nns_by_item(0, 1000)) # will find the 1000 nearest neighbors
    #返回值是向量的索引
    #如果用get_nns_by_vector的话第一个入参就改成向量,如sp_tfidf[0].toarray().squeeze()
    

    理论和术语

    1. 单调性

    4. 排序

    一般来说顺序是先检索(返回一个集合)然后再排序

    1. 拟合回归模型并计算MSE
      参考资料:Recommending movies: ranking | TensorFlow Recommenders
    2. Listwise ranking
      参考资料:Listwise ranking | TensorFlow Recommenders

    5. 向量存储(向量数据库)

    1. VBASE

    其他参考资料

    1. 我还没看:
      1. 最近邻搜索(NN)、最大内积搜索(MIPS)与(A)LSH算法 - 知乎
      2. ChatGPT盛行的当下,向量数据库为大模型配备了一个超级大脑
      3. (2021 NeurIPS) SPANN: Highly-efficient Billion-scale Approximate Nearest Neighbor Search
      4. (2020 SIGIR) ColBERT: Efficient and Effective Passage Search via Contextualized Late Interaction over BERT
      5. facebookresearch/contriever: Contriever: Unsupervised Dense Information Retrieval with Contrastive Learning
      6. (2023 TMLR) Unsupervised Dense Information Retrieval with Contrastive Learning
  • 相关阅读:
    Http常见的请求头和响应头说明
    力扣 095. 最长公共子序列(C语言+动态规划)
    [附源码]Python计算机毕业设计SSM开小灶线下管理系统(程序+LW)
    PostgreSql学习:物理复制与逻辑复制
    敏感数据是什么?包含哪些?如何保障安全?
    chrome浏览器 给windows通知中心 发消息
    液位检测仪在线监测系统解决方案
    Java并发编程的艺术笔记-Executor框架
    微信小程序使用echarts/数据刷新重新渲染/图层遮挡问题
    Jackson,Fastjson详细教程
  • 原文地址:https://blog.csdn.net/PolarisRisingWar/article/details/127102732
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号