近似最近鄰查找的幾種方法

近似最近鄰查找

  • 定義
  • 主要方法
    • 1. 局部敏感哈希(LSH)
    • 2. KD樹(k-d tree)
    • 3. 球樹(Ball Tree)
    • 4. 隨機投影樹(Random Projection Trees)
    • 5. 圖結構方法(Graph-Based Methods)
    • 6. 產品量化(Product Quantization, PQ)
    • 結論

定義

近似最近鄰查找(Approximate Nearest Neighbor Search, ANNS)是一種在高維空間中查找與查詢點距離最近的若干個點的技術。與精確最近鄰查找不同,近似最近鄰查找允許一定程度的誤差,以換取更高的查詢效率和更低的計算成本。

主要方法

近似最近鄰查找的常用方法包括以下幾種:

  1. 局部敏感哈希(Locality-Sensitive Hashing, LSH)
  2. KD樹(k-d tree)
  3. 球樹(Ball Tree)
  4. 隨機投影樹(Random Projection Trees)
  5. 圖結構方法(Graph-Based Methods)
  6. 產品量化(Product Quantization, PQ)

1. 局部敏感哈希(LSH)

方法描述
LSH通過將相似的數據點映射到相同的哈希桶中,從而快速找到近似最近鄰。LSH使用多個哈希函數來降低誤差。

  • 優點
  1. 高效:在高維空間中查詢速度快。
  2. 簡單:實現相對簡單。
  • 缺點
  1. 精度:精度可能不如其他方法高。
  2. 空間復雜度:需要較多的內存來存儲哈希表。

代碼示例

import numpy as np
from sklearn.neighbors import LSHForest# 創建數據集
data = np.random.rand(100, 5)  # 100個點,每個點5維
query = np.random.rand(1, 5)   # 查詢點# 使用LSHForest進行近似最近鄰查找
lshf = LSHForest(n_estimators=10, n_candidates=50)
lshf.fit(data)
distances, indices = lshf.kneighbors(query, n_neighbors=3)print(indices)  # 最近鄰點的索引
print(distances)  # 最近鄰點的距離

2. KD樹(k-d tree)

方法描述
KD樹是一種二叉樹結構,用于組織k維空間中的點。適用于低維空間的精確最近鄰查找,但在高維空間中性能下降。

  • 優點
  1. 精確:提供精確的最近鄰結果。
  2. 適用性:適用于低維空間。
  • 缺點
  1. 高維空間:在高維空間中性能較差。
  2. 構建時間:構建KD樹的時間復雜度較高。
    代碼示例
from sklearn.neighbors import KDTree# 創建數據集
data = np.random.rand(100, 5)  # 100個點,每個點5維
query = np.random.rand(1, 5)   # 查詢點# 使用KDTree進行近似最近鄰查找
tree = KDTree(data)
distances, indices = tree.query(query, k=3)print(indices)  # 最近鄰點的索引
print(distances)  # 最近鄰點的距離

3. 球樹(Ball Tree)

方法描述
球樹是一種分層數據結構,用于組織高維空間中的點。通過遞歸地將數據集劃分為球體,可以高效地進行最近鄰查找。

  • 優點
  1. 高效:在高維空間中查詢速度較快。
  2. 適用性:適用于高維空間。
  • 缺點
  1. 構建時間:構建球樹的時間復雜度較高。
  2. 精度:在極高維空間中精度可能下降。

代碼示例

from sklearn.neighbors import BallTree# 創建數據集
data = np.random.rand(100, 5)  # 100個點,每個點5維
query = np.random.rand(1, 5)   # 查詢點# 使用BallTree進行近似最近鄰查找
tree = BallTree(data)
distances, indices = tree.query(query, k=3)print(indices)  # 最近鄰點的索引
print(distances)  # 最近鄰點的距離

4. 隨機投影樹(Random Projection Trees)

方法描述
隨機投影樹通過隨機選擇投影方向將高維數據投影到低維空間,從而構建樹結構進行近似最近鄰查找。

  • 優點
  1. 高效:在高維空間中查詢速度較快。
  2. 簡單:實現相對簡單。
  • 缺點
  1. 精度:精度可能不如其他方法高。
  2. 隨機性:結果可能受隨機投影方向影響。
    代碼示例
import numpy as np
from sklearn.random_projection import SparseRandomProjection# 創建數據集
data = np.random.rand(100, 5)  # 100個點,每個點5維
query = np.random.rand(1, 5)   # 查詢點# 使用隨機投影降維
transformer = SparseRandomProjection(n_components=3)
data_transformed = transformer.fit_transform(data)
query_transformed = transformer.transform(query)# 使用BallTree進行近似最近鄰查找
tree = BallTree(data_transformed)
distances, indices = tree.query(query_transformed, k=3)print(indices)  # 最近鄰點的索引
print(distances)  # 最近鄰點的距離

5. 圖結構方法(Graph-Based Methods)

方法描述
基于圖的近似最近鄰查找方法通過構建一個圖結構,其中節點表示數據點,邊表示相似度關系。查詢時通過圖的遍歷找到近似最近鄰。

  • 優點
  1. 高效:在高維空間中查詢速度較快。
  2. 擴展性:適用于大規模數據集。
  • 缺點
  1. 構建時間:構建圖的時間復雜度較高。
  2. 實現復雜:實現相對復雜。
    代碼示例
import hnswlib# 創建數據集
data = np.random.rand(100, 5).astype(np.float32)  # 100個點,每個點5維
query = np.random.rand(1, 5).astype(np.float32)   # 查詢點# 使用HNSW進行近似最近鄰查找
dim = data.shape[1]
num_elements = data.shape[0]# Declaring index
p = hnswlib.Index(space='l2', dim=dim)# Initializing index
p.init_index(max_elements=num_elements, ef_construction=100, M=16)# Adding data
p.add_items(data)# Controlling the recall by setting ef
p.set_ef(50)# Querying the elements
labels, distances = p.knn_query(query, k=3)print(labels)  # 最近鄰點的索引
print(distances)  # 最近鄰點的距離

6. 產品量化(Product Quantization, PQ)

方法描述
產品量化通過將數據向量分成多個子向量,對每個子向量進行量化,從而減少存儲和計算成本。

  • 優點
  1. 存儲效率:顯著減少存儲空間。
  2. 查詢效率:在高維空間中查詢速度較快。
  • 缺點
  1. 精度:精度可能不如其他方法高。
  2. 實現復雜:實現相對復雜。

代碼示例

import faiss
import numpy as np# 創建數據集
data = np.random.rand(100, 128).astype(np.float32)  # 100個點,每個點128維
query = np.random.rand(1, 128).astype(np.float32)   # 查詢點# 使用產品量化進行近似最近鄰查找
d = data.shape[1]
nlist = 10  # 聚類中心的數量
m = 8       # 子向量的數量
k = 3       # 需要查找的最近鄰數量quantizer = faiss.IndexFlatL2(d)  # 使用L2距離
index = faiss.IndexIVFPQ(quantizer, d, nlist, m, 8)
index.train(data)
index.add(data)index.nprobe = 5  # 設置查詢時使用的聚類中心的數量
distances, indices = index.search(query, k)print(indices)  # 最近鄰點的索引
print(distances)  # 最近鄰點的距離

結論

近似最近鄰查找在高維空間中查找與查詢點距離最近的點時具有重要意義。常用的方法包括局部敏感哈希(LSH)、KD樹、球樹、隨機投影樹、

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/37344.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/37344.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/37344.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自制全網最便宜的雷達感應燈光畫,成本只需5元

自制全網最便宜的雷達感應燈光畫,成本5元 ? 成本組成:帶熱釋電的人體感應燈(0.5元)雷達感應模塊(3.5元)首飾盒(0.45元)微噴油畫布(1元)5.45元 ? 說一下做燈…

Flutter學習:從搭建環境到運行

一、開發環境的搭建 本文所示內容都是在Windows系統下進行的。 1、下載 Flutter SDK Flutter 官網(https://docs.flutter.cn/release/archive?tabwindows) 或者通過 git clone -b master https://github.com/flutter/flutter.git 下載 2、配置環境…

[數據集][目標檢測]井蓋未蓋好檢測數據集VOC+YOLO格式20123張2類別

數據集格式:Pascal VOC格式YOLO格式(不包含分割路徑的txt文件,僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數):20123 標注數量(xml文件個數):20123 標注數量(txt文件個數):20123 標…

Gamepad API 控制游戲的 JavaScript 指南

在現代網頁游戲中,通過游戲手柄來控制游戲是一種常見的需求。HTML5 提供了一個名為 Gamepad API 的接口,使得從瀏覽器中讀取游戲手柄輸入變得相對簡單。 什么是 Gamepad API? Gamepad API 是 HTML5 的一部分,允許開發者通過 Jav…

.net 奇葩問題調試經歷之2——內存暴漲,來自非托管的內存泄露

??歡迎點贊 :?? 收藏 ?留言 ?? 如有錯誤敬請指正,賜人玫瑰,手留余香!??本文作者:由webmote 原創??作者格言:新的征程,我們面對的不僅僅是技術還有人心,人心不可測,海水不可量,唯有技術,才是深沉黑夜中的一座閃爍的燈塔序言 這是一個序列文章,請看以往文…

AI推介-信息抽取(information extraction,NER)論文速覽(arXiv方向):2023.11.15-2023.12.31

文章目錄~ 1.Large Language Models for Generative Information Extraction: A Survey2.Commonsense for Zero-Shot Natural Language Video Localization3.Unified Lattice Graph Fusion for Chinese Named Entity Recognition4.Solving Label Variation in Scien…

代碼統計工具V1.0.0(支持各種文件類型)

點擊下載《代碼統計工具(支持各種文件類型)》 1. 前言 本文介紹了一款使用C#開發的代碼行數統計軟件。該軟件允許用戶通過選擇文件目錄和設置統計項目類型,來統計指定目錄下的代碼行數。軟件提供了三種統計方式:按文件名統計、按…

線性圖標繪制指南:從基礎到精通

圖標在生活中隨處可見。相比文字來說,圖標可以讓人在更短的時間內認知并了解信息,并且大大提升信息的視覺美觀性,增加設計的藝術感染力。在用戶界面中使用圖標,是一種用戶熟知的設計模式。而線性圖標是通過提煉圖形輪廓&#xff0…

jquery動態插件之gsap和TextPlugin

<!DOCTYPE html> <html> <head><title>數字化人才認證數動畫</title><script src"https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script src"https://cdnjs.cloudflare.com/ajax…

【強化學習】第02期:動態規劃方法

筆者近期上了國科大周曉飛老師《強化學習及其應用》課程&#xff0c;計劃整理一個強化學習系列筆記。筆記中所引用的內容部分出自周老師的課程PPT。筆記中如有不到之處&#xff0c;敬請批評指正。 文章目錄 2.1 動態規劃&#xff1a;策略收斂法/策略迭代法2.2 動態規劃&#xf…

GD32F4時鐘配置

1.前言 硬件&#xff1a;GD32F450 最高時鐘頻率200MHZ(外部晶振8MHZ) 軟件&#xff1a;KEIL(V5.35) 固件包&#xff1a;GD32F4xx_Firmware_Library_V3.2.0 2.時鐘樹 時鐘配置大概流程如下圖紅線指示&#xff0c;GD32F470的最高頻率可以到240MHZ&#xff0c;GD32F450最高…

【frp】cron定時檢查zfrpc.service是否啟動成功

zfrpc 經常自動啟動失敗cron定時檢查zfrpc.service是否啟動成功 ChatGPT 要使用 cron 定期檢查 zfrpc.service 是否啟動成功,并在服務未運行時嘗試啟動它,你可以按照以下步驟進行操作: 創建腳本 首先,你需要創建一個腳本,這個腳本將檢查 zfrpc.service 的狀態,并在服務未…

字符串反轉字符串單詞(1)

大家好&#xff0c;今天我們來探討一道經典的編程問題——翻轉字符串里的單詞。這個問題要求我們編寫一個函數&#xff0c;將輸入字符串中的所有單詞進行翻轉&#xff0c;但單詞內部的字符順序保持不變。 問題分析&#xff1a; 1. 首先&#xff0c;我們需要理解翻轉字符串里的…

Codeforces Round 143 (Div. 2) C. To Add or Not to Add 題解 前綴和 二分

To Add or Not to Add 題目描述 A piece of paper contains an array of n n n integers a 1 , a 2 , . . . , a n a_{1},a_{2},...,a_{n} a1?,a2?,...,an?. Your task is to find a number that occurs the maximum number of times in this array. However, before l…

點云壓縮配置開發環境遇到一些bug

1、配置基于cuda的計算庫&#xff0c;Chamfer3D和pointops 編譯chamfer3D時候會遇到一個cub版本的校驗錯誤。 解決方法&#xff1a;根據錯誤提示&#xff0c;進入cuda的config配置文件中&#xff0c;使用#define將校驗功能關閉 編譯pointops&#xff0c;會遇到報錯&#xff1a;…

C++Primer Plus 第十四章代碼重用:14.4.4 數組模板示例和非類型參數2

14.4.4 數組模板示例和非類型參數 提示&#xff1a;這里可以添加系列文章的所有文章的目錄&#xff0c;目錄需要自己手動添加 例如&#xff1a;第一章 Python 機器學習入門之pandas的使用 提示&#xff1a;寫完文章后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右…

《分析模式》漫談08-單繼承不是“唯一繼承”

DDD領域驅動設計批評文集 做強化自測題獲得“軟件方法建模師”稱號 《軟件方法》各章合集 《分析模式》第2章這一段&#xff1a; 劃線處的single inheritance&#xff0c;2004中譯本的翻譯&#xff1a; 翻譯為“單繼承”&#xff0c;是正確的。 2020中譯本的翻譯&#xff1a…

Java NIO(一) 概述

NIO主要用于以少量線程來管理多個網絡連接&#xff0c;處理其上的讀寫等事件。在大量連接情況下&#xff0c;不管是效率還是空間占用都要優于傳統的BIO。 Java NIO 由以下幾個核心部分組成&#xff1a; Channel Buffer Selector Selector 如果你的應用打開了多個連接&#x…

分頁插件 count有數據,代碼不往下執行

如下:如果打印了sql那么當row>0時會有圖2下面sql詳情的輸出 問題出在了分頁參數上,pageNum為1,并且pageSize>2才能打印出圖二的結果,圖一為pageNum值是0,注意,查詢第一頁,分頁應該傳入的是1而不是0

大數據批處理系統和業務系統是兩種不同類型的系統,它們在目的、設計、功能和使用場景上有所區別

大數據批處理系統和業務系統是兩種不同類型的系統&#xff0c;它們在目的、設計、功能和使用場景上有所區別。以下是大數據批處理系統和業務系統之間的一些主要差異&#xff1a; 1. **目的**&#xff1a; - **大數據批處理系統**&#xff1a;主要用于處理和分析大量數據&am…