faiss的简单使用

这篇具有很好参考价值的文章主要介绍了faiss的简单使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

   Faiss全称(Facebook AI Similarity Search)是Facebook AI团队开源的针对聚类和相似性搜索库,为稠密向量提供高效相似度搜索和聚类,支持十亿级别向量的搜索,是目前较成熟的近似近邻搜索库。
     它包含多种搜索任意大小向量集(备注:向量集大小由RAM内存决定)的算法,以及用于算法评估和参数调整的支持代码。
Faiss用C++编写,并提供与Numpy完美衔接的Python接口。除此以外,对一些核心算法提供了GPU实现。

faiss的安装

pip install faiss-cpu==1.7.3
# pip install faiss-gpu==1.7.2  

上面的是使用cpu的版本,如果使用GPU可以安装下面语句

faiss的创建步骤

  1. 获取向量文件或者向量库。
  2. 创建faiss的索引index,(训练)将向量添加到索引index中。
  3. 使用faiss进行检索。

  代码及目录结构 github

获取向量文件或者向量库

向量文件存储在item_vec.txt中, 格式是(商品ID,向量),具体结构是下图中展示。

faiss github,faiss,机器学习,人工智能

   读取向量文件,返回向量的matrix,由于faiss必须处理np.array的形式,所以进行转换,商品id的一个列表,商品id和序列号的键值对。

import faiss
import os
import sys
import numpy as np

# 从文件中读取向量
"""
fea_v_matrix: np.array形式的特征向量矩阵
fea_s_list: id的顺序列表
key_d: id和位置的对应dict
"""
def load_fea_from_file(fname):
    line_num = 0
    fea_s_list = list()
    fea_v_list = list()
    
    key_d = dict()
    idx = 0
    with open(fname, "r", encoding="utf-8", errors="replace") as f:
        for row_content in f:
            line_num += 1
            
            try:
                raw_content_list = row_content.strip().split()
                fea_s = raw_content_list[0]
                fea_v = np.array(raw_content_list[1:]).astype(np.float32)
            except Exception as e:
                sys.exit("fail to load file vector")
                
            if fea_s not in key_d:
                key_d[fea_s] = idx
                idx += 1
                fea_s_list.append(fea_s)
                fea_v_list.append(fea_v)
    fea_v_matrix = np.array(fea_v_list)
    return fea_v_matrix, fea_s_list, key_d

创建索引

  检索索引使用的方式可以查看文档,此处创建了一个精度索引refine,提高检索的精度。

def build_index_fun(path):
    # path : './item_vec.txt'
    fv_mat, fea_s_list, key_d = load_fea_from_file(path)

    # cluster_num 是聚类的数量
    M = fv_mat.shape[1] // 4
    cluster_num = int(fv_mat.shape[0]) // 14
    # metric_type
    metric_type = faiss.METRIC_INNER_PRODUCT
    # 创建索引
    
    index = faiss.index_factory(fv_mat.shape[1], f"IVF{cluster_num},PQ{M}x4fs", metric_type)

    # 正则化矩阵特征向量
    faiss.normalize_L2(fv_mat)

    # 训练索引
    index.train(fv_mat)

    # 索引添加矩阵向量
    index.add(fv_mat)

    # 创建一个精度索引, 它细化了距离计算,并根据这些距离对结果重新排序
    index_refine = faiss.IndexRefineFlat(index, faiss.swig_ptr(fv_mat))
    return index, index_refine, fea_s_list, key_d

保存索引到文件

  将索引保存到文件中,使用的时候能够快速获取和使用, 键值对能够更快的查找

# 将faiss的索引index写到文件中
def write_index(path):
    # path = './item_vec.txt'
    index, index_refine, keys, key_d = build_index_fun(path)
    faiss.write_index(index, './vec/index_m.faiss')
    faiss.write_index(index_refine, './vec/index_refine_m.faiss')
    # 商品和序列的键值对也写到文件中
    with open('./vec/index_key.faiss', "w") as fout:
        for ky in keys:
            fout.write(ky)
            fout.write("\n")
    return index, index_refine, keys, key_d

write_index('./item_vec.txt')

加载索引和设置查询参数

def load_index(index_dir):
    # 加载索引文件
    index = faiss.read_index('./vec/index_m.faiss')
    index_refine = faiss.read_index('./vec/index_m.faiss')
    # 设置基础索引
    index_refine.base_index = index
    index_refine.k_factor = 10
    index.nprobe = 100
    # 商品位置键值对
    keys = list()
    key_d = dict()
    with open("./vec/index_key.faiss") as fin:
        idx = 0
        for line in fin:
            line = line.strip("\r\n")
            key_d[line] = idx
            idx += 1
            keys.append(line)
    return index, index_refine, keys, key_d

向量检索

  向量检索必须是矩阵的形式传入。文章来源地址https://www.toymoban.com/news/detail-633690.html

# 向量检索
def search():
    # 推荐的结果集(商品ID,得分)
    res_ans = []
    # 检索最近邻的数量
    k = 10
    # 输入一个index库里的向量,进行检索
    index, index_refine, keys, key_d = load_index('./item_vec.txt')
    
    # 获取一个商品的id
    fs = '653417384213'
    i = key_d[fs]
    # 根据位置获取
    index_refine.make_direct_map()
    fv = index_refine.reconstruct(i)
    
    # 检索必须是矩阵的形式
    matrix = np.expand_dims(fv, axis=0)
    D, I = index_refine.search(matrix, k)
    # 获取结果集
    res_id_list, res_dis_list = I[0], D[0]
    for i in range(len(res_id_list)):
        res_ans.append((keys[res_id_list[i]], res_dis_list[i]))
 
        
    print(res_ans)
    
   
# load_fea_from_file('./item_vec.txt')
# build_index_fun('./item_vec.txt')
write_index('./item_vec.txt')
search()

到了这里,关于faiss的简单使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 打造你的专属大模型,学完即可使用上岗!技术人的大模型课程(人工智能/机器学习/深度学习)

    技术人的大模型课 让一部分人在大模型时代,先拥抱AI,为编程专家开启AI新篇章 在2024年,大模型不再是可选技能,而是技术行业的必备。你是否曾在夜深人静时想象,从一名代码专家转型为AI行业的引领者? 如果你的答案是肯定的,那么这门课程正是为你量身定制, 针对

    2024年04月27日
    浏览(49)
  • 人工智能基础_机器学习015_BGD批量梯度下降代码演示_在批量梯度下降中使用逆时衰减---人工智能工作笔记0055

    然后我们用代码来演示一下BGD批量梯度下降,首先启动jupyter notebook 然后我们新建一个文件 新建文件夹,然后新建一个python文件 然后我们这里用一元一次方程进行批量梯度下降. import numpy as np 导入数学计算包 X = np.random.rand(100,1)  `np.random.rand(100, 1)` 是NumPy库中的一个函数,用于

    2024年02月05日
    浏览(65)
  • 精华整理几十个Python数据科学、机器学习、深度学习、神经网络、人工智能方面的核心库以及详细使用实战案例,轻松几行代码训练自己的专有人工智能模型

    精华整理几十个Python数据科学、机器学习、深度学习、神经网络、人工智能方面的核心库以及详细使用实战案例,轻松几行代码训练自己的专有人工智能模型。 机器学习 人工智能的核心,是使计算机具有智能的根本途径。机器学习专注于算法,允许机器学习而不需要编程,

    2024年01月25日
    浏览(80)
  • 机器学习入门教学——人工智能、机器学习、深度学习

    1、人工智能 人工智能相当于人类的代理人,我们现在所接触到的人工智能基本上都是弱AI,主要作用是正确解释从外部获得的数据,并对这些数据加以学习和利用,以便灵活的实现特定目标和任务。 例如: 阿尔法狗、智能汽车 简单来说: 人工智能使机器像人类一样进行感

    2024年02月09日
    浏览(93)
  • 人工智能|机器学习——基于机器学习的舌苔检测

    基于深度学习的舌苔检测毕设留档.zip资源-CSDN文库 目前随着人们生活水平的不断提高,对于中医主张的理念越来越认可,对中医的需求也越来越多。在诊断中,中医通过观察人的舌头的舌质、苔质等舌象特征,了解人体内的体质信息从而对症下药。 传统中医的舌诊主要依赖

    2024年02月22日
    浏览(70)
  • 人工智能与机器人|机器学习

    原文链接: https://mp.weixin.qq.com/s/PB_n8woxdsWPtrmL8BbehA 机器学习下包含神经网络、深度学习等,他们之间的关系表示如图2-7所示。 图2-7 关系图 那么什么是机器学习、深度学习、他们的区别又是什么呢? 2.7.1 什么是机器学习? 机器学习是 人工智能 (AI) 和计算机科学的一个分支,

    2024年02月06日
    浏览(79)
  • 人工智能与机器学习

    欢迎关注博主 Mindtechnist 或加入【Linux C/C++/Python社区】一起探讨和分享Linux C/C++/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 专栏:《机器学习》 ​ ​ ☞什么是人工智能、机器学习、深度学习 人工智能这个概念诞生于1956年的达特茅斯

    2024年02月02日
    浏览(63)
  • 【机器学习】人工智能概述

    🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 目录 1.人工智能概述 1.1 机器学习、人工智能与深度学习 1.2 机器学习、深度学习能做些什么

    2024年02月09日
    浏览(55)
  • 机器学习--人工智能概述

    入门人工智能,了解人工智能是什么。为啥发展起来,用途是什么,是最重要也是最关键的事情。大致有以下思路。 人工智能发展历程 机器学习定义以及应用场景 监督学习,无监督学习 监督学习中的分类、回归特点 知道机器学习的开发流程 人工智能在现实生活中的应用

    2024年01月19日
    浏览(60)
  • 人工智能、机器学习、深度学习的区别

    人工智能涵盖范围最广,它包含了机器学习;而机器学习是人工智能的重要研究内容,它又包含了深度学习。 人工智能是一门以计算机科学为基础,融合了数学、神经学、心理学、控制学等多个科目的交叉学科。 人工智能是一门致力于使计算机能够模拟、模仿人类智能的学

    2024年02月08日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包