最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python利用Faiss庫實現(xiàn)ANN近鄰搜索的方法詳解

 更新時間:2020年08月03日 09:00:02   作者:螞蟻學(xué)Python  
這篇文章主要介紹了Python利用Faiss庫實現(xiàn)ANN近鄰搜索的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

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

  • 輸入user embedding,近鄰搜索item embedding,可以給user推薦感興趣的items
  • 輸入user embedding,近鄰搜搜user embedding,可以給user推薦感興趣的user
  • 輸入item embedding,近鄰搜索item embedding,可以給item推薦相關(guān)的items

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

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

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

  • 讀取訓(xùn)練好的Embedding數(shù)據(jù)
  • 構(gòu)建faiss索引,將待搜索的Embedding添加進去
  • 取得目標(biāo)Embedding,實現(xiàn)搜索得到ID列表
  • 根據(jù)ID獲取電影標(biāo)題,返回結(jié)果

對于已經(jīng)訓(xùn)練好的Embedding怎樣實現(xiàn)高速近鄰搜索是一個工程問題,facebook的faiss庫可以構(gòu)建多種embedding索引實現(xiàn)目標(biāo)embedding的高速近鄰搜索,能夠滿足在線使用的需要

安裝命令:

conda install -c pytorch faiss-cpu 

提前總結(jié)下faiss使用經(jīng)驗:

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

2. embedding數(shù)據(jù)都需要轉(zhuǎn)換成np.float32,包括索引中的embedding以及待搜索的embedding

3. ids需要轉(zhuǎn)換成int64類型

1. 準備數(shù)據(jù)

import pandas as pd
import 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….

構(gòu)建ids

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

構(gòu)建datas

import json
import numpy as np
datas = []
for x in df["features"]:
 datas.append(json.loads(x))
datas = np.array(datas).astype(np.float32)
datas.dtype
dtype('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]
dimension
10

2. 建立索引

import faiss
index = faiss.IndexFlatL2(dimension)
index2 = faiss.IndexIDMap(index)
ids.dtype
dtype('int64')
index2.add_with_ids(datas, ids)
index.ntotal
3706

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_embedding
array([[ 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.dtype
dtype('float32')
topk = 30
D, I = index.search(user_embedding, topk) # actual search
I.shape
(1, 30)
I
array([[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. 根據(jù)電影ID取出電影信息

target_ids = pd.Series(I[0], name="MovieID")
target_ids.head()
0 3380
1 2900
2 1953
3 121
4 3285
Name: MovieID, dtype: int64
df_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

總結(jié)

到此這篇關(guān)于Python利用Faiss庫實現(xiàn)ANN近鄰搜索的文章就介紹到這了,更多相關(guān)Python用Faiss庫ANN近鄰搜索內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實現(xiàn)Tab自動補全和歷史命令管理的方法

    Python實現(xiàn)Tab自動補全和歷史命令管理的方法

    這篇文章主要介紹了Python實現(xiàn)Tab自動補全和歷史命令管理的方法,實例分析了tab自動補全的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • python中停止線程的幾種常用方法

    python中停止線程的幾種常用方法

    這篇文章主要介紹了python中停止線程的幾種常用方法,在Python中停止線程沒有直接方法,但可以通過標(biāo)志變量、守護線程或拋出異常來實現(xiàn),文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-10-10
  • Python中星號的五種用法小結(jié)

    Python中星號的五種用法小結(jié)

    本文主要介紹了Python中星號的五種用法小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • python HTTPX庫實現(xiàn)同步異步請求用法示例

    python HTTPX庫實現(xiàn)同步異步請求用法示例

    這篇文章主要為大家介紹了python HTTPX庫實現(xiàn)同步異步請求用法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • python實現(xiàn)計算器簡易版

    python實現(xiàn)計算器簡易版

    這篇文章主要為大家詳細介紹了python實現(xiàn)計算器簡易版,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 使用python 和 lint 刪除項目無用資源的方法

    使用python 和 lint 刪除項目無用資源的方法

    這篇文章主要介紹了利用 python 和 lint 刪除項目無用資源的方法,使用方法是將 python 目錄下的 delUnused.py 放到項目目錄下,然后直接運行即可,需要的朋友可以參考下
    2017-12-12
  • 實例講解Python中的私有屬性

    實例講解Python中的私有屬性

    這篇文章主要介紹了Python中的私有屬性,本文用代碼實例來幫助理解私有屬性的一些技巧和使用方法,需要的朋友可以參考下
    2014-08-08
  • python list是否包含另一個list所有元素的實例

    python list是否包含另一個list所有元素的實例

    今天小編就為大家分享一篇python list是否包含另一個list所有元素的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 詳解如何在PyCharm控制臺中輸出彩色文字和背景

    詳解如何在PyCharm控制臺中輸出彩色文字和背景

    這篇文章主要介紹了詳解如何在PyCharm控制臺中輸出彩色文字和背景,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 配置python的編程環(huán)境之Anaconda + VSCode的教程

    配置python的編程環(huán)境之Anaconda + VSCode的教程

    這篇文章主要介紹了配置python的編程環(huán)境之Anaconda + VSCode的教程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03

最新評論

阿克苏市| 棋牌| 沙湾县| 左云县| 大兴区| 宝坻区| 临江市| 峨边| 南陵县| 柞水县| SHOW| 文水县| 聂拉木县| 兖州市| 怀远县| 南雄市| 时尚| 南陵县| 方正县| 芜湖市| 西平县| 榆中县| 许昌县| 兴安盟| 甘谷县| 屏东市| 酒泉市| 喀什市| 皮山县| 晴隆县| 江门市| 原平市| 玉门市| 柳州市| 镇沅| 贞丰县| 安图县| 灵石县| 南木林县| 瑞昌市| 勃利县|