1. 程式人生 > >R語言k-means聚類

R語言k-means聚類

輪廓係數

K值選取

在實際應用中,由於Kmean一般作為資料預處理,或者用於輔助分類貼標籤。所以k一般不會設定很大。可以通過列舉,令k從2到一個固定值如10,在每個k值上重複執行數次kmeans(避免區域性最優解),並計算當前k的平均輪廓係數,最後選取輪廓係數最大的值對應的k作為最終的叢集數目。

資料標準化

min.max.norm <- function(x){
  (x-min(x))/(max(x)-min(x))
}
raw.data <- iris[,1:4]
norm.data <- data.frame(sl = min.max.norm(raw.data
[,1]), sw = min.max.norm(raw.data[,2]), pl = min.max.norm(raw.data[,3]), pw = min.max.norm(raw.data[,4]))

畫輪廓圖確定k

# k取2到8,評估K
K <- 2:8
round <- 30 # 每次迭代30次,避免區域性最優
rst <- sapply(K, function(i){
  print(paste("K=",i))
  mean(sapply(1
:round,function(r){ print(paste("Round",r)) result <- kmeans(norm.data, i) stats <- cluster.stats(dist(norm.data), result$cluster) stats$avg.silwidth })) }) plot(K,rst,type='l',main='輪廓係數與K的關係', ylab='輪廓係數')

通過多維定標進行視覺化

old.par <- par(mfrow = c(1,2))
k = 2 # 根據上面的評估 k=2
最優 clu <- kmeans(norm.data,k) mds = cmdscale(dist(norm.data,method="euclidean")) plot(mds, col=clu$cluster, main='kmeans聚類 k=2', pch = 19) plot(mds, col=iris$Species, main='原始聚類', pch = 19) par(old.par)

附錄

模式識別之多維定標

在模式識別中,我們會考慮到距離distance的問題,就是一個樣本和另一個樣本在空間中的距離。根據距離的大小來判斷分類。那麼,也存在這樣的一類問題:我們只知道空間中的點(樣本)的距離,那麼怎麼來重構這些點的相對位置呢?
顯然歐式距離是最直觀的距離,那麼我們就會想使用歐式距離來進行計算重構,我們還希望能夠在不同維度上進行重構,比如2維或者3維。
怎麼做?
有這麼個解決方法叫做MDS 全稱為 Multidimensional Scaling。

譜聚類