2013-08-04 40 views
5

Tôi muốn sử dụng K-Means Clustering cho tập dữ liệu của mình. Tôi đang sử dụng hàm kmeans() trong R để làm điều này.Thực hiện Phương pháp Elbow để tìm số cụm tối ưu cho K-Means Clustering trong R

k<-kmeans(data,centers=3) 
plotcluster(m,k$cluster) 

Tuy nhiên tôi không chắc giá trị K chính xác cho hàm này là gì. Tôi muốn thử sử dụng Elbow Method cho việc này. Có gói nào trong R thực hiện phân cụm bằng phương pháp Elbow để tìm số cụm tối ưu.

+2

Từ bài viết wikipedia: "Đây "Tôi nghĩ rằng có một số chủ quan trong phương pháp này, mà làm cho một thực hiện khó khăn. – Roland

+2

có thể trùng lặp của [Phân tích cụm trong R: xác định số lượng tối ưu của cụm] (http: // stackoverflow. com/questions/15376075/cluster-phân tích-in-r-xác định-số-tối ưu-số-cụm) –

Trả lời

2

Kinh nghiệm của tôi là bạn không thể tự động hóa điều này --- bạn cần phải làm cho cốt truyện và kiểm tra khuỷu tay. Dưới đây là một số ví dụ hay: Cluster analysis in R: determine the optimal number of clusters

+0

Tôi tri ed làm điều đó .. nhưng đồ thị tôi nhận là rất khác nhau từ một trong bài viết wikipedia ... rất khó để tìm ra các điểm khuỷu tay từ nó – user1946152

+1

bạn có thể tự động hóa bất cứ điều gì - vấn đề là làm thế nào đáng tin cậy rằng tự động tìm thấy đầu gối :) –

+2

Xin chào một lần nữa. Nếu khuỷu tay không rõ ràng trong biểu đồ thì đó thực sự là dấu hiệu cho thấy không có câu trả lời "đúng" cho số cụm, k. Bạn có thể thử các chỉ số khác (AIC/BIC) hoặc các phương pháp phân nhóm khác. Tuy nhiên, điều cốt lõi có thể là bạn cần một phương pháp phi thống kê để chọn k (ví dụ: chuyên môn về vấn đề môn học). (p.s. hãy tiếp tục và đăng biểu đồ nếu đó là thứ bạn có thể chia sẻ!) – stackoverflax

8

Có hai câu hỏi được trộn lẫn ở đây. Một là làm thế nào để tìm một điểm thay đổi trên một đường cong, và cách khác là về cách định lượng chất lượng phù hợp khi sử dụng k-means để phân loại dữ liệu. Tuy nhiên, những người phân tích cụm dường như gộp hai câu hỏi này lại với nhau. Đừng ngại nhìn vào các phương pháp điểm đường cong/thay đổi đường cong khác bằng cách sử dụng bất kỳ số liệu phù hợp nào phù hợp nhất với trường hợp của bạn.

Tôi biết phương pháp 'khuỷu tay' mà bạn liên kết là một phương pháp cụ thể, nhưng bạn có thể quan tâm đến điều gì đó tương tự tìm kiếm 'đầu gối' trong Tiêu chí thông tin Bayesian (BIC). Các kink trong BIC so với số lượng các cụm (k) là điểm mà tại đó bạn có thể lập luận rằng việc tăng BIC bằng cách thêm nhiều cụm không còn mang lại lợi ích, cho thêm các yêu cầu tính toán của giải pháp phức tạp hơn. Có một phương pháp tốt đẹp để phát hiện số lượng tối ưu của các cụm từ sự thay đổi trong dấu hiệu của đạo hàm thứ hai của BIC. Xem ví dụ

Zhao, Q., V. Hautamaki và P. Franti 2008a: Phát hiện điểm đầu gối trong BIC để phát hiện số cụm. Khái niệm tiên tiến cho các hệ thống thị giác thông minh, J. Blanc-Talon, S. Bourennane, W. Philips, D. Popescu và P. Scheunders, Biên soạn, Springer Berlin/Heidelberg, Bài giảng trong Khoa học Máy tính, Vol. 5259, 664–673, doi: 10.1007/978-3-540-88458-3 60.

Zhao, Q., M. Xu và P. Franti, 2008b: Phát hiện điểm đầu gối theo tiêu chí thông tin bayesian. Công cụ với trí thông minh nhân tạo, 2008. ICTAI ’08. Hội nghị quốc tế về IEEE lần thứ 20, Vol. 2, 431 -438, doi: 10,1109/ICTAI.2008.154

Bạn có thể quan tâm trong một ứng dụng tự động của việc này đến thời tiết dữ liệu, báo cáo trong http://journals.ametsoc.org/doi/abs/10.1175/JAMC-D-11-0227.1

Xem thêm Finding the best trade-off point on a curve cho một cuộc thảo luận tuyệt vời của phương pháp nói chung.

Một quan sát cuối cùng: đảm bảo rằng bạn nhất quán trong logarit của mình. Các cộng đồng khác nhau sử dụng ký pháp khác nhau và điều này có thể là một nguồn lỗi khi so sánh kết quả.

3

Có, bạn có thể tìm số cụm tốt nhất bằng phương pháp Elbow, nhưng tôi thấy khó khăn khi tìm giá trị cụm từ biểu đồ khuỷu tay bằng cách sử dụng tập lệnh. Bạn có thể quan sát đồ thị khuỷu tay và tự tìm điểm khuỷu tay, nhưng có rất nhiều công việc tìm kiếm nó từ kịch bản.

Vì vậy, một tùy chọn khác là sử dụng Silhouette Method để tìm. Kết quả từ Silhouette hoàn toàn tuân thủ kết quả từ phương pháp Elbow.

Đây là những gì tôi đã làm.

#Dataset for Clustering 
n = 150 
g = 6 
set.seed(g) 
d <- data.frame(x = unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2))), 
       y = unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2)))) 
mydata<-d 
#Plot 3X2 plots 
attach(mtcars) 
par(mfrow=c(3,2)) 

#Plot the original dataset 
plot(mydata$x,mydata$y,main="Original Dataset") 

#Scree plot to deterine the number of clusters 
wss <- (nrow(mydata)-1)*sum(apply(mydata,2,var)) 
    for (i in 2:15) { 
    wss[i] <- sum(kmeans(mydata,centers=i)$withinss) 
} 
plot(1:15, wss, type="b", xlab="Number of Clusters",ylab="Within groups sum of squares") 

# Ward Hierarchical Clustering 
d <- dist(mydata, method = "euclidean") # distance matrix 
fit <- hclust(d, method="ward") 
plot(fit) # display dendogram 
groups <- cutree(fit, k=5) # cut tree into 5 clusters 
# draw dendogram with red borders around the 5 clusters 
rect.hclust(fit, k=5, border="red") 

#Silhouette analysis for determining the number of clusters 
library(fpc) 
asw <- numeric(20) 
for (k in 2:20) 
    asw[[k]] <- pam(mydata, k) $ silinfo $ avg.width 
k.best <- which.max(asw) 

cat("silhouette-optimal number of clusters:", k.best, "\n") 
plot(pam(d, k.best)) 

# K-Means Cluster Analysis 
fit <- kmeans(mydata,k.best) 
mydata 
# get cluster means 
aggregate(mydata,by=list(fit$cluster),FUN=mean) 
# append cluster assignment 
mydata <- data.frame(mydata, clusterid=fit$cluster) 
plot(mydata$x,mydata$y, col = fit$cluster, main="K-means Clustering results") 

Hy vọng điều đó sẽ hữu ích !!

+1

Một số minh họa về kết quả và giải thích thêm một chút về quy trình suy nghĩ sẽ biến câu trả lời toàn diện này thành câu trả lời tuyệt vời! –

0

Tôi đã thử gói GMD. Đối với một số lý do mất nhiều thời gian và trở lại với một lỗi trong bước này Lỗi trong elbow.batch (css.obj): Một tốt k' is not available with provided inc.thres and ev.thres; please make adjustment, e.g. decrease ev.thres ', tăng inc.thres' or increase k'.

Vì vậy, đây là giải pháp của tôi để nhận được tối ưu K (chạy nó trên 54 cột dữ liệu (tất cả các số nguyên) với 6000+ hàng

mydata <- read.csv(file.choose(), header = TRUE) 
mydata_scaled <- as.data.frame(lapply(mydata, scale)) 
mss <- (nrow(mydata_scaled)-1)*sum(apply(mydata_scaled,2,var)) 
for (i in 2:15) mss[i] <- sum(kmeans(mydata_scaled,centers=i)$withinss) 
plot(1:15, mss, type="b", xlab="Number of Clusters", ylab="Within groups sum of squares") 

hy vọng rằng sẽ giúp

Các vấn đề liên quan