电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python利用Faiss庫實現ANN近鄰搜索的方法詳解

瀏覽:5日期:2022-07-15 13:06:37

Embedding的近鄰搜索是當前圖推薦系統非常重要的一種召回方式,通過item2vec、矩陣分解、雙塔DNN等方式都能夠產出訓練好的user embedding、item embedding,對于embedding的使用非常的靈活:

輸入user embedding,近鄰搜索item embedding,可以給user推薦感興趣的items 輸入user embedding,近鄰搜搜user embedding,可以給user推薦感興趣的user 輸入item embedding,近鄰搜索item embedding,可以給item推薦相關的items

然而有一個工程問題,一旦user embedding、item embedding數據量達到一定的程度,對他們的近鄰搜索將會變得非常慢,如果離線階段提前搜索好在高速緩存比如redis存儲好結果當然沒問題,但是這種方式很不實時,如果能在線階段上線幾十MS的搜索當然效果最好。

Faiss是Facebook AI團隊開源的針對聚類和相似性搜索庫,為稠密向量提供高效相似度搜索和聚類,支持十億級別向量的搜索,是目前最為成熟的近似近鄰搜索庫。

接下來通過jupyter notebook的代碼,給大家演示下使用faiss的簡單流程,內容包括:

讀取訓練好的Embedding數據 構建faiss索引,將待搜索的Embedding添加進去 取得目標Embedding,實現搜索得到ID列表 根據ID獲取電影標題,返回結果

對于已經訓練好的Embedding怎樣實現高速近鄰搜索是一個工程問題,facebook的faiss庫可以構建多種embedding索引實現目標embedding的高速近鄰搜索,能夠滿足在線使用的需要

安裝命令:

conda install -c pytorch faiss-cpu

提前總結下faiss使用經驗:

1. 為了支持自己的ID,可以用faiss.IndexIDMap包裹faiss.IndexFlatL2即可

2. embedding數據都需要轉換成np.float32,包括索引中的embedding以及待搜索的embedding

3. ids需要轉換成int64類型

1. 準備數據

import pandas as pdimport numpy as np

df = pd.read_csv('./datas/movielens_sparkals_item_embedding.csv')df.head()

id features 0 10 [0.25866490602493286, 0.3560594320297241, 0.15… 1 20 [0.12449632585048676, -0.29282501339912415, -0… 2 30 [0.9557555317878723, 0.6764761805534363, 0.114… 3 40 [0.3184879720211029, 0.6365472078323364, 0.596… 4 50 [0.45523127913475037, 0.34402626752853394, -0….

構建ids

ids = df['id'].values.astype(np.int64)type(ids), ids.shape(numpy.ndarray, (3706,))ids.dtypedtype(’int64’)ids_size = ids.shape[0]ids_size3706

構建datas

import jsonimport numpy as npdatas = []for x in df['features']: datas.append(json.loads(x))datas = np.array(datas).astype(np.float32)datas.dtypedtype(’float32’)datas.shape(3706, 10)datas[0]array([ 0.2586649 , 0.35605943, 0.15589039, -0.7067125 , -0.07414215, -0.62500805, -0.0573845 , 0.4533663 , 0.26074877, -0.60799956], dtype=float32)# 維度dimension = datas.shape[1]dimension10

2. 建立索引

import faissindex = faiss.IndexFlatL2(dimension)index2 = faiss.IndexIDMap(index)ids.dtypedtype(’int64’)index2.add_with_ids(datas, ids)index.ntotal3706

4. 搜索近鄰ID列表

df_user = pd.read_csv('./datas/movielens_sparkals_user_embedding.csv')df_user.head()id features

id features 0 10 [0.5974288582801819, 0.17486965656280518, 0.04… 1 20 [1.3099910020828247, 0.5037978291511536, 0.260… 2 30 [-1.1886241436004639, -0.13511677086353302, 0…. 3 40 [1.0809299945831299, 1.0048035383224487, 0.986… 4 50 [0.42388680577278137, 0.5294889807701111, -0.6…

user_embedding = np.array(json.loads(df_user[df_user['id'] == 10]['features'].iloc[0]))user_embedding = np.expand_dims(user_embedding, axis=0).astype(np.float32)user_embeddingarray([[ 0.59742886, 0.17486966, 0.04345559, -1.3193961 , 0.5313592 , -0.6052168 , -0.19088413, 1.5307966 , 0.09310367, -2.7573566 ]], dtype=float32)user_embedding.shape(1, 10)user_embedding.dtypedtype(’float32’)topk = 30D, I = index.search(user_embedding, topk) # actual searchI.shape(1, 30)Iarray([[3380, 2900, 1953, 121, 3285, 999, 617, 747, 2351, 601, 2347, 42, 2383, 538, 1774, 980, 2165, 3049, 2664, 367, 3289, 2866, 2452, 547, 1072, 2055, 3660, 3343, 3390, 3590]])

5. 根據電影ID取出電影信息

target_ids = pd.Series(I[0], name='MovieID')target_ids.head()0 33801 29002 19533 1214 3285Name: MovieID, dtype: int64df_movie = pd.read_csv('./datas/ml-1m/movies.dat', sep='::', header=None, engine='python', names = 'MovieID::Title::Genres'.split('::'))df_movie.head()

MovieID Title Genres 0 1 Toy Story (1995) Animation|Children’s|Comedy 1 2 Jumanji (1995) Adventure|Children’s|Fantasy 2 3 Grumpier Old Men (1995) Comedy|Romance 3 4 Waiting to Exhale (1995) Comedy|Drama 4 5 Father of the Bride Part II (1995) Comedy

df_result = pd.merge(target_ids, df_movie)df_result.head()

MovieID Title Genres 0 3380 Railroaded! (1947) Film-Noir 1 2900 Monkey Shines (1988) Horror|Sci-Fi 2 1953 French Connection, The (1971) Action|Crime|Drama|Thriller 3 121 Boys of St. Vincent, The (1993) Drama 4 3285 Beach, The (2000) Adventure|Drama

總結

到此這篇關于Python利用Faiss庫實現ANN近鄰搜索的文章就介紹到這了,更多相關Python用Faiss庫ANN近鄰搜索內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 风淋室生产厂家报价_传递窗|送风口|臭氧机|FFU-山东盛之源净化设备 | 刹车盘机床-刹车盘生产线-龙口亨嘉智能装备 | 青州开防盗门锁-配汽车芯片钥匙-保险箱钥匙-吉祥修锁店 | 吊篮式|移动式冷热冲击试验箱-二槽冷热冲击试验箱-广东科宝 | 贴片电容代理-三星电容-村田电容-风华电容-国巨电容-深圳市昂洋科技有限公司 | 生物制药洁净车间-GMP车间净化工程-食品净化厂房-杭州波涛净化设备工程有限公司 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 环球周刊网| Jaeaiot捷易科技-英伟达AI显卡模组/GPU整机服务器供应商 | 安平县鑫川金属丝网制品有限公司,防风抑尘网,单峰防风抑尘,不锈钢防风抑尘网,铝板防风抑尘网,镀铝锌防风抑尘网 | 异噻唑啉酮-均三嗪-三丹油-1227-中北杀菌剂厂家 | 创富网-B2B网站|供求信息网|b2b平台|专业电子商务网站 | 作文导航网_作文之家_满分作文_优秀作文_作文大全_作文素材_最新作文分享发布平台 | Safety light curtain|Belt Sway Switches|Pull Rope Switch|ultrasonic flaw detector-Shandong Zhuoxin Machinery Co., Ltd | 安平县鑫川金属丝网制品有限公司,防风抑尘网,单峰防风抑尘,不锈钢防风抑尘网,铝板防风抑尘网,镀铝锌防风抑尘网 | 北京百度网站优化|北京网站建设公司-百谷网络科技 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 杜甫仪器官网|实验室平行反应器|升降水浴锅|台式低温循环泵 | 青州搬家公司电话_青州搬家公司哪家好「鸿喜」青州搬家 | 27PR跨境电商导航 | 专注外贸跨境电商 | 中空玻璃生产线,玻璃加工设备,全自动封胶线,铝条折弯机,双组份打胶机,丁基胶/卧式/立式全自动涂布机,玻璃设备-山东昌盛数控设备有限公司 | 深圳办公室装修-写字楼装修设计-深圳标榜装饰公司 | 高空重型升降平台_高空液压举升平台_高空作业平台_移动式升降机-河南华鹰机械设备有限公司 | 机制砂选粉机_砂石选粉机厂家-盐城市助成粉磨科技有限公司 | 并网柜,汇流箱,电控设备,中高低压开关柜,电气电力成套设备,PLC控制设备订制厂家,江苏昌伟业新能源科技有限公司 | 土壤养分检测仪_肥料养分检测仪_土壤水分检测仪-山东莱恩德仪器 大型多片锯,圆木多片锯,方木多片锯,板材多片锯-祥富机械有限公司 | loft装修,上海嘉定酒店式公寓装修公司—曼城装饰 | Duoguan 夺冠集团| 杭州画室_十大画室_白墙画室_杭州美术培训_国美附中培训_附中考前培训_升学率高的画室_美术中考集训美术高考集训基地 | 氧化铝球_高铝球_氧化铝研磨球-淄博誉洁陶瓷新材料有限公司 | 货车视频监控,油管家,货车油管家-淄博世纪锐行电子科技 | 激光内雕_led玻璃_发光玻璃_内雕玻璃_导光玻璃-石家庄明晨三维科技有限公司 激光内雕-内雕玻璃-发光玻璃 | 铝合金脚手架厂家-专注高空作业平台-深圳腾达安全科技 | 三防漆–水性三防漆–水性浸渍漆–贝塔三防漆厂家 | 低温柔性试验仪-土工布淤堵-沥青车辙试验仪-莱博特(天津)试验机有限公司 | 深圳装修_店面装修设计_餐厅设计_装修全包价格-尚泰装饰设计 | 纯水设备_苏州皙全超纯水设备水处理设备生产厂家 | 大立教育官网-一级建造师培训-二级建造师培训-造价工程师-安全工程师-监理工程师考试培训 | 不锈钢发酵罐_水果酒发酵罐_谷物发酵罐_山东誉诚不锈钢制品有限公司 | 沙盘模型公司_沙盘模型制作公司_建筑模型公司_工业机械模型制作厂家 | 防水套管_柔性防水套管_刚性防水套管-巩义市润达管道设备制造有限公司 |