2011-12-26 52 views
13

Tôi đang sử dụng hàm kmeans() trong R và tôi tò mò sự khác nhau giữa các thuộc tính trả về của các đối tượng trả về là gì. Từ các tài liệu họ dường như được trả lại cùng một điều, nhưng áp dụng trên số liệu của tôi giá trị của totss là 66213,63 và cho tot.withinss là 6893,50. Vui lòng cho tôi biết nếu bạn quen thuộc với thông tin chi tiết. Cảm ơn bạn!k-có nghĩa là giá trị trả về trong R

Marius.

Trả lời

19

Do giữa tổng bình phương betweenss và vector của trong tổng bình phương cho mỗi cụm withinss các công thức là những:

totss = tot.withinss + betweenss 
tot.withinss = sum(withinss) 

Ví dụ, nếu chỉ có một cụm sau đó betweenss sẽ 0, sẽ chỉ có một thành phần trong withinsstotss = tot.withinss = withinss.

Để biết thêm chi tiết, chúng tôi có thể tính toán các số lượng khác nhau này cho các bài tập nhóm và có thể giúp làm rõ ý nghĩa của chúng. Xem xét dữ liệu x và gán cụm cl$cluster từ ví dụ trong help(kmeans). Xác định tổng bình phương hàm này như sau - điều này trừ giá trị trung bình của mỗi cột của x từ cột đó và sau đó tiền của các hình vuông của mỗi phần tử của ma trận còn lại:

# or ss <- function(x) sum(apply(x, 2, function(x) x - mean(x))^2) 
ss <- function(x) sum(scale(x, scale = FALSE)^2) 

Sau đó, chúng tôi có những điều sau đây. Lưu ý rằng cl$centers[cl$cluster, ] là các giá trị được trang bị, tức là nó là ma trận với một hàng trên mỗi điểm sao cho hàng thứ i là trung tâm của cụm mà điểm thứ i thuộc về.

example(kmeans) # create x and cl 

betweenss <- ss(cl$centers[cl$cluster,]) # or ss(fitted(cl)) 

withinss <- sapply(split(as.data.frame(x), cl$cluster), ss) 
tot.withinss <- sum(withinss) # or resid <- x - fitted(cl); ss(resid) 

totss <- ss(x) # or tot.withinss + betweenss 

cat("totss:", totss, "tot.withinss:", tot.withinss, 
    "betweenss:", betweenss, "\n") 

# compare above to: 

str(cl) 

EDIT:

Kể từ khi câu hỏi này được trả lời, R đã bổ sung thêm tương tự kmeans ví dụ (example(kmeans)) và một fitted.kmeans phương pháp mới và bây giờ chúng ta thấy làm thế nào phương pháp được trang bị phù hợp trên trong các ý kiến ​​trailing các dòng mã.

+0

Ahum. Vì vậy, * tot.withinss * phải là tổng trong biến thể cụm và các * tots * phải là biến thể dữ liệu tổng thể. tổng trong biến thể cụm + số ss của các trung tâm cụm. Đúng? – Marius

+0

Tôi đã thêm một số làm rõ thêm. –

+0

Vì vậy, nếu người ta muốn tìm ra tổng số trong sự thay đổi cụm, sau đó * tot.whitinss * là một. Cảm ơn bạn. – Marius

0

Tôi nghĩ rằng bạn đã phát hiện một lỗi trong tài liệu hướng dẫn ... mà nói:

withinss  The within-cluster sum of squares for each cluster. 
totss  The total within-cluster sum of squares. 
tot.withinss  Total within-cluster sum of squares, i.e., sum(withinss). 

Nếu bạn sử dụng bộ dữ liệu mẫu trong ví dụ trang trợ giúp:

> kmeans(x,2)$tot.withinss 
[1] 15.49669 
> kmeans(x,2)$totss 
[1] 65.92628 
> kmeans(x,2)$withinss 
[1] 7.450607 8.046079 

Tôi nghĩ rằng ai đó nên viết một yêu cầu đến danh sách gửi thư r-devel yêu cầu sửa đổi trang trợ giúp. Tôi sẵn sàng làm như vậy nếu bạn không muốn.

+0

Cảm ơn phản ứng nhanh. Tôi đã suy nghĩ tương tự .. rằng có một lỗi trong doc .. tiếc là không phải là duy nhất như tôi đã thấy. Bạn có thể viết nếu bạn muốn một yêu cầu cho họ. Điểm chính là tôi cũng đang sử dụng thuật toán k-means di truyền và tôi muốn so sánh kết quả. Bây giờ tôi không biết cái nào cần phải cân nhắc .. – Marius

+0

Bạn nên làm gì với? (Có quá nhiều đại từ và tính từ, không đủ danh từ trong bản tuyên bố lẫn lộn của bạn hoặc câu hỏi phản đối của tôi.) –

+0

:/nếu không có cú pháp ngôn ngữ lập trình liên quan đến bạn chọn ngữ pháp? Tôi muốn so sánh kết quả của thuật toán k-means di truyền với kết quả của hàm kmeans trong R. Điểm chính là giảm thiểu sự thay đổi trong cụm. Đối tượng kmeans trả về trong R có 2 thuộc tính được định nghĩa giống nhau trong tài liệu.Chỉ có một kết quả được so sánh. – Marius

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