2012-04-09 31 views
6

tôi đã tập hợp dữ liệu (5000 điểm với 4 kích thước) mà tôi đã sử dụng cụm kmeans trong R.đặt hàng điểm clustered sử dụng Kmeans và R

Tôi muốn đặt hàng các điểm trong mỗi cụm theo khoảng cách của họ để trung tâm của cụm đó.

Rất đơn giản, các dữ liệu trông như thế này (tôi đang sử dụng một tập hợp con để kiểm tra các cách tiếp cận khác nhau):

id Ans Acc Que Kudos 
1 100 100 100 100 
2 85 83 80 75 
3 69 65 30 29 
4 41 45 30 22 
5 10 12 18 16 
6 10 13 10 9 
7 10 16 16 19 
8 65 68 100 100 
9 36 30 35 29 
10 36 30 26 22 

Thứ nhất, tôi đã sử dụng phương pháp sau đây để cụm dataset thành 2 cụm:

(result <- kmeans(data, 2)) 

này trả về một đối tượng kmeans rằng có những điều sau methods: cluster, centers etc.

Nhưng tôi canno t tìm ra cách so sánh từng điểm và tạo ra một danh sách có thứ tự.

Thứ hai, tôi cố gắng tiếp cận seriation theo đề nghị của một người dùng khác SO here

tôi sử dụng các lệnh này:

clus <- kmeans(scale(x, scale = FALSE), centers = 3, iter.max = 50, nstart = 10) 
mns <- sapply(split(x, clus$cluster), function(x) mean(unlist(x))) 
result <- dat[order(order(mns)[clus$cluster]), ] 

Mà dường như để tạo ra một danh sách có thứ nhưng nếu tôi gắn nó vào nhãn các cụm (sử dụng lệnh cbind sau đây):

result <- cbind(x[order(order(mns)[clus$cluster]), ],clus$cluster) 

Tôi nhận được kết quả sau, dường như không theo thứ tự chỉnh sửa chính xác:

id Ans Acc Que Kudos clus 
1 3 69 65 30 29 1 
2 4 41 45 30 22 1 
3 5 10 12 18 16 2 
4 6 10 13 10 9 2 
5 7 10 16 16 19 2 
6 9 36 30 35 29 2 
7 10 36 30 26 22 2 
8 1 100 100 100 100 1 
9 2 85 83 80 75 2 
10 8 65 68 100 100 2 

Tôi không muốn viết lệnh willy-nilly nhưng hiểu cách thức hoạt động của phương pháp. Nếu bất cứ ai có thể giúp đỡ hoặc phát tán một số ánh sáng về điều này, nó sẽ thực sự tuyệt vời.

EDIT :::::::::::

Như các cụm có thể dễ dàng vẽ, tôi tưởng tượng có một cách đơn giản hơn để có được và xếp hạng các khoảng cách giữa các điểm và trung tâm.

Các trung tâm cho các cụm trên (khi sử dụng k = 2) như sau. Nhưng tôi không biết làm thế nào để có được và so sánh điều này với mỗi điểm riêng lẻ.

 Ans Accep  Que  Kudos 
1 83.33333 83.66667 93.33333 91.66667 
2 30.28571 30.14286 23.57143 20.85714 

NB ::::::::

Tôi không cần kmeans sử dụng hàng đầu nhưng tôi muốn xác định số lượng các cụm và lấy một danh sách có thứ tự các điểm từ những cụm.

+0

Đây là câu hỏi hay ... kiểm tra xem bạn không sử dụng ID để cụm (Tôi đoán có những trường hợp bạn có thể muốn, nhưng không chắc) – Seth

+0

Tuyệt, tôi không muốn cụm các id, giám sát thay mặt tôi. Tôi sẽ sửa đổi câu hỏi. thanks..j – slotishtype

+2

Tôi tin rằng 'kmeans()' cũng trả về các trung tâm cụm cuối cùng.Từ đó, không nên quá khó để tính toán khoảng cách từ mỗi điểm đến trung tâm cụm của nó. –

Trả lời

6

Dưới đây là ví dụ thực hiện những gì bạn yêu cầu, sử dụng ví dụ đầu tiên từ ?kmeans. Nó có lẽ không hiệu quả khủng khiếp, nhưng là thứ để xây dựng.

#Taken straight from ?kmeans 
x <- rbind(matrix(rnorm(100, sd = 0.3), ncol = 2), 
      matrix(rnorm(100, mean = 1, sd = 0.3), ncol = 2)) 
colnames(x) <- c("x", "y") 
cl <- kmeans(x, 2) 

x <- cbind(x,cl = cl$cluster) 

#Function to apply to each cluster to 
# do the ordering 
orderCluster <- function(i,data,centers){ 
    #Extract cluster and center 
dt <- data[data[,3] == i,] 
ct <- centers[i,] 

    #Calculate distances 
dt <- cbind(dt,dist = apply((dt[,1:2] - ct)^2,1,sum)) 
    #Sort 
dt[order(dt[,4]),] 
} 

do.call(rbind,lapply(sort(unique(cl$cluster)),orderCluster,data = x,centers = cl$centers)) 
+0

Cảm ơn @ joran, tôi đã bình chọn cho bạn và sẽ chấp nhận ngày mai sau khi tôi hiểu rõ hơn về nó. Tôi muốn hoàn toàn hiểu cách tiếp cận này. Tôi có thể hỏi bạn một câu hỏi nhanh không? Cách tiếp cận này có hoạt động với các bộ dữ liệu đa chiều không? Tôi chỉ muốn đảm bảo rằng phương pháp tiếp cận của tôi là chính xác và tôi không phải sử dụng một số hình thức MDS vv. Cảm ơn một lần nữa. – slotishtype

+0

@ slotishtype Vâng, những điều chính bạn sẽ muốn điều chỉnh là số lượng thứ nguyên cụ thể (tôi đã mã hóa cứng điều này ở một vài nơi cho dữ liệu chỉ với 2 cột) và lựa chọn chỉ số khoảng cách; Tôi đã sử dụng khoảng cách Euclide ở đây, nên phù hợp với kmeans. – joran

+0

Brill. Cảm ơn sự giúp đỡ của bạn, sẽ chấp nhận ngày mai khi tôi chơi với nó – slotishtype

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