挑子學習筆記:BIRCH層次聚類

    轉載請標明出處:http://www.cnblogs.com/tiaozistudy/p/6129425.html html

    本文是「挑子」在學習BIRCH算法過程當中的筆記摘錄,文中不乏一些我的理解,不當之處望多加指正。node

    BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies,利用層次結構的平衡迭代歸約和聚類)是由T. Zhang等人[1]於1996年爲大量聚類設計的一種層次聚類方法。算法

一、聚類特徵(Clustering Feature)

    BIRCH使用聚類特徵歸納描述各簇的信息,其定義以下:數據庫

定義 1:設某簇中有$N$個$D$維的數據點,$\{\vec x_n \} \; (n=1,2,...,N) $,則該簇的聚類特徵$\vec {CF} $定義爲三元組:$ \vec {CF} = \langle N, \vec {\Sigma}_l,  {\Sigma}_s \rangle $,其中$N$爲該簇中數據點的數量,矢量$$\begin{equation} \vec {\Sigma}_l  = \sum_{n=1}^N \vec x _n  = \left(\sum_{n=1}^N x_{n1}, \sum_{n=1}^N x_{n2}, ..., \sum_{n=1}^N x_{nD} \right)^T \end{equation} $$爲各數據點的線性求和,標量$$ \begin{equation} {\Sigma}_s  = \sum_{n=1}^N \vec x _n^2 = \sum_{n=1}^N \vec x _n^T \vec x_n  = \sum_{n=1}^N \sum_{i=1}^D x_{ni}^2 \end{equation} $$爲各數據點的平方和[a]學習

    根據上述定義有以下定理:ui

定理 1(可加性定理)設$\vec {CF}_1 = \langle N_1, \vec {\Sigma}_{l1}, {\Sigma}_{s1} \rangle$和$\vec {CF}_2 = \langle N_2, \vec {\Sigma}_{l2}, {\Sigma}_{s2} \rangle$分別表示兩個不相交的簇的聚類特徵,若是將這兩個簇合併成一個大簇,則大簇的聚類特徵爲$$\begin{equation} \vec {CF}_1 + \vec {CF}_2 = \langle N_1+N_2, \vec {\Sigma}_{l1} + \vec {\Sigma}_{l2}, {\Sigma}_{s1} + {\Sigma}_{s2} \rangle \end{equation}$$spa

例 1[2]假設簇1有三個數據點$(2,5) $、$(3,2) $和$(4,3) $,根據定義 1,簇1的聚類特徵是$$ \begin{split} \vec{CF}_1 & =  \langle 3, (2+3+4, 5+2+3), (2^2+5^2)+(3^2+2^2)+(4^2+3^2) \rangle \\ & =  \langle 3, (9,10), 67 \rangle \end{split}$$若有與簇1不相交的簇2,該簇聚類特徵是$$\vec{CF}_2 = \langle 3, (35, 36), 857 \rangle $$簇1與簇2合併以後造成簇3,簇3的聚類特徵可如式(3)計算:$$ \begin{split} \vec{CF}_3 & = \vec{CF}_1 + \vec{CF}_2 \\ & = \langle 3+3, (9+35, 10 + 36), 67+857 \rangle \\ & = \langle 6, (44, 46), 924 \rangle \end{split} $$設計

    聚類特徵本質上是給定簇的統計彙總,能夠有效地對數據進行壓縮,並且基於聚類特徵能夠很容易地推導出簇的許多統計量和距離度量。假設給定簇中有$N$個$D$維的數據點,$\{\vec x_n : n=1,2,...,N\} $,則在簇的統計量方面能夠推導出形心$ \bar {\vec x} $、半徑$\rho$和直徑$\delta$:$$\begin{equation} \bar {\vec x} = \frac 1N \sum_{n = 1} ^N \vec x_n = \frac {\vec {\Sigma}_l}{N} \end{equation}$$$$ \begin{equation} \rho = \sqrt{\frac{\sum_{n=1}^N (\vec x_n - \bar {\vec x})^2}{N}} = \sqrt{\frac{N \Sigma_s - \vec{\Sigma}_l^2}{N^2}} \end{equation} $$$$ \begin{equation} \delta = \sqrt{\frac{\sum_{m=1}^N \sum_{n=1}^N (\vec x_m - \vec x_n)^2}{N(N-1)}} = \sqrt{\frac{2N {\Sigma}_s - 2 \vec {\Sigma}_l^2}{N(N-1)}} \end{equation} $$其中,$\rho$是簇內數據點到簇形心的平均距離,$\delta$是簇內兩兩數據點的平均距離,這兩個統計量都反映了簇內緊實度。除此以外,基於聚類特徵中的三項還能夠進一步定義出不一樣簇間的距離度量,以反映出簇間鄰近度。假設有兩個簇,簇1由$N_1$個$D$維數據點組成:$\{ \vec x_{1m}: m=1,2,...,N_1 \} $,其聚類特徵爲$\vec{CF}_1 = \langle N_1, \vec {\Sigma}_{l1}, \Sigma_{s1} \rangle $,形心爲$ \bar {\vec x}_1 $、半徑$\rho_1 $和直徑$\delta_1$,簇2由$N_2$個$D$維數據點組成:$\{ \vec x_{2n}: n=1,2,...,N_2 \} $,其聚類特徵爲$\vec{CF}_2 = \langle N_2, \vec {\Sigma}_{l2}, \Sigma_{s2} \rangle $,形心爲$ \bar {\vec x}_2 $、半徑$\rho_2 $和直徑$\delta_2$,簇1和簇2可合併成簇3:$\{ \vec x_{3n}: n=1,2,...,N_1 + N_2 \} $,不失通常性,可設簇3中前$N_1$個爲簇1中數據點,後$N_2$個爲簇2中數據點。在此假設下,可定義下述5個距離以度量簇1和簇2之間的相異性:$$ \begin{equation} d_0 = \sqrt{(\bar{\vec x}_1 - \bar{\vec x}_2)^2} = \sqrt {\left ( \frac{\vec{\Sigma}_{l1}}{N_1} - \frac{\vec{\Sigma}_{l2}}{N_2} \right )^2} \end{equation} $$$$ \begin{equation} d_1 = | \bar{\vec x}_1 - \bar{\vec x}_2 | = \left | \frac{\vec{\Sigma}_{l1}}{N_1} - \frac{\vec{\Sigma}_{l2}}{N_2} \right | \end{equation} $$$$ \begin{equation} d_2 = \sqrt{\frac{\sum_{m=1}^{N_1} \sum_{n=1}^{N_2} (\vec x_{1m} - \vec x_{2n})^2}{N_1 N_2}} = \sqrt{\frac{\Sigma_{s1}}{N_1} - 2\frac{\vec{\Sigma}_{l1}^T}{N_1} \frac{\vec{\Sigma}_{l2}}{N_2} + \frac{\Sigma_{s2}}{N_2}} \end{equation} $$$$ \begin{equation} \begin{split} d_3 & = \sqrt{\frac{\sum_{m=1}^{N_1 + N_2} \sum_{n=1}^{N_1 + N_2} (\vec{x}_{3m} - \vec{x}_{3n})^2}{(N_1 + N_2)(N_1 + N_2 - 1)}} \\ & = \sqrt{\frac{2(N_1 + N_2)(\Sigma_{s1} + \Sigma_{s2}) - 2(\vec{\Sigma}_{l1} + \vec{\Sigma}_{l2})^2}{(N_1 + N_2)(N_1 + N_2 - 1)}} \end{split} \end{equation} $$$$ \begin{equation} \begin{split} d_4  = & \rho_3 - \rho_1 - \rho_2 \\  = & \sqrt{\frac{(N_1 + N_2)(\Sigma_{s1}+\Sigma_{s_2}) - (\vec{\Sigma}_{l1} + \vec{\Sigma}_{l2})^2}{(N_1+N_2)^2}} - \\ & \sqrt{\frac{N_1 \Sigma_{s1} - \vec{\Sigma}_{l1}^2}{N_1^2}} - \sqrt{\frac{N_2 \Sigma_{s2} - \vec{\Sigma}_{l2}^2}{N_2^2}} \end{split} \end{equation} $$式(11)中$\rho_3 $表示簇3的半徑,上述距離中,$d_0 $稱爲形心歐基裏得距離(centroid Euclidian distance),$d_1 $稱爲形心曼哈頓距離(centroid Manhattan distance),$d_2 $稱爲簇連通平均距離(average inter-cluster distance),$d_3 $稱爲全連通平均距離(average intra-cluster distance),$d_4 $稱爲散佈惡化距離(variance increase distance)。3d

二、聚類特徵(CF)樹

    CF樹是等高樹,有三個參數:枝平衡因子$\beta$(branch factor)、葉平衡因子$\lambda$(leaf factor)和空間閾值$\tau$(threshold)。CF樹由根節點(root node)、枝節點(branch node)和葉節點(leaf node)構成(如圖 1所示),非葉節點(nonleaf node)中包含很少於$\beta$個形如$[\vec{CF}_i, child_i] $的元項(entry),其中$\vec{CF}_i $表示該節點上第$i$個子簇的聚類特徵信息,指針$child_i $指向該節點的第$i$個子節點。葉節點中包含很少於$\lambda$個形如$[\vec{CF}_i] $的元項,此外每一個葉節點中都包含指針$prev$指向前一個葉節點和指針$next$指向後一個葉節點。每一個節點都表明一個由各元項中聚類特徵對應子簇(sub-cluster)合併而成的簇。空間閾值$\tau$用於限制葉節點的子簇的大小,即全部葉節點的各元項對應子簇的直徑$\delta$或半徑$\rho$不得大於$\tau$。指針

    在本文中,假設CF樹高爲$H$,$O_{hi} $表示第$h$層的第$i$個節點,其中$O_{1i} $表示第$i$個葉節點,$O_{H1} $表示根節點,$\epsilon_{hi} $表示節點$O_{hi} $中元項的個數,$E_{hij} $表示節點$O_{hi} $中的第$j$個元項,能夠計算出元項$E_{hij} \; (h > 1) $中指針指向的子節點爲$O_{h-1,i'} $,其中$i' = \sum_{k=1}^{i-1} \epsilon_{hk} + j $.

    CF樹上的路徑定義爲根節點到葉節點的節點的序列,因爲上一層元項一一對應地指向下一層節點,也能夠等價地認爲路徑是根節點到葉元項(leaf entry)的序列,所以路徑有以下兩種表示方式:$$\begin{equation} \begin{split} \tilde P & = \langle \tilde p_1, \tilde p_2, ..., \tilde p_{H-1} \rangle \\ & = \langle E_{H1j_H}, E_{H-1,i_{H-1},j_{H-1}}, ..., E_{2i_2j_2} \rangle \\ & = \langle O_{H-1,i_{H-1}}, O_{H-2, i_{H-2}},..., O_{1i_1} \rangle \end{split} \end{equation} $$其中,元項$E_{h,i_h,j_h} $與節點$O_{h-1,i_{h-1}} $一一對應,且有$ i_{h-1} = \sum_{k=1}^{i_h-1} \epsilon_{hk} + j_h $.從路徑的定義易知,每一個葉節點都有惟一的一條路徑與之對應,而且根據各層節點的次序,可區分出路徑的前後,假若有兩條路徑$\tilde P^{(1)} = \langle \tilde p_1^{(1)}, ..., \tilde p_{H-1}^{(1)} \rangle $和$\tilde P^{(2)} = \langle \tilde p_1^{(2)}, ..., \tilde p_{H-1}^{(2)} \rangle $,若是$\tilde p_1^{(1)} = \tilde p_1^{(2)} $, …, $\tilde p_{h-1}^{(1)} = \tilde p_{h-1}^{(2)} $,但$\tilde p_{h}^{(1)} < \tilde p_{h}^{(2)} $ $(0 \le h \le H-1) $,則路徑$\tilde P^{(1)} $在$\tilde P^{(2)} $以前。

例 2:圖 1中所示的CF樹的參數分別爲:$\beta = 2 $、$\lambda = 3 $,共分爲3層,第1層中爲根節點,第2層中有2個枝節點,第3層中共3個葉節點。以圖中節點2爲例,該節點中有2個元項:$[\vec{CF}_3, child_3] $和$[\vec{CF}_4, child_4] $,其中指針$child_3 $指向節點4,$child_4 $指向節點5,所以$\vec{CF}_3 = \vec{CF}_6 + \vec{CF}_7 + \vec{CF}_8 $,即$\vec{CF}_6 $、$\vec{CF}_7 $和$\vec{CF}_8 $分別對應的3個簇合並後便是$\vec{CF}_3 $對應的簇。

圖 1:聚類特徵樹

    圖 1中各節點及其元項表明的簇間的關係如圖 2所示。節點1表明的簇中包含了當前全部數據點,該簇分紅了6個部分:分別是$\vec{CF}_6 $、$\vec{CF}_7 $、$\vec{CF}_8 $、$\vec{CF}_9 $、$\vec{CF}_{10} $和$\vec{CF}_{11} $對應的小簇。CF樹上不一樣層次的節點及其包含數據點的範圍由不一樣顏色表示。須要說明的是,CF樹上不保存任何數據點,僅有樹的結構信息以及相關的聚類特徵信息,所以CF樹能夠達到壓縮數據的效果。

圖 2:聚類特徵樹(圖 1)對應的簇劃分

三、CF樹的生長(Insertion into a CF Tree)

    CF樹的生長由一根空樹開始,是逐個插入一系列簇[b]的聚類特徵到CF樹的過程,方法步驟以下:

    步驟1(初始化):初始化CF樹爲空樹,置樹高度$H=0 $,設置枝平衡因子$\beta $、葉平衡因子$\lambda $和空間閾值$\tau $的值,從半徑$\rho $和直徑$\delta $中選擇一個做爲簇散佈大小的統計量,記爲$\varsigma $,從$d_0 \sim d_4 $中選擇一個做爲簇間距離的度量,記爲$d $;

    步驟2(選擇最優插入路徑):肯定當前須要插入的簇$C $,計算其聚類特徵信息.從根節點開始,逐層計算簇$C $與節點$O_{hi_h} $各元項$E_{hi_hj_h} $ $(j_h=1,...,\epsilon_{hi_h}) $的距離$d(C,E_{hi_hj_h}) $,選出與簇$C $距離最近的元項$E_{hi_hj_h^*} $,並肯定該元項對應的子節點$O_{h-1,i_{h-1}} \; (i_{h-1} = \sum_{k=1}^{i_h-1} \epsilon_{hk} + j_h^*) $,直至葉節點。所以最優的插入路徑爲$$ \begin{equation} \begin{split} \tilde P & = \langle \tilde p_1, \tilde p_2, ..., \tilde p_{H-1} \rangle \\ & = \langle E_{H1j_H^*}, E_{H-1,i_{H-1},j_{H-1}^*}, ..., E_{2i_2j_2^*} \rangle \\ & = \langle O_{H-1,i_{H-1}}, O_{H-2, i_{H-2}},..., O_{1i_1} \rangle \end{split} \end{equation} $$該路徑長度爲$H-1 $,有元項和節點兩種等價的表示方式。

    步驟3(修剪葉子):在簇$C $到達葉節點$O_{1i_1} $後,首先設置參數$h' = 1 $,而後經過距離的計算篩選出與簇$C $最近的元項$E_{1i_1j_1^*} $,並驗證元項$E_{1i_1,j_1^*} $是否有能力吸取簇$C $,即元項$E_{1i_1j_1^*} $對應的簇與簇$C $合併的大簇的散佈大小$\varsigma(E_{1i_1j_1^*} \bigcup C) $是否知足空間閾值$\tau $:

  • 若是$\varsigma(E_{1i_1j_1^*} \bigcup C) \le \tau $,將簇$C $吸取進元項$E_{1i_1j_1^*} $中,並更新該元項的聚類特徵,轉步驟5;
  • 不然,若是$\varsigma(E_{1i_1j_1^*} \bigcup C) > \tau $,須要爲葉節點$O_{1i_1} $新增一個元項:
    • 若是該葉節點$O_{1i_1} $還能多容納元項,即該節點元項的個數$\epsilon_{1i_1} $小於葉平衡因子$\lambda $,置$\epsilon_{1i_1} = \epsilon_{1i_1} + 1 $,爲葉節點$O_{1i_1} $新增一個元項,轉步驟5;
    • 不然,若是$\epsilon_{1i_1} = \lambda $,分裂葉節點$O_{1i_1} $:選出葉節點$O_{1i_1} $中兩個距離最遠的元項,以這兩個元項爲種子,按距離遠近瓜分餘下元項,造成新的葉節點$O_{1i_1} $和$O_{1,i_1 + 1} $,將原葉節點$O_{1i'} \; (i' > i_1) $置爲$O_{1,i'+1} $,並更新兩個新葉節點的聚類特徵信息和$\epsilon_{1i_1} $、$\epsilon_{1,i_1+1} $數值,轉步驟4;

    步驟4(修繕路徑上樹枝):置$h' = h' + 1 $,此階段須要修繕的節點爲路徑$\tilde P $上的節點$O_{h'i_{h'}} $(若是$h'=H $,此時須要修繕的節點爲根節點$O_{h'i_{h'}}=O_{H1} $,不在路徑$\tilde P $上),根據上一個步驟的節點分裂可知,該節點中的元項$E_{h'i_{h'}j_{h'}^*} $被分裂成$E_{h'i_{h'}j_{h'}^*} $和$E_{h',i_{h'},j_{h'}^*+1} $兩個元項,其它元項依次更改下標值,更新元項聚類特徵信息及$\epsilon_{h'i_{h'}} $的數值:

  • 若是$\epsilon_{h'i_{h'}} < \beta $,即節點$O_{h'i_{h'}} $還有容納更多元項的空間,對節點$O_{h'i_{h'}} $進行精修(見下方「修繕路徑上樹枝——樹枝精修」步驟),轉步驟5;
  • 不然若是$\epsilon_{h'i_{h'}} = \beta $,參照分裂葉節點的方法分裂節點$O_{h'i_{h'}} $,造成新的節點$O_{h'i_{h'}} $和$O_{h',i_{h'}+1} $,依次更改同層其它後續節點的下標值,並更新兩個新節點的聚類特徵信息和$\epsilon_{h'i_{h'}} $、$\epsilon_{h',i_{h'}+1} $的數值:
    • 若是$h' < H $,即$O_{h'i_{h'}} $非根節點,轉步驟4;
    • 不然若是$h' = H $,即$O_{h'i_{h'}}=O_{H1} $是根節點,上述分裂獲得的新節點分別爲$O_{H1} $和$O_{H2} $,爲這兩個節點構建父節點$O_{H+1,1} $,該節點有兩個元項$E_{H+1,1,1} $和$E_{H+1,1,2} $分別指向節點$O_{H1} $和$O_{H2} $,更新兩個元項的聚類特徵信息,置$\epsilon_{H+1,1} = 2 $且$H=H+1 $;若是待插入簇構成的集合爲空,結束,輸出CF樹;不然轉步驟2;

    步驟5(更新路徑信息):置$h'= h'+1 $,更新路徑$\tilde P $上元項$E_{h'i_{h'}j_{h'}^*} $的聚類特徵信息;

  • 若是$h' = H $,此時路徑到達根節點:
    • 若是待插入簇構成的集合爲空,結束,輸出CF樹;
    • 不然轉步驟2;
  • 不然若是$h'<H $,轉步驟5。

    考慮到偏斜數據可能對聚類精度或者CF樹節點空間利用率形成影響,在步驟4中增長樹枝精修步驟,以下降偏斜數據的影響,「修繕路徑上樹枝——樹枝精修」步驟以下:

    計算節點$O_{h'i_{h'}} $中兩兩元項之間的距離,找出距離最近的兩個元項$E_{h'i_{h'}j_1} $和$E_{h'i_{h'}j_2} $,假設這兩個元項指向的子節點分別爲$O_{h'-1,i_1} $和$O_{h'-1,i_2} $:

  • 若是最近的兩個元項就是$E_{h'i_{h'}j_{h'}^*} $和$E_{h',i_{h'},j_{h'}^*+1} $,結束該步驟;
  • 不然,合併這兩個子節點爲$O_{h'-1,i_3} $,更新$\epsilon_{h'-1,i_3} $的數值:
    • 若是$\epsilon_{h'-1,i_3} \le \beta $,更新$O_{h'i_{h'}} $中元項信息及其子節點信息,結束該步驟;
    • 不然再度分裂子節點$O_{h'-1,i_3} $:根據距離最遠,肯定兩個元項爲種子,根據距離最近逐個分配餘下元項,目標是分裂出的兩個節點中有一個節點元項個數最少;分配完畢後更新$O_{h'i_{h'}} $中元項信息及其子節點信息,結束該步驟。

例 3:現有簇$C $需插入到圖 1中的CF樹中,假設簇$C $的聚類信息爲$\vec{CF}_{12} $,根據簇$C $的空間位置(見圖 3)易知:$$ d(\vec{CF}_{12}, \vec{CF}_1) < d(\vec{CF}_{12}, \vec{CF}_2) $$$$d(\vec{CF}_{12}, \vec{CF}_4) < d(\vec{CF}_{12}, \vec{CF}_5)$$所以簇$C $插入路徑爲⟨節點2, 節點4⟩。在例 2中已知$\lambda = 3 $,所以須要對分裂葉節點4;分裂後,節點2將包含3個節點,因爲$\beta = 2 $,所以須要進一步分裂節點2(圖 4中節點2.1和2.2);分裂後,節點1中也將出現3個節點,所以須要分裂節點1(圖 4中節點1.1和1.2),然後爲節點1分裂出的2個節點添加父節點,即新的根節點(圖 4中的節點7),CF樹樹高增長。至此簇$C $插入到CF樹的過程結束,新的CF樹如圖 4所示。

圖 3:簇$C $的空間位置示意圖

圖 4:CF樹的插入與修剪

    當全部數據點都插入到CF樹上,即CF樹生長完畢後,全部葉元項對應的子簇,將做爲基礎的最小簇,完成後續的聚類過程。

四、CF樹瘦身(Rebuilding CF tree)

    BIRCH算法對CF樹進行瘦身主要有兩個方面的需求:1)在將數據點插入到CF樹的過程當中(見第3節「CF樹的生長」),用於存儲CF樹節點及其相關信息的內存有限,致使部分數據點生長造成的CF樹佔滿了全部內存,所以須要對CF樹進行瘦身(同時增長空間閾值$\tau $)以將餘下數據點插入到CF樹上;2)CF樹生長完畢後,葉元項對應的子簇過小,影響到後續聚類的速度和質量,須要對CF樹進行瘦身,以增長葉節點子簇的尺寸,減少葉節點子簇的數量。

    CF樹的瘦身是在將原空間閾值$\tau $增長至$\tau' $的基礎上,將原CF樹$\mathcal T $瘦身爲新的CF樹$\mathcal T' $,使得CF樹$\mathcal T' $上的節點個數小於$\mathcal T $的節點個數,同時$\mathcal T' $上葉節點的子簇尺寸上較$\mathcal T $上的更大,數量較$\mathcal T $上的更少。在CF樹的瘦身過程當中,內存將同時保存處理過程當中的舊CF樹$\mathcal T $和新CF樹$\mathcal T' $,逐條按前後次序將舊樹$\mathcal T $上的路徑搬移至新樹$\mathcal T' $上。在每一次的路徑搬移中,須要先在新樹中預留當前路徑的位置$\tilde P'^c $,然後爲舊樹中的當前路徑$\tilde P^c $尋找距離最近的路徑$\tilde P'^* $,並插入其中。在舊樹$\mathcal T $中按照路徑的前後次序選擇當前路徑$\tilde P^c $開始以下步驟:

    一、根據路徑$\tilde P^c $在舊樹$\mathcal T $中位置,對應在新樹$\mathcal T' $中建立相應空節點,以便預留出路徑位置,記這些空節點的路徑爲$\tilde P'^c $;

    二、逐個地將路徑$\tilde P^c $中葉元項插入到新樹$\mathcal T' $中;對於$\tilde P^c $中每一個葉元項$E $,在新樹$\mathcal T' $中從上至下肯定距離最近的元項(此時可肯定距離最近路徑$\tilde P'^* $),在到達$\mathcal T' $的葉節點後,若是該元項$E $可以在新的空間閾值$\tau' $下被某個元項吸取造成更大的簇,或者成爲該葉節點的新元項,同時$\tilde P'^*  $的次序在$\tilde P'^c $以前,則將元項$E $插入到$\tilde P'^*  $的葉節點中,不然將元項$E $插入到路徑$\tilde P'^c $的對應位置;須要明確的是,路徑$\tilde P^c $中葉元項可能有多個,這些元項在新樹$\mathcal T' $上的距離最近路徑$\tilde P'^* $並不必定相同;

    三、在完成路徑$\tilde P^c $中全部葉元項的轉移後,$\tilde P^c $上的節點將所有成爲空節點,此外路徑$\tilde P'^c $上也可能由於沒有插入元項,會保持原來新建的空節點,所以能夠刪除空節點及路徑,以釋放空間;

    四、置舊樹$\mathcal T $中下一條路徑爲當前路徑$\tilde P^c $,重複1~3的步驟,直至舊樹$\mathcal T $徹底消失。

五、BIRCH算法流程

    BIRCH算法的流程分爲如下4個階段:

    一、在內存中構建CF樹;

    二、對第1階段中的CF樹進行瘦身(可選步驟);

    三、以CF樹葉元項對應的子簇爲基礎,實現數據點的聚類;

    四、對第3階段的聚類結果進行精修(可選步驟)。

5.1 構建CF樹

    本小節是BIRCH算法的第一階段,主要任務是在設定內存的限制下,將數據庫中的數據對象(數據點)逐個地插入到CF樹上,當CF樹構建完畢,這棵CF樹將包含了數據庫的全部聚類特徵信息,完成數據壓縮。該階段的具體過程以下:

    一、初始化枝平衡因子$\beta $,葉平衡因子$\lambda $和空間閾值$\tau $;

    二、在數據庫$\mathfrak D $中逐個選取數據點$\vec x_n $,將數據點插入到CF樹$\mathcal T $上:

  • 若是數據庫$\mathfrak D $中沒有未被插入的數據點,對潛在離羣點進行處理,肯定真正的離羣點(離羣點處理方法可參考後文),本階段結束,輸出CF樹;
  • 不然,
    • 若是內存溢出,增長空間閾值$\tau $(空間閾值的設置方法見後文),並對CF樹$\mathcal T $進行瘦身操做,在瘦身以後,將CF樹$\mathcal T $中葉節點的稀疏元項做爲離羣點,從CF樹$\mathcal T $中暫時移至別處(離羣點處理方法可參考後文),完畢後,從數據庫$\mathfrak D $選取下一個數據點,重複本步驟;
    • 不然,從數據庫$\mathfrak D $選取下一個數據點,重複本步驟。

5.2 進一步瘦身CF樹

    首先,此階段並不是必要。該階段的主要任務是:當第1階段中輸出的葉元項對應的簇尺寸偏小,與第3階段中選用的聚類方法不匹配時,須要對第1階段的輸出CF樹進行瘦身,以增長用之後續聚類的簇的尺寸。瘦身方法與第4節中方法無異。

5.3 二度聚類

    該階段的聚類能夠直接使用現有方法,如k-means和凝聚法等,聚類的對象是第1階段或第2階段輸出的CF樹上葉元項對應的全部子簇。

    假設由第1階段或第2階段輸出的子簇共$M$個:$\{ C_m \}_{m=1,...,M} $,這些子簇的聚類特徵都在CF樹的構建中獲得計算,記爲$\{ \vec{CF}_m \}_{m=1,...,M} $,由於聚類特徵十分便於度量簇的散佈度量和簇間的距離,所以可藉助現有方法或者方法思想,基於聚類特徵的計算,對上述$M $個子簇進行二度聚類。如選用的是凝聚法,便是逐步合併上述$M $個子簇中距離最近的2個,直到將全部子簇合併成一個大簇。

5.4 聚類精修

    此階段並不是必要。該階段的實施以第3階段的輸出簇爲對象,方法十分簡單:以第3階段的輸出簇的中心爲種子,以距離最近爲準則,從新將數據庫$\mathfrak D $中的數據點分佈到相應簇中,若有必要可進一步識別和剔除離羣點。

六、空間閾值的更新

    在將數據庫中數據點插入到CF樹的過程當中,通常會給一個較小的空間閾值$\tau $,當內存溢出時,再逐步增長空間閾值$\tau $,對CF樹進行修身,再插入後續數據點。

    假設當前的空間閾值是$\tau_c $,已插入到CF樹上的數據點個數爲$N_c $,當前CF樹的葉元項的個數爲$\epsilon_l $,根節點元項對應簇的平均半徑爲$\bar r_c $.

    首先大體預估下一階段內存溢出以前插入到CF樹上數據點的數量爲$N_{c+1} = \min(2N_c,N) $,其中$N $爲數據庫中數據點的總數。由此可計算下述值:$$ \begin{equation} \dot \tau_{c+1} = \tau_c \cdot \left ( \frac{N_{c+1}}{N_{c}} \right ) ^{\frac{1}{D}} \end{equation} $$

    利用平均半徑$\bar r_c $與數據點數$N_c $的關係,做最小二乘線性迴歸估計出$\bar r_{c+1} $的值,由此定義以下的膨脹因子(expansion factor):$$\begin{equation} \phi = \max(1.0, \frac{\bar r_{c+1}}{\bar r_c}) \end{equation}$$

    找出密度最高的葉節點,尋找方法能夠採用貪婪法:從CF樹按路徑次序逐層找出包含數據點最多的節點,直至葉節點。找到密度最高葉節點後,計算該葉節點中距離最近的兩個元項之間的距離$d_{\min} $.

    空間閾值更新公式以下:$$ \begin{equation} \tau_{c+1} = \max \left \{ d_{\min}, \phi \cdot \dot \tau_{c+1} \right \} \end{equation} $$

七、離羣點處理(Outlier-Handling)

    BIRCH算法預留出必定空間用於潛在離羣點的回收。在每次對當前CF樹進行瘦身以後,須要搜索葉節點中的稀疏子簇,做爲離羣點放入回收空間中。此處的稀疏子簇表示簇內數據點數量遠遠少於全部簇平均數據點數的葉節點子簇。放入回收空間後,須要同步剔除CF樹上的相關路徑及節點。

    當回收空間溢出時,逐個嘗試將潛在離羣點插入到現有CF樹中,若是某個潛在離羣點能夠在不增長CF樹節點數量的條件下被某個葉元項吸取,該潛在離羣點將從回收空間中取出;不然繼續留在回收空間中。

    在數據庫中全部數據點都被實施插入CF樹的操做後,掃描全部潛在離羣點,並嘗試插入到CF樹中,若是仍未能插入CF樹中,能夠肯定爲真正離羣點,得以刪除。

參考文獻

[1] Zhang, T., Ramakrishnan, R., & Livny, M. (1996). BIRCH: an efficient data clustering method for very large databases. Acm Sigmod Record, 25(2), 103-114.

[2] Han, J., Kamber, M., & Pei, J. (2012). 數據挖掘:概念與技術(第3版) (範明 & 孟小峯, Trans.). 北京: 機械工業出版社.



[a] 不失通常性,可設各數據點爲D維列向量,即 。

[b] 一個數據點也能夠看做是一個單點的簇。

相關文章
相關標籤/搜索