2013-04-05 53 views
18

Tôi đã sử dụng k-means để nhóm dữ liệu của mình vào R nhưng tôi muốn có thể đánh giá độ phức tạp của mô hình của cụm bằng cách sử dụng thông tin Baysiean Tiêu chí (BIC) và AIC. Hiện tại mã tôi đang sử dụng trong R là:Cách tính BIC để phân cụm k trong R

KClData <- kmeans(Data, centers=2, nstart= 100) 

Nhưng tôi muốn có thể trích xuất BIC và Đăng nhập Likelihood. Mọi sự trợ giúp sẽ rất được trân trọng!

+1

Chức năng 'Mclust' trong mclust gói có thể được quan tâm. – Roland

+0

Roland, cảm ơn mẹo! Tôi thực sự đang cố gắng so sánh kết quả của k-means với các đầu ra Mclust, đó là lý do tại sao tôi muốn sử dụng BIC từ cụm từ k-means của tôi thành GMM mà Mclust sử dụng. – UnivStudent

+3

Tôi không phải là một chuyên gia, nhưng nghĩ rằng k-means không phải là một thuật toán khả năng tối đa. Bạn có chắc chắn rằng AIC và BIC có thể áp dụng không? – Roland

Trả lời

13

Đối với bất kỳ ai khác đến đây, có một phương pháp do Sherry Towers đề xuất tại http://sherrytowers.com/2013/10/24/k-means-clustering/, sử dụng đầu ra từ stats::kmeans. Tôi xin trích dẫn:

Các AIC có thể được tính với các chức năng sau:

kmeansAIC = function(fit){ 

m = ncol(fit$centers) 
n = length(fit$cluster) 
k = nrow(fit$centers) 
D = fit$tot.withinss 
return(D + 2*m*k) 
} 

Từ sự giúp đỡ cho stats::AIC, bạn cũng có thể thấy rằng BIC có thể được tính toán theo một cách tương tự như AIC. Một cách dễ dàng để có được BIC là để thay thế cho return() trong hàm trên, với điều này:

return(data.frame(AIC = D + 2*m*k, 
        BIC = D + log(n)*m*k)) 

Vì vậy, bạn sẽ sử dụng điều này như sau:

fit <- kmeans(x = data,centers = 6) 
kmeansAIC(fit) 
+0

Tôi đã sử dụng các phương pháp của bạn, nhưng giá trị BIC của kmean kết quả luôn giảm đều với số lượng cụm tăng lên. Vui lòng xem các bài đăng: http://stats.stackexchange.com/questions/55147/k-means-bic-to-validate-clusters-in-r/183097#183097 – pengchy

+1

Lấy dự đoán hoang dã, tôi muốn nói có một lỗi ở đâu đó. –

+0

Cảm ơn bạn Bất kỳ Clifton nào, tôi đã thử nghiệm BIC với số K cao hơn, khi K đạt tới 155 mã BIC có giá trị nhỏ nhất. Ban đầu, tôi chỉ thử nghiệm K với tối đa 50. – pengchy

6

Để tính BIC, chỉ cần thêm .5*k*d*log(n) (nơi k là số phương tiện, d là chiều dài của một vector trong tập dữ liệu của bạn, và n là số điểm dữ liệu) để hàm lỗi k-means chuẩn.

Hình phạt chuẩn k-means là \sum_n (m_k(n)-x_n)^2, trong đó m_k(n) là giá trị trung bình được kết hợp với điểm dữ liệu thứ n. Hình phạt này có thể được hiểu là xác suất nhật ký, vì vậy BIC hoàn toàn hợp lệ.

BIC chỉ thêm cụm từ hình phạt bổ sung vào lỗi k-means tỷ lệ thuận với k.

+0

I không nghĩ rằng hình phạt k-means '\ sum_n (m_k (n) - x_n)^2' (hoặc âm của điều đó) là khả năng đăng nhập. Khả năng đăng nhập phải có thêm 3 thuật ngữ: '-n * log (K)', '-0.5 * n * d * log (2 * pi)' và '-n * d * log (\ sigma)', ở đó \ sigma là std phổ biến cho tất cả Gaussians. Ngoài ra, "k" trong công thức BIC không phải là số cụm, nó là số tham số tự do trong mô hình Gaussian hỗn hợp, vì vậy k phải là: 'k = K-1 + 1 + K * d = K * (d + 1) '. Ở đây tôi đang sử dụng k thấp hơn cho thuật ngữ tham số BIC, và vốn K là số phương tiện/cụm. – Jason

+0

'K-1' là số lượng trọng số K-1 đối với người Gaussians, vì trọng lượng thêm tối đa là 1, số dof là K-1. '1' cho một phổ biến std cho tất cả Gaussians. Và 'K * d' là số tham số cho các tọa độ của các trung tâm cụm. – Jason

+0

Có trọng số nào trong k-means không? Tôi nghĩ không ... Vậy tại sao chúng ta cần K-1? – user5054

3

Chỉ cần thêm vào những gì user1149913 đã nói (Tôi không có đủ danh tiếng để nhận xét), vì bạn đang sử dụng hàm kmeans trong R, \sum_n (m_k(n)-x_n)^2 đã được tính cho bạn là KClData$tot.withinss.

2

Thay vì reimplementing AIC hoặc BIC, chúng tôi có thể xác định hàm khả năng đăng nhập cho các đối tượng kmeans; điều này sau đó sẽ được sử dụng bởi hàm BIC trong gói stats.

logLik.kmeans <- function(object) structure(
    -object$tot.withinss/2, 
    df = nrow(object$centers)*ncol(object$centers), 
    nobs = length(object$cluster) 
) 

Sau đó, để sử dụng nó, hãy gọi BIC như bình thường. Ví dụ:

example(kmeans, local=FALSE) 
BIC(cl) 
# [1] 26.22842084 

Phương pháp này sẽ được cung cấp trong bản phát hành tiếp theo của gói stackoverflow.

+0

Đang chờ phiên bản stackoverflow mới, phiên bản hiện tại 0.1.2 chưa triển khai chức năng này. – pengchy

+0

@pengchy phiên bản github có nó, tôi sẽ gửi đến cran khi tôi có cơ hội. –

+1

bạn đang đăng nhập ngược. Bạn cần một dấu trừ. – EngrStudent

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