K均值聚類

  • K均值(k-means)算法

a、選擇 K 箇中心點(隨機選擇 K 行)算法

b、把每一個數據點分配到離它最近的中心點數據結構

c、從新計算每類中的點到類中心距離的平均值(也就是說,獲得長度爲 p均值向量,這裏的 p 是變量的個數)app

d、分配每一個數據點到它的最近的中心點函數

f、重複步驟(c)和(d)直到全部的觀測值再也不分配或是達到最大的迭代次數(R把10次做爲默認的迭代次數)flex

 

在 R 中把觀測值分紅 k 組並使得觀測值到指定的聚類中心的平方的總和爲最小,也就是說在步驟(b)和(d)中,每一個觀測值被分配到使下式獲得最小值的那一類中:spa

:表示第 i 個觀測值中第 j 個變量的值code

:表示第 k 個類中第 j 個變量的均值,其中 p 是變量的個數ci

  • kmeans(x,centers)

K均值的函數格式it

kmeans(x,centers)

x:表示數值的數據集(矩陣或數據框)io

centers:要提取的聚類數目

a、函數返回類的成員、類中心、平方和(類內平方和、類間平方和、總平方和)和類大小。

b、K均值距聚類能出處理比層次聚類更大的數據集,觀測值不會永遠被分到一類中。均值的使用意味着全部的內變量必須是連續的,而且這個方法頗有可能被異常值影響。它在非凸聚類(例如 U型)狀況下會變的不好

c、因爲 K 均值聚類在開始要隨機選擇 k 箇中心點,在每次調用函數時可能得到不一樣的方案。使用 set.seed()函數能夠保證結果是可複製的。此外,聚類方法對初始中心值的選擇也很敏感。kmeans()函數有一個nstart選項嘗試多種初始配置並輸出最好的一個。例如,加上 nstart =25 會生成25個初始配置,一般推薦使用這種方法

d、不像層次聚類方法,K均值要求事先肯定要提取的聚類個數,一樣, NbClust 包能夠做爲參考,另外,在 K 均值聚類,類中總的平方值對聚類數量的曲線可能有幫助,能夠根據圖中的彎曲( 相似與主成分分析中判斷成分個數) 選擇適當的類型數量

wssplot <- function(data, nc=15, seed=1234){    #  data是用來作分析的數據值,nc是要考慮的最大聚類個數 seed是一個隨機數種子
  wss <- (nrow(data)-1)*sum(apply(data,2,var))
  for (i in 2:nc){
    set.seed(seed)
    wss[i] <- sum(kmeans(data, centers=i)$withinss)}
  plot(1:nc, wss, type="b", xlab="Number of Clusters",
       ylab="Within groups sum of squares")}

葡萄酒數據的 K均值聚類

> data(wine,package = "rattle")  #從包中導入數據
> head(wine)
  Type Alcohol Malic  Ash Alcalinity Magnesium Phenols Flavanoids Nonflavanoids Proanthocyanins Color  Hue Dilution Proline
1    1   14.23  1.71 2.43       15.6       127    2.80       3.06          0.28            2.29  5.64 1.04     3.92    1065
2    1   13.20  1.78 2.14       11.2       100    2.65       2.76          0.26            1.28  4.38 1.05     3.40    1050
3    1   13.16  2.36 2.67       18.6       101    2.80       3.24          0.30            2.81  5.68 1.03     3.17    1185
4    1   14.37  1.95 2.50       16.8       113    3.85       3.49          0.24            2.18  7.80 0.86     3.45    1480
5    1   13.24  2.59 2.87       21.0       118    2.80       2.69          0.39            1.82  4.32 1.04     2.93     735
6    1   14.20  1.76 2.45       15.2       112    3.27       3.39          0.34            1.97  6.75 1.05     2.85    1450
> df <- scale(wine[-1])#-1表示剔除第一行的變量,scale()將觀測值標準化

#肯定聚類的個數
> wssplot(df)   #畫圖,有點相似碎石檢驗,用於肯定聚類的個數,以下圖1
> library(NbClust)
> set.seed(1234)
> nc <- NbClust(df,min.nc = 2,max.nc = 15,method = "kmeans")
*** : The Hubert index is a graphical method of determining the number of clusters.
                In the plot of Hubert index, we seek a significant knee that corresponds to a 
                significant increase of the value of the measure i.e the significant peak in Hubert
                index second differences plot. 
 
*** : The D index is a graphical method of determining the number of clusters. 
                In the plot of D index, we seek a significant knee (the significant peak in Dindex
                second differences plot) that corresponds to a significant increase of the value of
                the measure. 
 
******************************************************************* 
* Among all indices:                                                
* 4 proposed 2 as the best number of clusters 
* 15 proposed 3 as the best number of clusters 
* 1 proposed 10 as the best number of clusters 
* 1 proposed 12 as the best number of clusters 
* 1 proposed 14 as the best number of clusters 
* 1 proposed 15 as the best number of clusters 

                   ***** Conclusion *****                            
 
* According to the majority rule, the best number of clusters is  3 
 
 
******************************************************************* 
> par(opar)
Warning messages:
1: In par(opar) : 沒法設定圖形參數"cin"
2: In par(opar) : 沒法設定圖形參數"cra"
3: In par(opar) : 沒法設定圖形參數"csi"
4: In par(opar) : 沒法設定圖形參數"cxy"
5: In par(opar) : 沒法設定圖形參數"din"
6: In par(opar) : 沒法設定圖形參數"page"
> table(nc$Best.n[1,])

 0  1  2  3 10 12 14 15 
 2  1  4 15  1  1  1  1 
> barplot(table(nc$Best.n[1,]), xlab="Numer of Clusters", ylab="Number of Criteria",
        main="Number of Clusters Chosen by 26 Criteria")   #根據圖形肯定K的個數,以下圖2
        
#進行 K 均值聚類分析        
> set.seed(1234)
> fit.km <- kmeans(df,3,nstart = 25) #kmeans K均值聚類分析
> fit.km$size  #分紅三類,每類的觀測值
[1] 51 65 62

> aggregate(wine[-1],by=list(cluster=fit.km$cluster),mean) #計算原始矩陣中每類的變量均值
  cluster  Alcohol    Malic      Ash Alcalinity Magnesium  Phenols Flavanoids Nonflavanoids Proanthocyanins    Color       Hue
1       1 13.13412 3.307255 2.417647   21.24118  98.66667 1.683922  0.8188235     0.4519608        1.145882 7.234706 0.6919608
2       2 12.25092 1.897385 2.231231   20.06308  92.73846 2.247692  2.0500000     0.3576923        1.624154 2.973077 1.0627077
3       3 13.67677 1.997903 2.466290   17.46290 107.96774 2.847581  3.0032258     0.2920968        1.922097 5.453548 1.0654839
  Dilution   Proline
1 1.696667  619.0588
2 2.803385  510.1692
3 3.163387 1100.2258

 

 

圖1 畫出組內的平方和和提取的聚類個數的對比。從一類到三類降低得很快(以後降低的很慢),建議選用聚類個數爲 3 的解決方案

 

                                                    圖2 

K均值能夠很好的揭示類型變量中的正在數據結構嗎?交叉列表類型(葡萄酒品種)和類成員

> ct.km <- table(wine$Type,fit.km$cluster)
> ct.km
   
     1  2  3
  1  0  0 59
  2  3 65  3
  3 48  0  0

使用flexclust包中的蘭德指數(Rand index)來量化類型變量和類之間的協議

> library(flexclust)
> randIndex(ct.km)
     ARI 
0.897495

調整的蘭德指數爲兩種劃分了一種衡量兩個分區之間的協定,即調整後機會的量度,它的變化範圍是從-1(不一樣意)到1(徹底贊成)。

相關文章
相關標籤/搜索