何為聚類
“聚類是把相似的對象通過靜態分類的方法分成不同的組別或者更多的子集(subset),這樣讓在同一個子集中的成員對象都有相似的一些屬性。” ——wikipedia
“聚類分析指將物理或抽象對象的集合分組成為由類似的對象組成的多個類的分析過程。它是一種重要的人類行為。聚類是將數據分類到不同的類或者簇這樣的一個過程,所以同一個簇中的對象有很大的相似性,而不同簇間的對象有很大的相異性。” —百度百科
簡單理解,如果一個數據集合包含N個實例,根據某種准則可以將這N個實例划分為m個類別,每個類別中的實例都是相關的,而不同類別之間是區別的也就是不相關的,這個過程就叫聚類了。
聚類過程
- 特征選擇(feature selection):就像其他分類任務一樣,特征往往是一切活動的基礎,如何選取特征來盡可能的表達需要分類的信息是一個重要問題。表達性強的特征將很影響聚類效果。這點在以后的實驗中我會展示。
- 近鄰測度(proximity measure):當選定了實例向量的特征表達后,如何判斷兩個實例向量相似呢?這個問題是非常關鍵的一個問題,在聚類過程中也有着決定性的意義,因為聚類本質在區分相似與不相似,而近鄰測度就是對這種相似性的一種定義。
- 聚類准則(clustering criterion):定義了相似性還不夠,結合近鄰測度,如何判斷相似才是關鍵。直觀理解聚類准則這個概念就是何時聚類,何時不聚類的聚類條件。當我們使用聚類算法進行計算時,如何聚類是算法關心的,而聚與否需要一個標准,聚類准則就是這個標准。(話說標准這東西一拿出來,夠嚇人了吧^_^)
- 聚類算法(clustering algorithm):這個東西不用細說了吧,整個學習的重中之重,核心的東西這里不講,以后會細說,簡單開個頭——利用近鄰測度和聚類准則開始聚類的過程。
- 結果驗證(validation of the results):其實對於PR的作者提出這個過程也放到聚類任務流程中,我覺得有點冗余,因為對於驗證算法的正確性這事應該放到算法層面吧,可以把4)和5)結合至一層。因為算法正確和有窮的驗證本身就是算法的特性嘛。(誰設計了一個算法不得證明啊)
- (interpretation of the results):中文版的PR上翻譯為結果判定,而我感覺字面意思就是結果解釋。(聚類最終會將數據集分成若干個類,做事前要有原則,做事后要有解釋,這個就是解釋了。自圓其說可能是比較好的了^_^)
聚類准則
聚類准則就是一個分類標准,對於示例中這樣一個數據集合,如何聚類呢。當然聚類的可能情況有很多。比如,如果我們按照年級是否為大於1來分類,那么數據集X分為兩類:{張三},{李四,張飛,趙雲};如果按照班級不同來分,分為兩類:{張三,李四},{張飛,趙雲};如果按照成績是否及格來分(假設及格為60分),分兩類:{張三,李四,趙雲},{張飛}。當然聚類准則的設計往往是復雜的,就看你想怎么划分了。按照對分類思想的幾何理解,數據集相當於樣本空間,數據實例的特征數(本例共有4個特征[姓名,年級,班級,數學成績])相當於空間維度,而實例向量對應到空間中的一個點。那么聚類准則就應該是那些神奇的超平面(對應有數學函數表達式,我個人認為這些函數就等同於聚類准則),這些超平面將數據“完美的”分離開了。
聚類特征類型
聚類時用到的特征如何區分呢,有什么類型要求?聚類的特征按照域划分,可以分為連續的特征和離散特征。其中連續特征對應的定義域是數據空間R的連續子空間,而離散特征對應的是離散子集,另外如果離散特征只包含兩個特征值,那么這個離散特征又叫二值特征。 根據特征取值的相對意義又可以將特征分為以下四種:標量的(Nominal),順序的(Ordinal),區間尺度的(Interval-scaled)以及比率尺度的(Ratio-scaled)。其中,標量特征用於編碼一類特征的可能狀態,比如人的性別,編碼為男和女;天氣狀況編碼為陰、晴和雨等。順序特征同標量特征類似,同樣是一系列狀態的編碼,只是對這些編碼稍加約束,即編碼順序是有意義的,比如對一道菜,它的特征有{很難吃,難吃,一般,好吃,美味}幾個值來定義狀態,但是這些狀態是有順序意義的。這類特征我認為就是標量特征的一個特定子集,或者是一個加約束的標量特征。區間尺度特征表示該特征數值之間的區間有意義而數值的比率無意義,經典例子就是溫度,A地的溫度(20℃)比B地(15℃)高5度,這里的區間差值是有意義的,但你不能說A地比B地熱1/3,這是無意義的。比率特征與此相反,其比率是有意義的,經典例子是重量,C重100g,D重50g,那么C比D重2倍,這是有意義的。(當然說C比D重50g也是可以的,因此可以認為區間尺度是比率尺度的一個真子集)。
在常見應用中,包括我們平日關心的編程實現中,一般只定義nominal特征和numeric特征,其中nominal可以用string來表示,而numeric可以用number來表示。
聚類算法的分類
- 划分方法:就是根據用戶輸入值k把給定對象分成k組(滿足2個條件:1. 每個組至少包含一個對象。2. 每個對象必須且只屬於一個組),每組都是一個聚類,然后利用循環再定位技術變換聚類里面的對象,直到客觀划分標准(常成為相似函數,如距離)最優為止。典型代表:k-means, k-medoids
- 層次的方法:對給定的對象集合進行層次分解。分為2類:凝聚的和分裂的。凝聚的方法也叫自底向上的方法,即一開始將每個對象作為一個單獨的簇,然后根據一定標准進行合並,直到所有對象合並為一個簇或達到終止條件為止。分裂的方法也叫自頂向下的方法,即一開始將所有對象放到一個簇中,然后進行分裂,直到所有對象都成為單獨的一個簇或達到終止條件為止。典型代表:CURE,BIRCH
- 基於密度的方法:即不斷增長所獲得的聚類直到鄰近(對象)密度超過一定的閥值(如一個聚類中的對象數或一個給定半徑內必須包含至少的對象數)為止。典型代表:DBSCAN,OPTICS。
- 基於網格的方法:即將對象空間划分為有限數目的單元以形成網格結構。所有聚類操作都在這一網格結構上進行。典型代表:STING。
- 基於模型的方法:即為每個聚類假設一個模型,然后按照模型去發現符合的對像。這樣的方法經常基於這樣的假設:數據是根據潛在的概率分布生成的。主要有2類:統計學方法和神經網絡方法。典型代表:COBWEB,SOMs
何為k-means
K-means算法是很典型的基於距離的聚類算法,采用距離作為相似性的評價指標,即認為兩個對象的距離越近,其相似度就越大。該算法認為簇是由距離靠近的對象組成的,因此把得到緊湊且獨立的簇作為最終目標。
k個初始類聚類中心點的選取對聚類結果具有較大的影響,因為在該算法第一步中是隨機的選取任意k個對象作為初始聚類的中心,初始地代表一個簇。該算法在每次迭代中對數據集中剩余的每個對象,根據其與各個簇中心的距離將每個對象重新賦給最近的簇。當考察完所有數據對象后,一次迭代運算完成,新的聚類中心被計算出來。如果在一次迭代前后,J的值沒有發生變化,說明算法已經收斂。
算法過程
- 1)從N個文檔隨機選取K個文檔作為質心
- 2)對剩余的每個文檔測量其到每個質心的距離,並把它歸到最近的質心的類
- 3)重新計算已經得到的各個類的質心
- 4)迭代2~3步直至新的質心與原質心相等或小於指定閥值,算法結束
說明如下:首先從n個數據對象任意選擇 k 個對象作為初始聚類中心;而對於所剩下其它對象,則根據它們與這些聚類中心的相似度(距離),分別將它們分配給與其最相似的(聚類中心所代表的)聚類;然 后再計算每個所獲新聚類的聚類中心(該聚類中所有對象的均值);不斷重復這一過程直到標准測度函數開始收斂為止。一般都采用均方差作為標准測度函數. k個聚類具有以下特點:各聚類本身盡可能的緊湊,而各聚類之間盡可能的分開。
具體如下:
輸入:k, data[n];
- (1) 選擇k個初始中心點,例如c[0]=data[0],…c[k-1]=data[k-1];
- (2) 對於data[0]….data[n],分別與c[0]…c[k-1]比較,假定與c[i]差值最少,就標記為i;
- (3) 對於所有標記為i點,重新計算c[i]={ 所有標記為i的data[j]之和}/標記為i的個數;
- (4) 重復(2)(3),直到所有c[i]值的變化小於給定閾值。
k-means 算法缺點
① 在 K-means 算法中 K 是事先給定的,這個 K 值的選定是非常難以估計的。很多時候,事先並不知道給定的數據集應該分成多少個類別才最合適。這也是 K-means 算法的一個不足。有的算法是通過類的自動合並和分裂,得到較為合理的類型數目 K,例如 ISODATA 算法。關於 K-means 算法中聚類數目K 值的確定在文獻中,是根據方差分析理論,應用混合 F 統計量來確定最佳分類數,並應用了模糊划分熵來驗證最佳分類數的正確性。在文獻中,使用了一種結合全協方差矩陣的 RPCL 算法,並逐步刪除那些只包含少量訓練數據的類。而文獻中使用的是一種稱為次勝者受罰的競爭學習規則,來自動決定類的適當數目。它的思想是:對每個輸入而言,不僅競爭獲勝單元的權值被修正以適應輸入值,而且對次勝單元采用懲罰的方法使之遠離輸入值。
② 在 K-means 算法中,首先需要根據初始聚類中心來確定一個初始划分,然后對初始划分進行優化。這個初始聚類中心的選擇對聚類結果有較大的影響,一旦初始值選擇的不好,可能無法得到有效的聚類結果,這也成為 K-means算法的一個主要問題。對於該問題的解決,許多算法采用遺傳算法(GA),例如文獻 中采用遺傳算法(GA)進行初始化,以內部聚類准則作為評價指標。
③ 從 K-means 算法框架可以看出,該算法需要不斷地進行樣本分類調整,不斷地計算調整后的新的聚類中心,因此當數據量非常大時,算法的時間開銷是非常大的。所以需要對算法的時間復雜度進行分析、改進,提高算法應用范圍。在文獻中從該算法的時間復雜度進行分析考慮,通過一定的相似性准則來去掉聚類中心的侯選集。而在文獻中,使用的 K-means 算法是對樣本數據進行聚類,無論是初始點的選擇還是一次迭代完成時對數據的調整,都是建立在隨機選取的樣本數據的基礎之上,這樣可以提高算法的收斂速度。
何為TD-IDF
TD-IDF(term frequency /inverse document frequency)不止一次看到這個概念了,讓我印象最深的是吳軍在《數學之美》中對這個概念簡約的描述。
TF-IDF(term frequency–inverse document frequency)是一種用於資訊檢索與資訊探勘的常用加權技術。TF-IDF是一種統計方法,用以評估一字詞對於一個文件集或一個語料庫中的其中一份文件的重要程度。字詞的重要性隨着它在文件中出現的次數成正比增加,但同時會隨着它在語料庫中出現的頻率成反比下降。
TF-IDF算法是建立在這樣一個假設之上的:對區別文檔最有意義的詞語應該是那些在文檔中出現頻率高,而在整個文檔集合的其他文檔中出現頻率少的詞語,所以如果特征空間坐標系取TF詞頻作為測度,就可以體現同類文本的特點。另外考慮到單詞區別不同類別的能力,TFIDF法認為一個單詞出現的文本頻數越小,它區別不同類別文本的能力就越大。因此引入了逆文本頻度IDF的概念,以TF和IDF的乘積作為特征空間坐標系的取值測度,並用它完成對權值TF的調整,調整權值的目的在於突出重要單詞,抑制次要單詞。
k-means 的文本聚類
前面介紹了TD-IDF我們可以通過用TD-IDF衡量每個單詞在文件中的重要程度。如果多個文件,它們的文件中的各個單詞的重要程度相似,我就可以說這些文件是相似的。如何評價這些文件的相似度呢?一種很自然的想法是用兩者的歐幾里得距離來作為相異度,歐幾里得距離的定義如下:
其意義就是兩個元素在歐氏空間中的集合距離,因為其直觀易懂且可解釋性強,被廣泛用於標識兩個標量元素的相異度。我們可以將X,Y分別理解為兩篇文本文件,xi,y是每個文件單詞的TD-IDF值。這樣就可以算出兩文件的相似度了。這樣我們可以將文件聚類的問題轉化為一般性的聚類過程,樣本空間中的兩點的距離可以歐式距離描述。除歐氏距離外,常用作度量標量相異度的還有曼哈頓距離和閔可夫斯基距離,兩者定義如下:
曼哈頓距離:
閔可夫斯基距離:
整個文本聚類過程可以先后分為兩步:
1、計算文本集合各個文檔中TD-IDF值,
2,根據計算的結果,對文件集合用k-means聚類方法進行迭代聚類。
TD-IDF的計算
假設文檔集合T ={n|tn, n>1}。
對文檔進行分詞或Tokennize處理,去掉停用詞。
- 計算各個詞出現的次數freq(wi),則TF(i) = freq(wi)/sum( freq(w1..n)) ,有時候sum( freq(w1..n))可以用max( freq(w1..n)),做歸一處理。
- 統計文件集合中有詞wj出現的文件個數doc_freq(wj).則IDF= 1/log(doc_freq(wj);
- 根據上面的計算我們可以算出文件i,單詞wj的TD-IDF權值W[i][j]= TD(j)*IDF(j)。其中i為文件集合T中的一個文件,而j是文件集合T中的一個單詞。
- 通過對文件集合T的計算我們可以得到一個二維數組(矩陣)W[i][j].
K-means聚類的迭代過程
- 1.隨機選取k個文件生成k個聚類cluster,k個文件分別對應這k個聚類的聚類中心Mean(cluster) = k ;對應的操作為從W[i][j]中0~i的范圍內選k行(每一行代表一個樣本),分別生成k個聚類,並使得聚類的中心mean為該行。
- 2.對W[i][j]的每一行,分別計算它們與k個聚類中心的距離(通過歐氏距離)distance(i,k)。
- 3.對W[i][j]的每一行,分別計算它們最近的一個聚類中心的n(i) = ki。
- 4.判斷W[i][j]的每一行所代表的樣本是否屬於聚類,若所有樣本最近的n(i)聚類就是它們的目前所屬的聚類則結束迭代,否則進行下一步。
- 5.根據n(i) ,將樣本i加入到聚類k中,重新計算計算每個聚類中心(去聚類中各個樣本的平均值),調到第2步。