標籤:二值特徵 特徵匹配 flann 隨機樹
高維資料的快速最近鄰演算法FLANN
1. 簡介
在電腦視覺和機器學習中,對於一個高維特徵,找到訓練資料中的最近鄰計算代價是昂貴的。對於高維特徵,目前來說最有效方法是 the randomized k-d forest和the priority search k-means tree,而對於二值特徵的匹配 multiple hierarchical clusteringtrees則比LSH方法更加有效。
目前來說,fast library for approximate nearest neighbors (FLANN)庫可以較好地解決這些問題。
2. 快速近似NN匹配(FAST APPROXIMATE NN MATCHING)
2.1 隨機k-d樹演算法(The Randomized k-d TreeAlgorithm)
a. Classick-d tree
找出資料集中方差最高的維度,利用這個維度數值將資料劃分為兩個部分,對每個子集重複相同的過程。
參考http://www.cnblogs.com/eyeszjwang/articles/2429382.html。
b. Randomizedk-d tree
建立多棵隨機k-d樹,從具有最高方差的N_d維中隨機選取若干維度,用來做劃分。在對隨機k-d森林進行搜尋時候,所有的隨機k-d樹將共用一個優先隊列。
增加樹的數量能加快搜尋速度,但由於記憶體負載的問題,樹的數量只能控制在一定範圍內,比如20,如果超過一定範圍,那麼搜尋速度不會增加甚至會減慢。
2.2 優先搜尋k-means樹演算法(The Priority Search K-MeansTree Algorithm)
隨機k-d森林在許多情形下都很有效,但是對於需要高精度的情形,優先搜尋k-means樹更加有效。 K-means tree 利用了資料固有的結構資訊,它根據資料的所有維度進行聚類,而隨機k-d tree一次只利用了一個維度進行劃分。
2.2.1 演算法描述
演算法1 建立優先搜尋k-means tree:
(1) 建立一個層次化的k-means 樹;
(2) 每個層次的聚類中心,作為樹的節點;
(3) 當某個cluster內的點數量小於K時,那麼這些資料節點將做為葉子節點。
演算法2 在優先搜尋k-means tree中進行搜尋:
(1) 從根節點N開始檢索;
(2) 如果是N葉子節點則將同層次的葉子節點都加入到搜尋結果中,count += |N|;
(3) 如果N不是葉子節點,則將它的子節點與query Q比較,找出最近的那個節點Cq,同層次的其他節點加入到優先隊列中;
(4) 對Cq節點進行遞迴搜尋;
(5) 如果優先隊列不為空白且 count<L,那麼從取優先隊列的第一個元素賦值給N,然後重複步驟(1)。
聚類的個數K,也稱為branching factor 是個非常主要的參數。
建樹的時間複雜度 = O( ndKI ( log(n)/log(K) )) n為資料點的總個數,I為K-means的迭代次數。搜尋的時間複雜度 = O( L/K * Kd * ( log(n)/(log(K) ) ) = O(Ld ( log(n)/(log(K) ) )。
2.3 層次聚類樹 (The Hierarchical ClusteringTree)
層次聚類樹採用k-medoids的聚類方法,而不是k-means。即它的聚類中心總是輸入資料的某個點,但是在本演算法中,並沒有像k-medoids聚類演算法那樣去最小化方差求聚類中心,而是直接從輸入資料中隨機選取聚類中心點,這樣的方法在建立樹時更加簡單有效,同時又保持多棵樹之間的獨立性。
同時建立多棵樹,在搜尋階段並行地搜尋它們能大大提高搜尋效能(歸功於隨機地選擇聚類中心,而不需要多次迭代去獲得更好的聚類中心)。建立多棵隨機樹的方法對k-d tree也十分有效,但對於k-means tree卻不適用。
3. 參考文獻
(1) ScalableNearest Neighbor Algorithms for High Dimensional Data. Marius Muja, Member,IEEE and David G. Lowe, Member, IEEE.
(2) OptimisedKD-trees for fast image descriptor matching. Chanop Silpa-Anan, Richard Hartley.
(3) FastMatching of Binary Features. Marius Muja and David G. Lowe.