R語言k-means聚類
阿新 • • 發佈:2019-01-07
輪廓係數
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。