1. 程式人生 > >模式識別(Pattern Recognition)學習筆記(二十七)-- 基於樹搜尋演算法的快速近鄰法

模式識別(Pattern Recognition)學習筆記(二十七)-- 基於樹搜尋演算法的快速近鄰法

       近鄰法中計算距離需要遍歷,帶來很大的計算量和儲存量,為了改善這兩方面的效能,有人提出採用分枝界定演算法(Branch-Bound  Algorithm)來改進近鄰法,主要分為兩個階段:1)利用人工劃分或K-means聚類演算法或其他動態聚類演算法將樣本集X劃分成層級形式,形成一個樹結構;2)利用樹搜尋演算法找出與未知樣本的最近鄰。

1.層級劃分

       1)將樣本集X劃分成l個子集,每個子集再分成l個子集,不斷這樣劃分下去,形成一個樹狀結構,如圖:


這樣劃分完後,每個節點上都會有一部分樣本;

      2)將節點記作p,並對每個節點計算以下引數:

    p節點上擁有的子集:Xp

    p節點上樣本子集Xp的樣本數:Np

    Xp中所有樣本的樣本均值(可看做是樣本Centroid或圓心):Mp

    Xp中離樣本中心Mp最遠樣本和Mp之間的距離,相當於以Mp為圓心的圓的半徑:

2.判斷某未知樣本x的最近鄰是否在某個節點的子集上

       對於該判斷,有兩個規則:

1)規則一:若滿足:,則不可能是x的最近鄰;

其中,B是Xp中當前搜尋到的樣本到待識樣本x的最近距離,該值在演算法初始時置為

       該規則的解釋是:如果Xp中的某一個樣本xi到圓心Mp的距離比其中到圓心Mp最大的距離(即半徑)與上一次搜尋中找到的最近鄰距離之和還要大很多,說明樣本xi必然是遠離Xp中樣本組成的圓的,所以不可能是x的最近鄰,如圖可示:


2)規則二:若滿足:,則不可能是x的最近鄰;

       這條規則是針對最後一層樹枝節點提出的,如果搜尋演算法進行到了最後一層節點,那麼為了避免把最後一層的所有節點都計算一次距離,就可以利用這一規則來進行剔除;

該規則的解釋意義同規則一類似:如果待識樣本x與圓心Mp的距離大於Xp中某個樣本xi到圓心Mp的距離與當前B的和,表明x離xi所在節點比較遠,xi也不會是x的最近鄰,同樣可以根據上圖來理解。

3.樹搜尋演算法

1)從第一級開始,即L=0,p=0,當前初始最近鄰距離B=0;

2)對當前節點分別計算圓心Mp和半徑rp;

3)對當前節點p的所有直接後繼子節點進行儲存,分別計算其到圓心Mp的距離D(x,Mp);

4)根據規則一,對當前節點的所有直接後繼子節點進行判斷,將所有滿足規則一的節點直接剔除;

5)如果儲存的節點當前為空,則回退到上一層,即L=L-1;如果L=0,就停止,否則跳至4);如果儲存的節點中有多於一個的節點存在,則跳至6);

6)在已儲存的節點中找到最近節點p1,方法是計算D(x,Mp),值最小的就是最近的節點p1,因而將p1節點置為當前節點,並清空已儲存的節點目錄;如果當前節點p1處於的層級是最後一級,就跳至7),否則L=L+1,跳至2);

7)對當前節點p1中的每個樣本xi使用規則二來進行最近鄰的判斷;只要滿足規則二的樣本xi,就可以不用計算D(x,xi),不滿足就計算,並將其與當前得到的最近B進行比較,如果比當前的最近還小,那麼就認為找到了比當前最近還要近的樣本,則更新B:B=D(x,xi),並把這個最近樣本的下標位置儲存下來:NN=i;對所有樣本進行上述判斷後,跳至4);

8)輸出待識未知樣本x的最近鄰,以及距離

4.對於k近鄰的改進

        上面是對最近鄰做了計算上的改進,對於k近鄰,基本上與上面介紹的演算法類似,只需要稍稍做些小改動:

1)首先根據最近鄰得到的最鄰近距離,按照實際情況給出恰當的k個鄰近距離表;

2)首先B的初始值:設為x到k個近鄰中的最遠的那個近鄰之間的距離;

3)在上面步驟7)中,每計算一個距離後,就與鄰近距離表中的k歌距離進行比較,如果這個距離比表中任何一個距離都要小,那麼就果斷剔除掉表中距離最大的而一個,也就是放棄第k個;

5.其它的近鄰法

       除了已經介紹的這幾種近鄰法之外,還有別的,如剪輯近鄰法和壓縮近鄰法。對於剪輯近鄰法,其實就是主要針對那種兩類樣本資料出現重疊而導致不可分的情況,在這種情況下,如果能夠把重疊區域的已知樣本剔除出去,決策時就不會受到那些錯分樣本的干擾,可以讓決策面更接近於最優分類面,用一句話說就是把邊界上的樣本區分開。而對於壓縮近鄰法,其基於的思想是這樣的,儘管剪輯近鄰可以將邊界處容易引起錯分的樣本剔除乾淨,使得分類邊界清晰可見,但是仔細想會發現,那些原理分類邊界的樣本其實對於最後的決策是沒有用處的,只要能夠找出各類樣本中最有利於用來與其他類區分的代表性樣本,就可以把很多幹擾無用樣本去掉,簡化計算,其具體做法也很簡單:將訓練樣本分為兩個子集,儲存集和候選集,先從候選集中取出一個樣本放入儲存集,對於候選集中的每一個樣本,儲存集中的這個樣本都可以將他們正確分類,那麼這些樣本都保留在候選集中,否則把不能正確分類的移到儲存集,以此類推,直到沒有樣本再需要移動。