• 沒有找到結果。

k-近鄰搜尋法與 k-維樹

第二章 尺度不變特徵轉換

第二節 k-近鄰搜尋法與 k-維樹

K-近鄰搜尋法(k nearest neighbor search algorithm)為一種慣用的機 器學習(machine learning)演算法。機器學習目的是讓機器接收外界輸 入的資料之後,依照某種演算法訓練出一種模型(model)。有了模型,

機器看到新的資料的時候,就能夠有某種程度的經驗與智慧來對新的資 料產生理解。機器學習分為「監督式」與「非監督式」,主要以是否需 要訓練階段而定義,本節中所介紹 k-近鄰演算法則屬於「監督式」的機 器學習法。

通常在進行 k-近鄰演算法時,使用者會給定一個 k 值。顧名思義,

便是去尋找距離查詢點最近的 k 個鄰居,以分類查詢點為例,當機器接 收到一個查詢點(query point)時,機器會依照某些值將查詢資料去與 散布在一空間中的所有參照點(reference points)去做相似度或是距離的 計算。使用者決定一個 k 值之後,機器會尋找出與查詢點最相似或最接 近的 k 個點,並且將這 k 個點做整理,如果這些點中某個類別的佔有比 例較高,則機器會將該查詢點歸類在比例較高的類別當中。以圖 11 為例,

當使用者將 k 值設定為 3 時(如同圖中的實線圓圈取出的範圍),代表 機器將會去尋找距離查詢點(綠色圓圈)最近的三個鄰居。此時機器得 到的三個結果分別為二個紅色三角形與一個藍色正方形,根據近鄰演算 法的定義,機器會將查詢點歸類在紅色三角形的組別中。接著,若使用 者輸入的 k 值改為 5 時(如同圖中的虛線圓圈所取出的範圍),機器將 會找出距離查詢點最近的五個鄰居,於是會得到三個藍色正方形與二個 紅色三角形,並將查詢點歸類到藍色正方形的組別。

圖 11 k-近鄰搜尋法示意圖

資料來源:出自維基百科(2012)。

根據以上提到的演算法步驟,k-近鄰搜尋法最直接的實現方式就是 一對一比對兩份資料所有值的差(亦稱線性搜尋法,linear search

algorithm),所以如果資料一有 M 筆資料、資料二有 N 筆資料時,則必 須要做 M*N 次計算,隨著資料量越來越多,程式的執行效率也會越來 越慢。

在 SIFT 演算法中,Lowe 為了要降低整體程式的運算時間,在進行 特徵點抓取的時候,演算法會根據一些規則省略相當多的特徵點,這樣 儘管可以加快特徵點比對的進行,但是卻會降低圖形比對的精確度。為 了要加速特徵點比對的效率,其採用了基於 K-D Tree 演算法延伸的 Best-Bin-First(BBF)方法作為比對工具。K-D Tree 為一種二元樹,其 節點(node)皆為一個 k 維度,即將上述的 k-近鄰搜尋法中的各個參照

點先整理進一個二元樹中,並將可用的數值存在每一個節點中(Bently, 1975)。如此一來,當查詢點被機器接收到的時候,機器可以快速地利 用二元樹搜尋法得到解答,此演算法在 CPU 上可以比線性搜尋法快速。

雖然程式的運算效率加快,但是卻存在著隱憂,K-D Tree 架構具有稱為

「維樹災難(curse of dimensionality)」的問題,此問題會造成在高維度 的時候造成比對的精確度降低(Bellman, 2003)。

表 1 K-NN 與 K-D Tree 比較表

K-NN K-D Tree

Space complexity O(1) O(n) Time complexity in sequential O(n2) + O(n2logn) O(nlogn) Time complexity in parallelize O(1) + O(nlogn) N/A Exec. Speed on CPUs Slow Fast

Parallelizable High Low

資料來源:自製。

另外,由於 K-D Tree 是一種二元樹(binary tree)架構,因此在程 式運算初期必須要先進行建樹,此步驟將會佔用相當多的記憶體空間,

對於 GPU 上昂貴的記憶體空間來說會是相當大的負擔。表 1 將 k-近鄰 搜尋法與 K-D Tree 做簡單的比較,可以作為工具選擇的參考衡量。

相關文件