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
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(徹底贊成)。