第二章 尺度不變特徵轉換
第二節 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 FastParallelizable High Low
資料來源:自製。
另外,由於 K-D Tree 是一種二元樹(binary tree)架構,因此在程 式運算初期必須要先進行建樹,此步驟將會佔用相當多的記憶體空間,
對於 GPU 上昂貴的記憶體空間來說會是相當大的負擔。表 1 將 k-近鄰 搜尋法與 K-D Tree 做簡單的比較,可以作為工具選擇的參考衡量。