聚類篇——(二)K-means聚類

上一篇博文介紹了什麼是聚類分析以及其應用場景,本篇博文詳細介紹常用聚類算法之一K-means聚類,將從以下幾個方面展開介紹:

  • K-means聚類基本思想及其優缺點,初步瞭解K-means聚類;
  • K-means聚類邏輯計算過程,瞭解其內部實現邏輯;
  • K-means聚類初始中心點選擇的合理性,會直接影響聚類收斂和效果,詳細介紹最大距離法、最大最小距離法、Huffman樹三種確定初始中心點的方法;
  • K-means聚類應用示例。

1. K-means聚類概述

K-means聚類也稱快速聚類,屬於覆蓋型數值劃分聚類算法。它得到的聚類結果,每個樣本點都唯一屬於一個類,而且聚類變量爲數值型,並採用劃分原理進行聚類。K-means聚類涉及兩個主要方面的問題:第一,如何測度樣本的“親疏程度”;第二,如何進行聚類。
K-means聚類的基本思想:參數K用以決定結果中簇的數目,算法開始時,要在數據集中隨機選擇K個數據對象用來當做K個簇的初始中心,而將剩下的各個數據對象根據他們和每個聚類簇心的距離選擇簇心最近的簇分配到其中。然後重新計算各個聚類簇中的所有數據對象的平均值,並將得到的結果作爲新的簇心;逐步重複上述過程直至目標函數收斂爲止。
K-means聚類過程
K-means聚類算法的優缺點

  • 優點:K均值算法伸縮性良好,且針對大型數據集效率高。
  • 缺點:(1)初始聚類中心選擇的好與壞將會對聚類結果的質量產生很大影響;(2)算法很容易陷入局部最優解,有時會產生較差的結果;(3)算法開始時要求用戶給出聚類簇的個數K,而對於K值的選擇還沒有很好的準則可循;(4)對噪聲敏感;(5)只能在可以定義聚類的平均值的條件下才可以應用,即適合處理數值屬性的數據; (6)採用歐式距離來測量樣本間的親疏程度,沒有考慮變量間的相關性,因此算法對變量間的相關性極度敏感,在聚類分析前需要對變量進行相關性分析。

2. K-means聚類邏輯計算過程

第一步,指定聚類數目K。
在K-means聚類中,應首先給出需聚成多少類。聚類數目的確定本身並不簡單,既要考慮最終的聚類效果,也要根據研究問題的實際需要。聚類數目太大或太小都將失去聚類的意義。

第二步,確定K個初始類中心。
類中心是各類特徵的典型代表,指定聚類數目K後,還應指定K個類的初始類中心點。初始類中心點指定的合理性,將直接影響聚類收斂的速度。常用的初始類中心點的指定方法爲經驗選擇法、隨機選擇法、最大最小法、最大距離法、Huffman樹法(後面詳細介紹)。

第三步,根據最近原則進行聚類。
依次計算每個數據點到K個類中心點的歐式距離,並按照距K箇中心點距離最近的原則,將所有樣本劃分到最近的類中,形成K個類。其中歐式距離爲
在這裏插入圖片描述
第四步,重新確定K個類中心。
中心點的確定原則是,依次計算各類中所有數據點變量的均值,並以均值點作爲K個類中心,其計算公式爲
在這裏插入圖片描述
第五步,聚類終止。
判斷是否已經滿足終止聚類的條件,如果沒有滿足則返回到第三步,不斷反覆上述過程,直到滿足迭代終止條件。聚類終止的條件:

  1. 迭代次數。當目前迭代次數等於指定的迭代次數時終止聚類;
  2. 目標函數收斂。其中目標函數爲
    在這裏插入圖片描述
    即各樣本到其所在類中心點的離差平方和小於某個指定值,即目標函數收斂,聚類終止。

3. K-means聚類初始中心點確定方法

由於K-均值算法初始中心點選取的隨機性,可能出現選取的聚類種子過於鄰近的情況,而導致聚類結果效果不好,也易陷入局部極小點。即初始類中心點指定的合理性,將直接影響聚類收斂的速度和效果。下面詳細介紹確定初始聚類中心點的三種方法:最大距離法、最大最小法、Huffman樹法。

(i)最大距離法

最大距離法是模式識別領域中一種基於試探的算法,思想是取儘可能離得遠的對象作爲聚類中心,提高了劃分初始數據集的效率。最大距離法具體步驟爲:
nn個數據對象,其中每個數據對象爲dd維,將nn個數據對象聚成kk類。
(1)有n 個樣本Sn=x1,x2,,xnS_n={x_1,x_2,⋯,x_n } ,計算每兩點間的歐式距離,選取距離最大的兩點p,qp,qdpq=max{dij,i,j1,2,,n}{{d}_{pq}}=\max \left\{ {{d}_{ij}},i,j\in 1,2,\cdots ,n \right\},記x1=p,x2=q,d1=dpqx_{1}^{*}=p,x_{2}^{*}=q,d_{1}^{*}={{d}_{pq}}

(2)將數據SnS_n中剩餘的 n2n-2個樣本,以x1x_{1}^{*}x2x_{2}^{*} 爲中心進行聚類,若di1<di2,{{d}_{i1}}<{{d}_{i2}},i{1,2,3,,n/p,q}\forall i\in \left\{ 1,2,3,\cdots ,n/p,q \right\},則將xi{{x}_{i}}歸於x1x_{1}^{*},否則歸於x2x_{2}^{*},這樣將Sn{{S}_{n}}x1x_{1}^{*}x2x_{2}^{*}爲中心分爲兩類;

(3)在已經聚成的cc個類中找出每個類中離中心點最遠的點,這樣就得到cc個點,在這cc個點中每次取一個點,與已經得到的cc個類的中心點組合成c+1c+1個點,把Sn{{S}_{n}}聚成c+1c+1個類,這樣我們得到了Sn{{S}_{n}}cc個不同劃分,並分別計算cc個劃分的準則函數,準則函數最小的那個劃分爲最優劃分,並將形成最優劃分的那個點作爲第c+1c+1箇中心點。
準則函數:i=1kxCidist(Ci,xi)2\sum\limits_{i=1}^{k}{\sum\limits_{x\in {{C}_{i}}}{dist{{\left( {{C}_{i}},{{x}_{i}} \right)}^{2}}}},對象到其簇質心的距離平方和;

(4)重複(3),直到找到kk 個聚類中心爲止。

下面結合具體實例來詳細說明最大距離算法來選取初始中心點的過程。
共有15個數據對象(x1,x2,,x15)\left( {{x}_{1}},{{x}_{2}},\cdots ,{{x}_{15}} \right){(5,6);(6,6);(5,5);(2,4);(3,4);(2,3);(1,2);(1,1);\left\{ \left( 5,6 \right);\left( 6,6 \right);\left( 5,5 \right);\left( 2,4 \right);\left( 3,4 \right);\left( 2,3 \right);\left( 1,2 \right); \right.\left( 1,1 \right);
(2,2);(5,1);(5,2);(6,3);(6,2);(6,1);(6,0)}\left( 2,2 \right);\left( 5,1 \right);\left( 5,2 \right);\left( 6,3 \right);\left. \left( 6,2 \right);\left( 6,1 \right);\left( 6,0 \right) \right\},要將這15個點聚成3個類,具體步驟如下:

  • 根據歐式距離求得(x1,x2,,x15)\left( {{x}_{1}},{{x}_{2}},\cdots ,{{x}_{15}} \right)每兩點間的距離,找出距離最遠的兩點x2(6,6){{x}_{2}}\left( 6,6 \right)x8(1,1){{x}_{8}}\left( 1,1 \right)d28=7.07{{d}_{28}}=7.07,令x1=x2x_{1}^{*}={{x}_{2}}x2=x8x_{2}^{*}={{x}_{8}}
    在這裏插入圖片描述
  • x2{{x}_{2}}x8{{x}_{8}}爲聚類中心,依次比較x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15{{x}_{1}},{{x}_{2}},{{x}_{3}},{{x}_{4}},{{x}_{5}},{{x}_{6}},{{x}_{7}},{{x}_{8}},{{x}_{9}},{{x}_{10}},{{x}_{11}},{{x}_{12}},{{x}_{13}},{{x}_{14}},{{x}_{15}}x2,x8{{x}_{2}},{{x}_{8}}的歐式距離di2,di8{{d}_{i2}},{{d}_{i8}},若di2<di8{{d}_{i2}}<{{d}_{i8}}則歸爲x1x_{1}^{*},否則歸爲x2x_{2}^{*},最終將數據聚成兩類,S21={x1,x2,x3,x12,x11,x13,x14}S_{21}^{*}=\left\{ {{x}_{1}},{{x}_{2}},{{x}_{3}},{{x}_{12}},{{x}_{11}},{{x}_{13}},{{x}_{14}} \right\}S22={x4,x5,x6,x7,x8,x9,x10,x15}S_{22}^{*}=\left\{ {{x}_{4}},{{x}_{5}},{{x}_{6}},{{x}_{7}},{{x}_{8}},{{x}_{9}},{{x}_{10}},{{x}_{15}} \right\}
  • S21S_{21}^{*}中距離中心點x2{{x}_{2}}最遠的點爲x14{{x}_{14}}S22S_{22}^{*}中離中心點x8{{x}_{8}}最遠的點爲x15{{x}_{15}}
  • 分別用{x2,x8,x14}\left\{ {{x}_{2}},{{x}_{8}},{{x}_{14}} \right\}{x2,x8,x15}\left\{ {{x}_{2}},{{x}_{8}},{{x}_{15}} \right\}把15個對象聚成3類,並分別計算得到{x2,x8,x14}\left\{ {{x}_{2}},{{x}_{8}},{{x}_{14}} \right\}{x2,x8,x15}\left\{ {{x}_{2}},{{x}_{8}},{{x}_{15}} \right\}聚類結果的準則函數值分別爲43和55, 可知以{x2,x8,x14}\left\{ {{x}_{2}},{{x}_{8}},{{x}_{14}} \right\}爲中心點得到的聚類結果更優。
    在這裏插入圖片描述

(ii)最大最小距離法
最大最小距離算法的基本思想是取儘可能離得遠的對象作爲初始聚類中心,得到對數據集較好的初始劃分,目的是避免K-means聚類算法初值選取的聚類中心過於鄰近,多個聚類中心都被選擇在同一個類中。最大最小距離法的具體步驟爲:

設數據集爲S={X1,X2,X3,,Xn}S=\left\{ {{X}_{1}},{{X}_{2}},{{X}_{3}},\cdots ,{{X}_{n}} \right\},初始聚類中心集爲V={V1,V2,,Vm}V=\left\{ {{V}_{1}},{{V}_{2}},\cdots ,{{V}_{m}} \right\},對象間的相異度是基於歐式距離度量的。
(1) 從數據集SS中任意選取一個數據對象,將其作爲第一個聚類中心點v1{{v}_{1}},並將其放入VV中;

(2) 計算v1{{v}_{1}}和數據集SS中剩餘的所有數據對象之間的距離,把距離最遠的數據對象放入VV中,將其作爲第二個聚類中心點v2{{v}_{2}}

(3) 計算數據集SS中剩餘的所有數據對象Xi{{X}_{i}},分別計算到v1{{v}_{1}}v2{{v}_{2}}的距離di1{{d}_{i1}}di2{{d}_{i2}},選擇其中較小的距離min(di1,di2)min\left( {{d}_{i1}},{{d}_{i2}} \right),即找到剩餘每個對象到已有聚類中心最近的距離;

(4) 計算min(di1,di2)min\left( {{d}_{i1}},{{d}_{i2}} \right)的最大值,即max(min(di1,di2))\max \left( min\left( {{d}_{i1}},{{d}_{i2}} \right) \right),與其對應的數據Xi{{X}_{i}}即爲第三個聚類中心v3{{v}_{3}}

(5) 假設已找到r(r<k)r\left( r<k \right)個聚類中心{vi,i=1,2,,r}\left\{ {{v}_{i}},i=1,2,\cdots ,r \right\},現在確定第r+1r+1個聚類中心,max{min(di1,di2,,dir)},i=1,2,,N\max \left\{ \min \left( {{d}_{i1}},{{d}_{i2}},\cdots ,{{d}_{ir}} \right) \right\},i=1,2,\cdots ,N所對應的數據Xi{{X}_{i}}即爲第r+1r+1個聚類中心;

(6) 重複第(5)步,直到r+1=kr+1=k爲止。
說明:(1)~(2)步可以用最大距離法中的第(1)步進行簡化,選取距離最遠的兩個對象。

下面給出一個具體實例來詳細說明最大距離算法的過程,
共有10個點(x1,x2,,x10)\left( {{x}_{1}},{{x}_{2}},\cdots ,{{x}_{10}} \right),具體步驟如下:

  • 任選一個點作爲第一個聚類中心,v1=x1{{v}_{1}}={{x}_{1}},座標爲(0,0)\left( 0,0 \right)
  • 在剩餘點中計算到v1{{v}_{1}}距離最大的點作爲第二個類的聚類中心,v2=x5{{v}_{2}}={{x}_{5}}
  • 計算剩餘點到v1{{v}_{1}}v2{{v}_{2}}的最小距離;
    x2{{x}_{2}}min(x2v1,x2v2)=x2v1\min \left( \left| {{x}_{2}}-{{v}_{1}} \right|,\left| {{x}_{2}}-{{v}_{2}} \right| \right)=\left| {{x}_{2}}-{{v}_{1}} \right|
    x3{{x}_{3}}min(x3v1,x3v2)=x3v1\min \left( \left| {{x}_{3}}-{{v}_{1}} \right|,\left| {{x}_{3}}-{{v}_{2}} \right| \right)=\left| {{x}_{3}}-{{v}_{1}} \right|
    x4{{x}_{4}}min(x4v1,x4v2)=x4v2\min \left( \left| {{x}_{4}}-{{v}_{1}} \right|,\left| {{x}_{4}}-{{v}_{2}} \right| \right)=\left| {{x}_{4}}-{{v}_{2}} \right|
    x6{{x}_{6}}min(x6v1,x6v2)=x6v2\min \left( \left| {{x}_{6}}-{{v}_{1}} \right|,\left| {{x}_{6}}-{{v}_{2}} \right| \right)=\left| {{x}_{6}}-{{v}_{2}} \right|
    x7{{x}_{7}}min(x7v1,x7v2)=x7v2\min \left( \left| {{x}_{7}}-{{v}_{1}} \right|,\left| {{x}_{7}}-{{v}_{2}} \right| \right)=\left| {{x}_{7}}-{{v}_{2}} \right|
    x8{{x}_{8}}min(x8v1,x8v2)=x8v2\min \left( \left| {{x}_{8}}-{{v}_{1}} \right|,\left| {{x}_{8}}-{{v}_{2}} \right| \right)=\left| {{x}_{8}}-{{v}_{2}} \right|
    x9{{x}_{9}}min(x9v1,x9v2)=x9v2\min \left( \left| {{x}_{9}}-{{v}_{1}} \right|,\left| {{x}_{9}}-{{v}_{2}} \right| \right)=\left| {{x}_{9}}-{{v}_{2}} \right|
    x10{{x}_{10}}min(x10v1,x10v2)=x10v2\min \left( \left| {{x}_{10}}-{{v}_{1}} \right|,\left| {{x}_{10}}-{{v}_{2}} \right| \right)=\left| {{x}_{10}}-{{v}_{2}} \right|
  • 計算
    max(x2v1,x3v1,x4v2,x6v2,x7v2,x8v2,x9v2,x10v2)=x9v2\max \left( \left| {{x}_{2}}-{{v}_{1}} \right|,\left| {{x}_{3}}-{{v}_{1}} \right|,\left| {{x}_{4}}-{{v}_{2}} \right|,\left| {{x}_{6}}-{{v}_{2}} \right|,\left| {{x}_{7}}-{{v}_{2}} \right|,\left| {{x}_{8}}-{{v}_{2}} \right|,\left| {{x}_{9}}-{{v}_{2}} \right|,\left| {{x}_{10}}-{{v}_{2}} \right| \right) =\left| {{x}_{9}}-{{v}_{2}} \right|
    因此,第三個初始聚類中心的候選對象爲x9{{x}_{9}},座標(6,3)\left( 6,3 \right)
    在這裏插入圖片描述

(iii)Huffman樹
Huffman樹簡單的說就是帶權路徑長度之和最小的二叉樹也稱最優二叉樹。給定n個數據點的權值,構造Huffman樹的算法描述如下:
(1) 根據n個給定的權值{w1,w2,,wn}\left\{ {{w}_{1}},{{w}_{2}},\cdots ,{{w}_{n}} \right\},構成n棵二叉樹的集合F={T1,T2,,Tn}F=\left\{ {{T}_{1}},{{T}_{2}},\cdots ,{{T}_{n}} \right\},每棵二叉樹Ti{{T}_{i}}只有根節點;

(2) 在FF中選兩棵根節點權值最小的樹作爲左右子樹,構造一棵二叉樹,新的二叉樹根節點的權值等於其左右子樹根節點權值之和;

(3) 在FF中刪除這兩棵子樹,同時將新得到的二叉樹加入FF中;

(4) 重複(2)和(3),直到FF中只剩一棵樹爲止。

基於Huffman樹思想確實K-均值聚類的初始聚類中心具體步驟如下:
(1) 根據Huffman樹的思想,採用歐式距離計算各數據點之間的相異度,對於構造樹時,採用左右結點的算術平均值作爲新的二叉樹根結點的值(也可以採用左右子樹根節點權值之和作爲新的二叉樹根結點);

(2) 對於構造出來的Huffman樹,按構造結點的逆序找到k1k-1個結點,根據圖論理論剋制,去掉這k1k-1個結點可將該樹分爲kk個子樹,這kk個子樹的平均值即初始的kk個聚類中心。

下面舉例說明構造樹並得到初始中心的過程。假設有一組一維數據集(x1,x2,,x6)\left( {{x}_{1}},{{x}_{2}},\cdots ,{{x}_{6}} \right),它們對應的權值爲(12,34,56,78,8,98)\left( 12,34,56,78,8,98 \right),需要將這六個點聚成3類,具體過程如下:

  • 首先根據歐式距離計算6個對象之間的相異度,得到相異度矩陣;
  • 找到矩陣中最小值即4,也就是數據點x1(12),x5(8){{x}_{1}}\left( 12 \right),{{x}_{5}}\left( 8 \right)的相異度,計算這兩個點的算術平均值爲x11=x1+x52=10{{x}_{11}}=\frac{{{x}_{1}}+{{x}_{5}}}{2}=10,並作爲x1,x5{{x}_{1}},{{x}_{5}}的中間節點加入樹。在數據集中刪掉x1,x5{{x}_{1}},{{x}_{5}},並將x11{{x}_{11}}加入到數據集得到新的數據集(x11,x2,x3,x4,x6)\left( {{x}_{11}},{{x}_{2}},{{x}_{3}},{{x}_{4}},{{x}_{6}} \right)對應的權值爲(10,34,56,78,98)\left( 10,34,56,78,98 \right),計算它們的相異度矩陣;
    在這裏插入圖片描述
  • 重複第(2)步直到數據集中只剩下一個對象,剩下的迭代過程相異度矩陣變化如下。
    在這裏插入圖片描述
  • 將數據集聚成3類,即k=3k=3在已構造的樹中按節點構造的逆序找出k1k-1個點,即57.75和27.5,去掉這兩點即可將構造樹分爲3個子樹(x1,x5)(x2,x3)(x4,x6)\left( {{x}_{1}},{{x}_{5}} \right)\left( {{x}_{2}},{{x}_{3}} \right)\left( {{x}_{4}},{{x}_{6}} \right)對應樹中(8,12)(34,56)(78,98)\left( 8,12 \right)\left( 34,56 \right)\left( 78,98 \right)。三個子樹的平均值10,45,88即爲3個簇的初始中心點。
    在這裏插入圖片描述

4. K-means聚類應用示例

爲研究不同地區的經濟發展特點,根據各地區GDP、GDP指數、人均GDP指標數據,將北京市、天津市、江蘇省等10個地區按照其經濟水平分成3類。
在這裏插入圖片描述

  • 對數據進行標準化,消除因指標量綱不同對聚類結果的影響。採用正向極差化法,公式如下:
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 採用歐式距離,計算樣本間親疏程度;
    兩個樣本之間的歐氏距離是樣本各個變量值之差的平方和的平方根,計算公式爲
    在這裏插入圖片描述
    其中樣本x=(x1,x2,...,xn)y=(y1,y2,...,yn)x=(x_1,x_2,...,x_n),y=(y_1,y_2,...,y_n) 。使用前一般需要將數據標準化,距離越大,差異度越大。
  • 分別運用最大距離法、HUFFMAN樹、最大最小距離法確定初始聚類中心;不同的方法得到的初始聚類中心不同。
    在這裏插入圖片描述
  • 運用SPSS,將上述初始聚類中心依次導入,分別進行聚類;
    在這裏插入圖片描述

初始聚類中心的選擇會對聚類結果產生一定影響。運用最大距離法、最大最小距離法確定初始聚類中心雖然不同,但是最終的聚類結果卻是一樣的;運用HUFFMAN樹得到的初始聚類中心與其他兩種方法不同,最終的聚類結果也有所差異。

總結
K-Means是聚類算法中最常用的一種,算法最大的特點是簡單,好理解,運算速度快。但是,只能應用於連續型的數據;並且初始聚類中心選擇的好與壞將會對聚類結果的質量產生很大影響;另外,對於聚類數K值的選擇還沒有很好的準則可循。所以,在實際應用中,要多次調整聚類數K值、初始聚類中心點等參數,結合自己的業務知識選擇一個較優的結果。

ps:初衷是通過撰寫博文記錄自己所學所用,實現知識的梳理與積累;將其分享,希望能夠幫到面臨同樣困惑的小夥伴兒。如發現博文中存在問題,歡迎隨時交流~~

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