0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Annoy:用于搜索空間中給定查詢點(diǎn)的近鄰點(diǎn)

科技綠洲 ? 來源:Python實(shí)用寶典 ? 作者:Python實(shí)用寶典 ? 2023-10-17 11:32 ? 次閱讀

Annoy 是由 spotify 開源的一個Python第三方模塊,它能用于搜索空間中給定查詢點(diǎn)的近鄰點(diǎn)。

此外,眾所周知,Python由于GIL的存在,它的多線程最多只能用上一個CPU核的性能。如果你想要做性能優(yōu)化,就必須用上多進(jìn)程。

但是多進(jìn)程存在一個問題,就是所有進(jìn)程的變量都是獨(dú)立的,B進(jìn)程訪問不到A進(jìn)程的變量,因此Annoy為了解決這個問題,增加了一個靜態(tài)索引保存功能,你可以在A進(jìn)程中保存Annoy變量,在B進(jìn)程中通過文件的形式訪問這個變量。

1.準(zhǔn)備

開始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上,如果沒有,可以訪問這篇文章:超詳細(xì)Python安裝指南 進(jìn)行安裝。

**(可選1) **如果你用Python的目的是數(shù)據(jù)分析,可以直接安裝Anaconda:Python數(shù)據(jù)分析與挖掘好幫手—Anaconda,它內(nèi)置了Python和pip.

**(可選2) **此外,推薦大家用VSCode編輯器,它有許多的優(yōu)點(diǎn):Python 編程的最好搭檔—VSCode 詳細(xì)指南。

請選擇以下任一種方式輸入命令安裝依賴

  1. Windows 環(huán)境 打開 Cmd (開始-運(yùn)行-CMD)。
  2. MacOS 環(huán)境 打開 Terminal (command+空格輸入Terminal)。
  3. 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install annoy

2.基本使用

Annoy使用起來非常簡單,學(xué)習(xí)成本極低。比如我們隨意生成1000個0,1之間的高斯分布點(diǎn),將其加入到Annoy的索引,并保存為文件:

# 公眾號:Python 實(shí)用寶典
from annoy import AnnoyIndex
import random

f = 40
t = AnnoyIndex(f, 'angular') # 用于存儲f維度向量
for i in range(1000):
    v = [random.gauss(0, 1) for z in range(f)]
    t.add_item(i, v)

t.build(10) # 10 棵樹,查詢時,樹越多,精度越高。
t.save('test.ann')

這樣,我們就完成了索引的創(chuàng)建及落地。Annoy 支持4種距離計(jì)算方式:
"angular","euclidean","manhattan","hamming",或"dot",即余弦距離、歐幾里得距離、曼哈頓距離、漢明距離及點(diǎn)乘距離。

接下來我們可以新建一個進(jìn)程訪問這個索引:

from annoy import AnnoyIndex

f = 40
u = AnnoyIndex(f, 'angular')
u.load('test.ann')
print(u.get_nns_by_item(1, 5))
# [1, 607, 672, 780, 625]

其中,**u.get_nns_by_item(i, n, search_k=-1, include_distances=False) **返回第 i 個 item 的n個最近鄰的item。在查詢期間,它將檢索多達(dá)search_k(默認(rèn)n_trees * n)個點(diǎn)。

如果設(shè)置include_distances為True,它將返回一個包含兩個列表的元組,第二個列表中包含所有對應(yīng)的距離。

3.算法原理

構(gòu)建索引 :在數(shù)據(jù)集中隨機(jī)選擇兩個點(diǎn),用它們的中垂線來切分整個數(shù)據(jù)集。再隨機(jī)從兩個平面中各選出一個頂點(diǎn),再用中垂線進(jìn)行切分,于是兩個平面變成了四個平面。以此類推形成一顆二叉樹。當(dāng)我們設(shè)定樹的數(shù)量時,這個數(shù)量指的就是這樣隨機(jī)生成的二叉樹的數(shù)量。所以每顆二叉樹都是隨機(jī)切分的。

查詢方法

  1. 將每一顆樹的根節(jié)點(diǎn)插入優(yōu)先隊(duì)列;
  2. 搜索優(yōu)先隊(duì)列中的每一顆二叉樹,每一顆二叉樹都可以得到最多 Top K 的候選集;
  3. 刪除重復(fù)的候選集;
  4. 計(jì)算候選集與查詢點(diǎn)的相似度或者距離;
  5. 返回 Top K 的集合。

4.附錄

下面是Annoy的所有函數(shù)方法:

1.** AnnoyIndex(f, metric) **返回可讀寫的新索引,用于存儲f維度向量。metric 可以是 "angular","euclidean","manhattan","hamming",或"dot"。2. a.add_item(i, v) 用于給索引添加向量v,i 是指第 i 個向量。

3.** a.build(n_trees) ** 用于構(gòu)建 n_trees 的森林。查詢時,樹越多,精度越高。在調(diào)用build后,無法再添加任何向量。

4.** a.save(fn, prefault=False) **將索引保存到磁盤。保存后,不能再添加任何向量。

5.** a.load(fn, prefault=False) ** 從磁盤加載索引。如果prefault設(shè)置為True,它將把整個文件預(yù)讀到內(nèi)存中。默認(rèn)值為False。

6.** a.unload() **釋放索引。

7.** a.get_nns_by_item(i, n, search_k=-1, include_distances=False) **返回第 i 個item的 n 個最近鄰的item。

8.** a.get_nns_by_vector(v, n, search_k=-1, include_distances=False) **與上面的相同,但按向量v查詢。

  1. **a.get_item_vector(i) **返回第i個向量。

10.** a.get_distance(i, j) ** 返回向量i和向量j之間的距離。

11.** a.get_n_items() **返回索引中的向量數(shù)。

12.** a.get_n_trees() **返回索引中的樹的數(shù)量。

13.** a.on_disk_build(fn) **用以在指定文件而不是RAM中建立索引(在添加向量之前執(zhí)行,在建立之后無需保存)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 電腦
    +關(guān)注

    關(guān)注

    15

    文章

    1672

    瀏覽量

    68524
  • 文件
    +關(guān)注

    關(guān)注

    1

    文章

    555

    瀏覽量

    24638
  • 編輯器
    +關(guān)注

    關(guān)注

    1

    文章

    798

    瀏覽量

    31011
收藏 人收藏

    評論

    相關(guān)推薦

    怎么測量空間中點(diǎn)的電磁功率(功率密度)?

    怎么測量天線輻射下空間中點(diǎn)的電磁功率(功率密度)?
    發(fā)表于 10-16 16:32

    核仿射子空間最近點(diǎn)分類算法

    受支持向量機(jī)的幾何解釋和最近點(diǎn)問題啟發(fā),提出一種新型的模式分類算法——核仿射子空間最近點(diǎn)分類算法。該算法在核空間中,將支持向量機(jī)幾何模型中的最近點(diǎn)
    發(fā)表于 04-16 11:38 ?11次下載

    基于Hilbert曲線的近似k-最近鄰查詢算法

    在低維空間中R樹的查詢效率較高,而在高維空間中其性能急劇惡化,降維成為解決問題的關(guān)鍵。利用Hilbert曲線的降維特性,該文提出基于Hilbert曲線近似k-最近鄰
    發(fā)表于 04-20 08:53 ?18次下載

    Banach空間中非擴(kuò)張非自映象不動點(diǎn)的粘滯迭代逼近

    Banach空間中非擴(kuò)張非自映象不動點(diǎn)的粘滯迭代逼近:在具有弱序列連續(xù)對偶映象的自反Banach 空間中利用太陽非擴(kuò)張收縮映象研究了非擴(kuò)張非自映象不動點(diǎn)的粘滯迭代逼近. 證明了此映
    發(fā)表于 10-25 12:16 ?10次下載

    基于KL散度和近鄰點(diǎn)間距離的球面嵌入算法

    適合原始數(shù)據(jù)分布的球面半徑。該算法從一個隨機(jī)產(chǎn)生的球面分布開始,利用KL散度衡量每對近鄰點(diǎn)間的歸一化距離在原始空間和球面空間中的差異,并基于此差異構(gòu)建出目標(biāo)函數(shù),然后再用帶有動量的隨機(jī)
    發(fā)表于 12-05 11:55 ?0次下載

    激光散亂點(diǎn)云K最近鄰搜索算法

    針對激光散亂點(diǎn)云的數(shù)據(jù)量大,且具有面型的特點(diǎn),為降低存儲器使用量,提高散亂點(diǎn)云的處理效率,提出了一種散亂點(diǎn)云K最近鄰(KNN)搜索算法。首先
    發(fā)表于 12-11 14:09 ?1次下載

    路網(wǎng)環(huán)境下的最近鄰查詢技術(shù)

    近鄰查詢作為基于位置服務(wù)的重要支持性技術(shù)之一,引起了眾多學(xué)者的廣泛關(guān)注和深入研究,相對于歐式空間而言,路網(wǎng)環(huán)境下的最近鄰查詢更貼近人們的生
    發(fā)表于 12-18 14:14 ?0次下載
    路網(wǎng)環(huán)境下的最<b class='flag-5'>近鄰</b><b class='flag-5'>查詢</b>技術(shù)

    近鄰的隨機(jī)非線性降維

    針對線性降維技術(shù)應(yīng)用于具有非線性結(jié)構(gòu)的數(shù)據(jù)時無法得到令人滿意的結(jié)果的問題,提出一種新的著重于保持高維空間局部最近鄰信息的非線性隨機(jī)降維算法( NNSE)。該算法首先在高維空間中通過計(jì)算
    發(fā)表于 12-23 11:45 ?0次下載

    高維空間逼近最近鄰評測

    近鄰方法是機(jī)器學(xué)習(xí)中一個非常流行的方法,它的原理很容易理解:鄰近的數(shù)據(jù)點(diǎn)是相似的數(shù)據(jù)點(diǎn),更可能屬于同一分類。然而,在高維空間中快速地應(yīng)用最近鄰方法,卻是非常有挑戰(zhàn)性的工作。
    的頭像 發(fā)表于 05-29 08:33 ?4820次閱讀
    高維<b class='flag-5'>空間</b>逼近最<b class='flag-5'>近鄰</b>評測

    如何在障礙空間中基于并行蟻群算法進(jìn)行k近鄰查詢

    為解決障礙空間中的后近鄰查詢問題,提出一種基于改進(jìn)的并行蟻群算法的五近鄰查詢方法( PAQ)。首先,利用不同信息素種類的蟻群實(shí)現(xiàn)并行
    發(fā)表于 03-27 13:39 ?12次下載
    如何在障礙<b class='flag-5'>空間中</b>基于并行蟻群算法進(jìn)行k<b class='flag-5'>近鄰</b><b class='flag-5'>查詢</b>

    一種采用點(diǎn)空間投影的RGB-D點(diǎn)云分割技術(shù)

    攝像機(jī)數(shù)學(xué)模型采用小孔成像的原理,在笛卡兒空間中建立景物點(diǎn)與成像點(diǎn)之間的映射關(guān)系。令點(diǎn)P=(Xw,Yw,Zw)為像素p(u,v)投射在世界坐標(biāo)系中的
    的頭像 發(fā)表于 06-18 11:30 ?2647次閱讀
    一種采用<b class='flag-5'>點(diǎn)</b>云<b class='flag-5'>空間</b>投影的RGB-D<b class='flag-5'>點(diǎn)</b>云分割技術(shù)

    基于嵌入向量的全新設(shè)備端搜索

    搜索庫通過使用模型,將搜索查詢嵌入到表示查詢語義的高維向量中來執(zhí)行搜索。隨后搜索庫使用 Sca
    的頭像 發(fā)表于 06-02 11:30 ?1964次閱讀

    Annoy求近似最近鄰的庫

    ./oschina_soft/annoy.zip
    發(fā)表于 06-21 14:14 ?1次下載
    <b class='flag-5'>Annoy</b>求近似最<b class='flag-5'>近鄰</b>的庫

    介紹當(dāng)前比較常見的幾種近鄰搜索算法

    隨著深度學(xué)習(xí)的發(fā)展和普及,很多非結(jié)構(gòu)數(shù)據(jù)被表示為高維向量,并通過近鄰搜索來查找,實(shí)現(xiàn)了多種場景的檢索需求,如人臉識別、圖片搜索、商品的推薦搜索等。
    的頭像 發(fā)表于 09-29 17:11 ?2446次閱讀

    激光雷達(dá)SLAM中高效的點(diǎn)云數(shù)據(jù)結(jié)構(gòu)

    k-d樹是一種常用的多維數(shù)據(jù)結(jié)構(gòu),它可以用于范圍搜索、最近鄰搜索等問題。但是,在實(shí)際應(yīng)用中,我們經(jīng)常需要對動態(tài)數(shù)據(jù)進(jìn)行查詢和修改操作。
    的頭像 發(fā)表于 05-09 09:07 ?895次閱讀
    激光雷達(dá)SLAM中高效的<b class='flag-5'>點(diǎn)</b>云數(shù)據(jù)結(jié)構(gòu)