精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Annoy:用于搜索空間中給定查詢點的近鄰點

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

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

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

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

1.準備

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

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

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

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

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

2.基本使用

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

# 公眾號:Python 實用寶典
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')

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

接下來我們可以新建一個進程訪問這個索引:

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。在查詢期間,它將檢索多達search_k(默認n_trees * n)個點。

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

3.算法原理

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

查詢方法

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

4.附錄

下面是Annoy的所有函數方法:

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) ** 用于構建 n_trees 的森林。查詢時,樹越多,精度越高。在調用build后,無法再添加任何向量。

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

5.** a.load(fn, prefault=False) ** 從磁盤加載索引。如果prefault設置為True,它將把整個文件預讀到內存中。默認值為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() **返回索引中的向量數。

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

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 電腦
    +關注

    關注

    15

    文章

    1681

    瀏覽量

    68695
  • 文件
    +關注

    關注

    1

    文章

    561

    瀏覽量

    24703
  • 編輯器
    +關注

    關注

    1

    文章

    803

    瀏覽量

    31129
收藏 人收藏

    評論

    相關推薦

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

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

    核仿射子空間最近分類算法

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

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

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

    Banach空間中非擴張非自映象不動的粘滯迭代逼近

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

    利用離散邊界判斷的反向最遠鄰查詢算法

    目前大部分的反向最遠鄰查詢方法對查詢是否存在反向最遠鄰的情況不進行判斷,當查詢不存在反向最遠鄰的結果集時,也進行全部的操作,增加了
    發表于 11-27 11:03 ?0次下載
    利用離散邊界<b class='flag-5'>點</b>判斷的反向最遠鄰<b class='flag-5'>查詢</b>算法

    基于KL散度和近鄰間距離的球面嵌入算法

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

    激光散亂云K最近鄰搜索算法

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

    路網環境下的最近鄰查詢技術

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

    近鄰的隨機非線性降維

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

    高維空間逼近最近鄰評測

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

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

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

    一種采用空間投影的RGB-D云分割技術

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

    基于嵌入向量的全新設備端搜索

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

    Annoy求近似最近鄰的庫

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

    介紹當前比較常見的幾種近鄰搜索算法

    隨著深度學習的發展和普及,很多非結構數據被表示為高維向量,并通過近鄰搜索來查找,實現了多種場景的檢索需求,如人臉識別、圖片搜索、商品的推薦搜索等。
    的頭像 發表于 09-29 17:11 ?2495次閱讀