1. 程式人生 > >機器學習--聚類分析(劃分方法,層次方法、密度方法)

機器學習--聚類分析(劃分方法,層次方法、密度方法)

本節學習聚類分析,聚類屬於無監督學習,其中聚類的方法有很多種常見的有K-means、層次聚類(Hierarchical clustering)、譜聚類(Spectral Clustering)等,在這裡,上來不會直接介紹這些理論,需要一些基礎知識鋪墊,和前面一樣,一上來就直接介紹聚類演算法,顯得太突兀,會簡單介紹幾種,然後重點介紹如何使用這些演算法。

在知乎看到這個圖,挺好的:

我們也按照這個來講,只是講的時候我會深入某個演算法,把演算法講透:

1定義

聚類是資料探勘中的概念,就是按照某個特定標準(如距離)把一個數據集分割成不同的類或簇,使得同一個簇內的資料物件的相似性儘可能大,同時不在同一個簇中的資料物件的差異性也儘可能地大。也即聚類後同一類的資料儘可能聚集到一起,不同類資料儘量分離。

1.2.聚類與分類的區別

Clustering (聚類),簡單地說就是把相似的東西分到一組,聚類的時候,我們並不關心某一類是什麼,我們需要實現的目標只是把相似的東西聚到一起。因此,一個聚類演算法通常只需要知道如何計算相似度就可以開始工作了,因此 clustering 通常並不需要使用訓練資料進行學習,這在Machine Learning中被稱作unsupervised learning (無監督學習)。

Classification (分類),對於一個classifier,通常需要你告訴它“這個東西被分為某某類”這樣一些例子,理想情況下,一個 classifier 會從它得到的訓練集中進行“學習”,從而具備對未知資料進行分類的能力,這種提供訓練資料的過程通常叫做supervised learning (監督學習)。

1.3.聚類的過程

  • 資料準備:包括特徵標準化和降維;
  • 特徵選擇:從最初的特徵中選擇最有效的特徵,並將其儲存於向量中;
  • 特徵提取:通過對所選擇的特徵進行轉換形成新的突出特徵;
  • 聚類(或分組):首先選擇合適特徵型別的某種距離函式(或構造新的距離函式)進行接近程度的度量,而後執行聚類或分組;
  • 聚類結果評估:是指對聚類結果進行評估,評估主要有3種:外部有效性評估、內部有效性評估和相關性測試評估。

1.4. 衡量聚類演算法優劣的標準

  • 處理大的資料集的能力;
  • 處理任意形狀,包括有間隙的巢狀的資料的能力;
  • 演算法處理的結果與資料輸入的順序是否相關,也就是說演算法是否獨立於資料輸入順序;
  • 處理資料噪聲的能力;
  • 是否需要預先知道聚類個數,是否需要使用者給出領域知識;
  • 演算法處理有很多屬性資料的能力,也就是對資料維數是否敏感。

2.聚類方法的分類

2.1.劃分聚類方法

給定一個n個物件的合集,劃分方法構建資料的k個分割槽,其中每個分割槽代表一個簇,並且k《 n,也就是說把資料劃分為k個組,使的每個組至少包含一個物件。換就話說就是劃分方法在資料集上進行一層劃分,典型的,基本劃分方法採取互斥的簇劃分,即每個物件的必須恰好屬於一組。

大部分劃分方法是基於距離的,採用‘迭代的重定位技術’,例如k-均值和k-中心點演算法

2.1.1 k-均值聚類

     k-均值聚類的方式原理很簡單,他是基於距離的,這個距離就是歐式距離,什麼是歐式距離呢?其實他是我們二維和三維的距離的推廣而已,例如在二維中有兩點(2,3),(4,5)那麼這兩點的歐式距離就是:

                                        E = \sqrt{(2-4)^2 + (3-5)^2}

在三維中的歐式距離為:兩點(x1,y1,z1),(x2,y2,z2),則歐式距離為:

                                        E = \sqrt{(x1-x2)^2+(y1-y2)^2+(z1-z2)^2}

歐式距離定義:

這是維基給的歐式距離的定義,詳情請參考維基百科的歐氏距離

下面我們看看k-均值是如何工作的:

這裡先給出形式化的語言描述,然後給出演算法過程。k-均值是基於形心的技術,基於形心的劃分技術使用簇C_i的形心代表該簇,從概念上講,簇的形心是他的中心點,形心可以用多種定義的方法,例如用分配給該簇的的物件(或點)的均值或中心點定義(其中均值就是k-均值為定義的,而中心就是k-中心定義的)。物件p\epsilon C_i與該簇的代表C_i之差用dist(p,c_i)度量,其中dist(p,c_i)是兩個資料點的歐式距離,簇C_i的質量可以用簇內的變差來度量,他是C_i中所有物件和形心c_i之間的的誤差平方和(距離平方和),定義為:

                                                                E = \sum_{i=1}^{k}\sum_{p\epsilon c_i}dist(p,c_i)^2

其中,E是資料集中的所有物件的的誤差平方和;p是空間的資料點,ci是簇C_i的的形心,此時只要優化E,使E最可能的小,得到的簇將越緊湊。

k-均值的工作過程:

             k-均值把簇的形心定義為簇內點的均值,他的處理流程如下,首先,在資料集D中隨機的選擇K個物件,每個物件代表代表一個簇的初始均值或者中心,對剩下的每個物件,根據與各個簇中心的的歐氏距離,將他分配到最相似的的簇,最相似其實就是距離形心最近的歐式距離了。簇中每加入一個物件就重新計算簇的均值距離,然後把中心更新為該均值。下面給出虛擬碼:

我們來看一下聚類的過程:

k-means的k就是最終聚集的簇數,這個要你事先自己指定。k-means在常見的機器學習演算法中算是相當簡單的,基本過程如下:

  • 首先任取k個樣本點作為k個簇的初始中心;
  • 對每一個樣本點,計算它們與k箇中心的距離,把它歸入距離最小的中心所在的簇;
  • 等到所有的樣本點歸類完畢,重新計算k個簇的中心;
  • 重複以上過程直至樣本點歸入的簇不再變動。

k-means聚類分析的原理雖然簡單,但缺點也比較明顯:

  • 首先聚成幾類這個k值你要自己定,但在對資料一無所知的情況下你自己也不知道k應該定多少;
  • 初始質心也要自己選,而這個初始質心直接決定最終的聚類效果;
  • 每一次迭代都要重新計算各個點與質心的距離,然後排序,時間成本較高。

值得一提的是,計算距離的方式有很多種,不一定非得是笛卡爾距離;計算距離前要歸一化。

2.1.2.k-中心:

k-中和k-均值很像,不同的是形心的更新選擇,k-均值是按照歐式距離的均值進行更新形心的,而k-中心是按照真實的資料點進行更新的,遍歷所有的資料點,找到誤差平方和最小的那個中心點為資料中心點。

2.2. 層次聚類方法

層次聚類,是一種很直觀的演算法。顧名思義就是要一層一層地進行聚類,可以從下而上地把小的cluster合併聚集,也可以從上而下地將大的cluster進行分割。似乎一般用得比較多的是從下而上地聚集,因此這裡我就只介紹這一種。

所謂從下而上地合併cluster,具體而言,就是每次找到距離最短的兩個cluster,然後進行合併成一個大的cluster,直到全部合併為一個cluster。整個過程就是建立一個樹結構,類似於下圖。

那 麼,如何判斷兩個cluster之間的距離呢?一開始每個資料點獨自作為一個類,它們的距離就是這兩個點之間的距離。而對於包含不止一個數據點的 cluster,就可以選擇多種方法了。最常用的,就是average-linkage,即計算兩個cluster各自資料點的兩兩距離的平均值。類似的 還有single-linkage/complete-linkage,選擇兩個cluster中距離最短/最長的一對資料點的距離作為類的距離。個人經 驗complete-linkage基本沒用,single-linkage通過關注局域連線,可以得到一些形狀奇特的cluster,但是因為太過極 端,所以效果也不是太好。

層 次聚類較大的優點,就是它一次性地得到了整個聚類的過程,只要得到了上面那樣的聚類樹,想要分多少個cluster都可以直接根據樹結構來得到結果,改變 cluster數目不需要再次計算資料點的歸屬。層次聚類的缺點是計算量比較大,因為要每次都要計算多個cluster內所有資料點的兩兩距離。另外,由 於層次聚類使用的是貪心演算法,得到的顯然只是局域最優,不一定就是全域性最優,這可以通過加入隨機效應解決,這就是另外的問題了。

下面給出,資料探勘概念與技術的定義:

 

 具體的詳情請參看資料探勘:概念與技術 ,這本書對聚類講的很透徹。此書還介紹了層次聚類的BIRCH(利用層次結構的平衡迭代規約和聚類)、Chameleon(使用動態建模的多階段聚類)、概率層次聚類等

2.3.基於密度的方法

         劃分和層次的方法旨在發現球狀簇,他們很難形成任意形狀的簇,因此無法根據資料的特徵進行聚合,為了發現任意形狀的簇,我們可以把簇看做資料空間中被稀疏區域分開的稠密區,這就是基於密度聚類的方法的主要策略,為了簡單明瞭,我們先根據例子進行講解概念:

首先需要解決的問題就是如何建立一個標準來去發現數據稠密區區域即什麼是根據密度進行聚類?

假設有一個物件o(資料),他的密度可以使用靠近o的資料的數量度量,那麼這個數量是如何怎麼確定,有什麼依據呢?

這裡以DBSCAN(具有噪聲應用的基於密度的空間聚類)為例:

DBSCAN的領域物件的確定是指一個使用者指定的引數\varepsilon >0用來指定每個物件的領域半徑。物件o的\varepsilon領域是以o為中心,以\varepsilon為半徑的空間,空間的大小使用者可以設定,好空間大小確定了,那麼密度上面是通過臨近的資料個數進行確定,但是為多少合適了?這個使用者可以根據實際情況設定,那麼DBSCAN為使用者提供了一個引數MinPts來指定稠密區的密度閾值。那麼也就是說一個物件的\varepsilon的領域至少包含MinPts個物件稱為核心物件,核心物件是稠密區的支柱,下面還有一些名詞,這裡就在例子中介紹,我們根據例子在理解一下:

我們先看看圖左的部分,上面我們定義了一個DBSCAN的兩個引數,假如\varepsilon是上圖圓的半徑,MinPts=3,這也就是隻要園內的資料點數至少為c個,則以這個資料為圓心的資料即為核心物件,例如上圖的m、p就是核心物件,而q就不是核心物件,因為q的領域內沒達到 MinPts=3的要求,因此不是核心物件,這裡的核心物件也是核心資料的意思,我們知道m,p都滿足核心物件,那麼核心物件的資料點稱為該核心物件直接密度可達,例如m,q,而m、p是彼此的密度包含,我們稱m,p為直接密度可達,而p,q稱為間接密度可達,類似的r和s 是密度可達的,而o是從r密度可達的,因此o,r和s都是密度相連的,這就是密度的來源了,我們把使用密度相連的的閉包來發現聯通的稠密區作為簇。

下面給出虛擬碼:

其他的密度聚類方法請參考資料探勘概念與技術。

好,這節就到這裡,這些是純理論,以後遇到聚類專案在貼程式碼。