機器學習系列-K-Means算法

3.K-Means 介紹

K-Means :最爲經典的基於劃分的聚類方法,是十大經典數據挖掘算法之一。

基本思想:以空間中k個點爲中心進行聚類,對最靠近他們的對象歸類。通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結果。

3.1 K-Means聚類原理

假設我們提取到原始數據的集合爲(X1, X2, „, Xn),並且每個Xi爲d維的向量(d維向量由原始數據的d個特徵組成),K-means聚類的目的就是,在給定分類組數k(k ≤ n)值的條件下,將原始數據分成k類  S = {S1, S2, …, Sk}。

 

3.2 K-Means 執行過程:

①從數據集D中隨機取k個元素,作爲k個簇的各自的中心。 

②分別計算剩下的元素到k個簇中心的相異度,將這些元素分別劃歸到相異度最低的簇。 

③根據聚類結果,重新計算k個簇各自的中心,計算方法是取簇中所有元素各自維度的算術平均數。 

④將D中全部元素按照新的中心重新聚類。

⑤重複第3、4步,直到每個簇的中心基本不再變化。

⑥將結果輸出。

 

難點主要是初始中心K值的選擇。

我們經常接觸到的聚類分析,一般都是數值聚類,一種常見的做法是同時提取 N 種特徵,將它們放在一起組成一個 N 維向量,從而得到一個從原始數據集合到 N 維向量空間的映射——總是需要顯式地或者隱式地完成這樣一個過程,然後基於某種規則進行分類,在該規則下,同組分類具有最大的相似性。 

聚類屬於無監督學習,以往的迴歸、樸素貝葉斯、SVM等都是有類別標籤y的,也就是說樣例中已經給出了樣例的分類。而聚類的樣本中卻沒有給定y,只有特徵x。

 

3.3 K-Means 過程圖如下:

 

如圖所示,數據樣本用圓點表示,每個簇的中心點用叉叉表示。(a)剛開始時是原始數據,雜亂無章,沒有label,看起來都一樣,都是綠色的。(b)假設數據集可以分爲兩類,令K=2,隨機在座標上選兩個點,作爲兩個類的中心點。(c-f)演示了聚類的兩種迭代。先劃分,把每個數據樣本劃分到最近的中心點那一簇;劃分完後,更新每個簇的中心,即把該簇的所有數據點的座標加起來去平均值。這樣不斷進行”劃分—更新—劃分—更新”,直到每個簇的中心不在移動爲止。

3.4 k-Means聚類算法的應用 

聚類就是按照一定的標準將事物進行區分和分類的過程,該過程是無監督的,即事先並不知道關於類分的任何知識。聚類分析又稱爲數據分割,它是指應用數學的方法研究和處理給定對象的分類,使得每個組內部對象之間的相關性比其他對象之間的相關性高,組間的相異性較高。 

聚類算法被用於許多知識領域,這些領域通常要求找出特定數據中的“自然關聯”。自然關聯的定義取決於不同的領域和特定的應用,可以具有多種形式。

 

3.5 K-Means 典型的應用例如: 

①商務上,幫助市場分析人員從客戶基本資料庫中發現不同的客戶羣,並用購買模式來刻畫不同客戶羣的特徵; 

②聚類分析是細分市場的有效工具,同時也可用於研究消費者行爲,尋找新的潛在市場、選擇實驗的市場,並作爲多元分析的預處理;

③生物學上,用於推導植物和動物的分類,對基因進行分類,獲得對種羣固有結構的認識; 

④地理信息方面,在地球觀測數據庫中相似區域的確定、汽車保險單持有者的分組,及根據房子的類型、價值和地理位置對一個城市中房屋的分組上可以發揮作用;

4.Canopy 算法介紹

Canopy聚類算法是一個將對象分組到類的簡單、快速、精確地方法。每個對象用多維特徵空間裏的一個點來表示。這個算法使用一個快速近似距離度量和兩個距離閾值 T1>T2來處理。

基本的算法是,從一個點集合開始並且隨機刪除一個,創建一個包含這個點的Canopy,並在剩餘的點集合上迭代。對於每個點,如果它距離第一個點的距離小於T1,然後這個點就加入這個聚集中。除此之外,如果這個距離<T2,然後將這個點從這個集合中刪除。這樣非常靠近原點的點將避免所有的未來處理,不可以再做其它Canopy的中心。這個算法循環到初始集合爲空爲止,聚集一個集合的Canopies,每個可以包含一個或者多個點。每個點可以包含在多於一個的Canopy中。

Canopy算法其實本身也可以用於聚類,但它的結果可以爲之後代價較高聚類提供幫助,其用在數據預處理上要比單純拿來聚類更有幫助。Canopy聚類經常被用作更加嚴格的聚類技術的初始步驟,像是K均值聚類。建立canopies之後,可以刪除那些包含數據點數目較少的canopy,往往這些canopy是包含孤立點的。

4.1 Canopy算法的步驟

(1) 將所有數據放進list中,選擇兩個距離,T1,T2,T1>T2

(2)While(list不爲空)

 { 

隨機選擇一個節點做canopy的中心;並從list刪除該點;

遍歷list:

對於任何一條記錄,計算其到各個canopy的距離;

如果距離<T2,則給此數據打上強標記,並從list刪除這條記錄;

如果距離<T1,則給此數據打上弱標記;

如果到任何canopy中心的距離都>T1,那麼將這條記錄作爲一個新的canopy的中心,並從list中刪除這個元素;

}

 

需要注意的是參數的調整:
當T1過大時,會使許多點屬於多個Canopy,可能會造成各個簇的中心點間距離較近,各簇間區別不明顯;
當T2過大時,增加強標記數據點的數量,會減少簇個個數;T2過小,會增加簇的個數,同時增加計算時間;

 

過程圖如下所示:

4.2 計算兩點間的距離的方法

CosineDistanceMeasure:計算兩向量間的夾角

SquaredEuclideanDistanceMeasure:計算歐式距離的平方

EuclideanDistanceMeasure:計算歐式距離

ManhattanDistanceMeasure:馬氏距離,貌似圖像處理中用的比較多

 

4.3 Canopy使用注意點

  1. 首先是輕量距離量度的選擇,是選擇數據模型其中的一個屬性,還是選擇其他外部屬性這對canopy的分佈最爲重要。
  2. T1,T2的取值影響到canopy重疊率f,以及canopy的粒度;
  3. Canopy有消除孤立點的作用,而k-means在這方面卻無能爲力。建立canopies之後,可以刪除那些包含數據點數目較少的canopy,往往這些canopy是包含孤立點的;
  4. 根據canopy內點的數目,來決定聚類中心數目k,這樣效果比較好;

4.4 Canopy算法

與傳統的聚類算法(比如K-means)不同,Canopy聚類最大的特點是不需要事先指定k值(即clustering的個數),因此具有很大的實際應用價值。與其他聚類算法相比,Canopy聚類雖然精度較低,但其在速度上有很大優勢,因此可以使用Canopy聚類先對數據進行“粗”聚類,得到k值,以及大致的K歌中心點,再使用K-means進行進一步“細”聚類。所以Canopy+K-means這種形式聚類算法聚類效果良好。

 

4.5 Canopy算法解析:

1)原始數據集合List按照一定的規則進行排序(這個規則是任意的,但是一旦確定就不再更改),初始距離閾值爲T1、T2,且T1>T2(T1、T2的設定可以根據用戶的需要,或者使用交叉驗證獲得)。

2)在List中隨機挑選一個數據向量A,使用一個粗糙距離計算方式計算A與List中其他樣本數據向量之間的距離d。

3)根據第2步中的距離d,把d小於T1的樣本數據向量劃到一個canopy中,同時把d小於T2的樣本數據向量從候選中心向量名單(這裏可以理解爲就是List)中移除。

4)重複第2、3步,直到候選中心向量名單爲空,即List爲空,算法結束。

 

算法原理比較簡單,就是對數據進行不斷遍歷,T2<dis<T1的可以作爲中心名單,dis<T2的認爲與canopy太近了,以後不會作爲中心點,從list中刪除,這樣的話一個點可能屬於多個canopy。

 

 Canopy的效果圖:

4.6 Canopy算法優勢:

1、Kmeans對噪聲抗干擾較弱,通過Canopy對比較小的NumPoint的Cluster直接去掉 有利於抗干擾。

2、Canopy選擇出來的每個Canopy的centerPoint作爲Kmeans比較科學。

3、只是針對每個Canopy的內容做Kmeans聚類,減少相似計算的數量。

  總結起來就是四個關鍵詞:噪聲點,K值,K中心點,計算開銷。(儘管這個算法準確性不是很理想,但是還是有用武之地的)

    

4.7 Canopy+K-Means的混合算法

Canopy+K-MEANS算法思路如下:

Stage1、聚類最耗費計算的地方是計算對象相似性的時候,Canopy Method在第一階段選擇簡單、計算代價較低的方法計算對象相似性,將相似的對象放在一個子集中,這個子集被叫做Canopy,通過一系列計算得到若干Canopy,Canopy之間可以是重疊的,但不會存在某個對象不屬於任何Canopy的情況,可以把這一階段看做數據預處理;

  Stage2、在各個Canopy內使用傳統的聚類方法(如K-means),不屬於同一Canopy的對象之間不進行相似性計算。從這個方法起碼可以看出兩點好處:首先,Canopy不要太大且Canopy之間重疊的不要太多的話會大大減少後續需要計算相似性的對象的個數;其次,類似於K-means這樣的聚類方法是需要人爲指出K的值的,通過Stage1得到的Canopy個數完全可以作爲這個K值,一定程度上減少了選擇K的盲目性。

 

5.聚類算法K-Means與Canopy

首先介紹先K-means算法:所有做聚類分析的數據對象,會被描述成n爲空間中的一個點,用向量(Vector)表示;算法開始會隨機選擇K個點,作爲一個簇的中心,然後其餘的點會根據它與每個簇心的距離,被分配到最近簇中去;接着以迭代的方式,先重新計算每個簇的中心(通過其包含的所有向量的平均值),計算完成後對所有點屬於哪個簇進行重新劃分;一直如此迭代直到過程收斂;可證明迭代次數是有限的。

雖然K-means簡單且高效,但它存在一定問題,首先K值(即簇的數量)是人爲確定的,在對數據不瞭解的情況下,很難給出合理的K值;其次初始簇心的選擇是隨機的,若選擇到了較孤立的點,會對聚類的效果產生非常大的影響。因此通常會用Canopy算法配合,進行初始化,確定簇數以及初始簇心。

Canopy算法首先會要求輸入兩個閥值 T1和T2,T1>T2;算法有一個集羣這裏叫Canopy的集合(Set),當然一開始它是空的;然後會將讀取到的第一個點作爲集合中的一個Canopy,接着讀取下一個點,若該點與集合中的每個Canopy計算距離,若這個距離小於T1,則這個點會分配給這個Canopy(一個點可以分配給多個Canopy),而當這個距離小於T2時這個點不能作爲一個新的Canopy而放到集合中。也就是說當一個點只要與集合中任意一個Canopy的距離小於T2了,即表示它與那個Canopy太近不能作爲新的Canopy。若都沒有則生成一個新的Canopy放入集合中。以此循環,直到沒有點了。

所以這裏用到的聚類分析算法的思路是:首先通過Canopy算法進行聚類,以確定簇數以及初始簇中心向量,接着通過K-means算法進行迭代運算,收斂出最後的聚類結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章