1. 程式人生 > >python機器學習案例系列教程——聚類演算法總結

python機器學習案例系列教程——聚類演算法總結

全棧工程師開發手冊 (作者:欒鵬)

一、什麼是聚類?

聚類(Clustering):聚類是一個人們日常生活的常見行為,即所謂“物以類聚,人以群分”,核心的思想也就是聚類。人們總是不斷地改進下意識中的聚類模式來學習如何區分各個事物和人。同時,聚類分析已經廣泛的應用在許多應用中,包括模式識別,資料分析,影象處理以及市場研究。通過聚類,人們能意識到密集和稀疏的區域,發現全域性的分佈模式,以及資料屬性之間的有趣的相互關係。簡單來說就是將給定的資料集合劃分為多個類或簇,目標是同一簇中的物件具有較高的相似,不同簇中的物件具有較高的相異性。同時聚類演算法屬於無監督的學習演算法。

二、聚類的應用

聚類方法具有廣泛的應用。典型的如文件的聚類以及一些特定領域的成功應用。但是由於聚類是無監督的學習方法,其所研究的資料沒有類別標籤,我們很難判斷得到的聚類劃分是否反映了事物的本質。

聚類分析也能用於分類Web文件來獲得資訊。作為資料探勘的功能,聚類分析可以作為一個獲得資料分佈情況、觀察每個類的特徵和對特定類進一步分析的獨立工具。通過聚類,能夠識別密集和稀疏的區域,發現全域性的分佈模式,以及資料屬性之間的相互關係等。

三、聚類的評估

一個能產生高質量聚類的演算法必須滿足下面兩個條件:

(1) 類內(intra-class)資料或物件的相似性最強;

(2) 類間(inter-class)資料或物件的相似性最弱。

聚類質量的高低通常取決於聚類演算法所使用的相似性測量的方法和實現方式,同時也取決於該演算法能否發現部分或全部隱藏的模式。

這裡寫圖片描述

簇的凝聚度可以定義為連線簇內心的鄰近度圖中邊的加權和。
兩個簇的分離度可以用從一個簇的點到另一個簇的點的邊的加權和來度量。

根據凝聚度和分離度可以求出聚類的輪廓係數,使用輪廓係數來評估聚類結果。

簇的有效性的監督度量

1、面向分類的,如熵,純度和F度量。

  • a. 熵:每個簇由單個類的物件組成的程度。涉及計算簇i的成員屬於類j的概率Pij=mij/mi
  • b. 純度:簇i的純度是Pi=maxPij,總純度是加權和。
  • c. 精度:簇中一個特定類的物件所佔的比例。簇i關於類j的精度precision(I,j)=Pij
  • d. 召回率:簇包含一個特定類的所有物件的程度。簇i關於類j的召回率是recall(I,j)=mij/mj,其中mj是類j的物件個數。
  • e. F度量:精度和召回率的組合,度量在多大程度上,簇只包含一個特定類的物件和包含該類的所有物件。簇i關於類j的F度量F(i,j)=2precision(i,j)recall(i,j)precision(i,j)+recall(i,j)

2、 面向相似性的,如Jaccard度量。

  • F00=具有不同的類和不同的簇的物件對的個數
  • F01=具有不同的類和相同的簇的物件對的個數
  • F10=具有相同的類和不同的簇的物件對的個數
  • F11=具有相同的類和相同的簇的物件對的個數
  • Rand統計量 = (F00+ F11)/( F00+ F11 +F01+ F10) 對稱
  • Jaccard係數 = F11/(F11 +F01+ F10) 非對稱

層次聚類的簇的有效性:關鍵思想是,評估層次聚類是否對於每個類,至少有一個簇相對較純,並且包含了該類的大部分物件。
可以對每個類,計算簇層次結構中每個簇的F度量,權值基於類的大小。

評估簇的有效性度量的顯著性

  1. 常用方法,是統計學知識判斷是否是隨機的。動機是我們只對反應資料中非隨機結構的簇感興趣。
  2. 簇評估絕對不僅僅是為了得到簇有效性的數值度量,除非有自然的解釋,否則需要以某種方法解釋它。
    關於顯著性:差別是否是統計顯著的(可重複的);差別的量級對於應用是否有意義。(許多人不認為1%的差別是顯著的,儘管它是相容可再生的)

四、常見的聚類演算法

聚類方法主要分為劃分聚類、層次聚類、基於密度的聚類、基於網格的聚類和基於模型的聚類。

1 劃分方法(partitioning method)

劃分方法首先根據給定要構建劃分的數目k建立一個初始劃分,然後採用一種迭代的重定位技術,嘗試通過物件在劃分間移動來改進劃分。一個好的劃分的一般準則是:在同一類中的物件之間儘可能“接近”或相關,而不同類中的物件之間儘可能“遠離”或不同。為了達到全域性最優,基於劃分的聚類會要求窮舉所有可能的劃分。實際上,絕大多數應用採用了以下兩個比較流行的啟發式方法:(a)K-平均(K-MEANS)演算法,在該演算法中,每個簇用該簇中物件的平均值來表示。(b)K-中心點(K-MEDOIDS)演算法,在該演算法中,每個簇用接近聚類中心的一個物件來表示。

K-means演算法

K-means演算法首先隨機選擇k個物件,每個物件代表一個聚類的質心。對於其餘的每一個物件,根據該物件與各聚類質心之間的距離,把它分配到與之最相似的聚類中。然後,計算每個聚類的新質心。重複上述過程,直到準則函式會聚。通常採用的準則函式是平方誤差準則函式。

K-means聚類演算法的具體步驟如下:

1) 從資料集中選擇k個質心C1C2Ck作為初始的聚類中心;

2) 把每個物件分配到與之最相似的聚合。每個聚合用其中所有物件的均值來代表,“最相似”就是指距離最小。對於每個點Vi,找出一個質心Cj,使它們之間的距離d(VjCj)最小,並把Vi分配到第j組;

3) 把所有的點都分配到相應的組之後,重新計算每個組的質心Cj

4) 迴圈執行第2)步和第3)步,直到資料的劃分不再發生變化。

該演算法具有很好的可伸縮性,其計算複雜度為O(nkt),其中,t是迴圈的次數。K-means聚類演算法的不足之處在於它要多次掃描資料庫,此外,它只能找出球形的類,而不能發現任意形狀的類。還有,初始質心的選擇對聚類結果有較大的影響,該演算法對噪聲很敏感。

K-medoids演算法

K-medoids演算法的過程和上述k-means的演算法過程相似,唯一不同之處是:k-medoids演算法用類中最靠近中心的一個物件來代表該聚類,而k-means演算法用質心來代表聚類。在k-means演算法中,對噪聲非常敏感,因為一個極大的值會對質心的計算帶來很大的影響。而k-medoid演算法中,通過用中心來代替質心,可以有效地消除該影響。

K-medoids演算法首先隨機選擇k個物件,每個物件代表一個聚類,把其餘的物件分別分配給最相似的聚類。然後,嘗試把每個中心分別用其他非中心來代替,檢查聚類的質量是否有所提高。若是,則保留該替換。重複上述過程,直到不再發生變化。

常見的k-medoids演算法有PAM(Partitioning Around Medoids)演算法、CLARA(Clustering LARge Application)演算法、CLARANS(Clustering LARge Application based upon Randomized Search)演算法。當存在“噪聲”和孤立點資料時,k-medoids演算法比可k-means更健壯,這是因為中心點不像平均值那麼容易被極端資料影響。但是,k-medoids演算法的執行代價比k-means高。

總之,劃分方法具有線性複雜度,聚類的效率高的優點。然而,由於它要求輸入數字k確定結果簇的個數,並且不適合於發現非凸面形狀的簇,或者大小差別很大的簇,所以這些啟發式聚類方法對在中小規模的資料庫中發現球狀簇很適用。為了對大規模的資料集進行聚類,以及處理複雜形狀的聚類,基於劃分的方法需要進一步的擴充套件。

2 層次方法(hierarchical method)

層次方法對給定資料物件集合進行層次的分解。根據層次的分解如何形成,層次的方法可以分為凝聚的和分裂的[30]。凝聚的方法,也稱為自底向上的方法,一開始將每個物件作為單獨的一個組,然後相繼地合併相近的物件或組,直到所有的組合併為一個(層次的最上層),或者達到一個終止條件。分裂的方法,也稱為自頂向下的方法,一開始將所有的物件置於一個簇中,在迭代的每一步中,一個簇被分裂為更小的簇,直到最終每個物件在單獨的一個簇中,或者達到一個終止條件。

主要的凝聚聚類演算法有CURE,CHAMELEON,BIRCH,ROCK等。

BIRCH演算法

BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies)演算法使用了一種叫做CF-樹(聚類特徵樹,即Clustering Feature Tree)的分層資料結構,來對資料點進行動態、增量式聚類。CF-樹是儲存了層次聚類過程中的聚類特徵資訊的一個加權平衡樹,樹中每個節點代表一個子聚類,並保持有一個聚類特徵向量CF。每個聚類特徵向量是一個三元組,儲存了一個聚類的統計資訊。聚類特徵向量中包含了一個聚類的三個統計資訊:資料點的數目N,這N個數據點的線性和,以及這N個數據點的平方和SS。一個聚類特徵樹是用於儲存聚類特徵CF的平衡樹,它有兩個引數:每個節點的最大子節點數和每個子聚類的最大直徑。當新資料插入時,就動態地構建該樹。與空間索引相似,它也用於把新資料加入到正確的聚類當中。

BIRCH演算法的主要目標是使I/0時間儘可能小,原因在於大型資料集通常不能完全裝入記憶體中。BIRCH演算法通過把聚類分為兩個階段來達到此目的。首先通過構建CF-樹對原資料集進行預聚類,然後在前面預聚類的基礎上進行聚類。

CURE演算法

CURE(Clustering Using Representative)演算法選擇基於質心和基於代表物件方法之間的中間策略。它不用單個質心或物件來代表一個簇,而是選擇資料空間中固定數目的具有代表性的點。針對大型資料庫,CURE採用隨機取樣和劃分兩種方法的組合:一個隨機樣本首先被劃分,每個劃分再被部分聚類。

ROCK演算法

CURE演算法不能處理列舉型資料,而ROCK演算法是在CURE基礎之上適用於列舉資料的聚結分層聚類演算法。通過把兩個聚類的聚集相互連線度(aggregate interconnectivity)與使用者定義的靜態相互連線模型相比較,從而度量兩個聚類之間的相似度。其中,兩個聚類的相互連線度是指兩個聚類之間的交叉連線數目,而連線link(pi,pj)是指這兩點之間的共同鄰居數。換句話說,聚類相似度是用不同聚類中又共同鄰居的點的數目來確定的。

ROCK演算法首先用相似度閥值和共同鄰居的概念,從給定的資料相似度矩陣中構建一個稀疏圖,然後對該稀疏圖使用分層聚類演算法進行聚類。

Chameleon演算法

Chameleon(變色龍)是一個利用動態模型的層次聚類演算法。演算法思想是:首先通過一個圖劃分演算法將資料物件聚類為大量相對較小的子聚類,然後用一個凝聚的層次聚類演算法通過反覆地合併子類來找到真正的結果簇。它既考慮了互連性,又考慮了簇間的近似度,特別是簇內部的特徵,來確定最相似的子簇。

Chameleon跟CURE和DBSCAN相比,在發現高質量的任意形狀的聚類方面有更強的能力。但是,在最壞的情況下,高維資料的處理代價可能對n個物件需要O(n2)的時間。

總的來說,層次的方法的缺陷在於,一旦一個步驟(合併或分裂)完成,它就不能被撤消,該技術的一個主要問題是它不能更正錯誤的決定。有兩種方法可以改進層次聚類的結果:(a)在每層劃分中,仔細分析物件間的“聯接”,例如CURE中的做法。(b)綜合層次凝聚和迭代的重定位方法。首先用自底向上的層次演算法,然後用迭代的重定位來改進結果。

3 基於密度的方法(density-based method)

絕大多數劃分方法基於物件之間的距離進行聚類,這樣的方法只能發現球狀的簇,而在發現任意形狀的簇上遇到了困難。隨之提出了基於密度的另一類聚類方法,其主要思想是:只要鄰近區域的密度(物件或資料點的數目)超過某個閾值,就繼續聚類。也就是說,對給定類中的每個資料點,在一個給定範圍的區域中必須至少包含某個數目的點。這樣的方法可以用來過濾“噪聲”孤立點資料,發現任意形狀的簇。常見的基於密度的聚類演算法有DBSCAN,OPTICS,DENCLUE等。

DBSCAN演算法

DBSCAN(Density-Based Spatial Clustering of Application with Noise)是一個基於高密度連線區域的密度聚類方法。DBSCAN通過檢查資料庫中每個點的ε-鄰域來尋找聚類。如果一個點p的ε-鄰域包含多於MinPts個點,則建立一個以p作為核心物件的新簇。然後,DBSCAN反覆地尋找從這些核心物件直接密度可達的物件,這個過程可能涉及一些