我有一组数据(5000 个点,4 维),我在 R 中使用 kmeans 聚类。
我想按每个聚类中点到该聚类中心的距离对点进行排序。
很简单,数据看起来像这样(我正在使用一个子集来测试各种方法):
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
首先,我使用以下方法将数据集聚类为 2 个聚类:
(result <- kmeans(data, 2))
这将返回具有以下方法的 kmeans 对象:集群、中心等
但是我不知道如何比较每个点并生成有序列表。
其次,我尝试了另一位SO用户建议的系列方法
我使用以下命令:
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]), ]
这似乎会产生一个有序列表,但是如果我将其绑定到标记的集群(使用以下cbind命令):
result <- cbind(x[order(order(mns)[clus$cluster]), ],clus$cluster)
我得到以下结果,该结果似乎没有正确排序:
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
我不想随意编写命令,但要了解该方法的工作原理。 如果有人能帮忙或传播一些关于这一点的信息,那就太好了。
编辑:::::::::::
由于可以轻松绘制聚类,因此我想有一种更直接的方法来获取点和中心之间的距离并进行排序。
上述聚类的中心(使用 k = 2 时)如下。 但我不知道如何获得并将其与每个单独的点进行比较。
Ans Accep Que Kudos
1 83.33333 83.66667 93.33333 91.66667
2 30.28571 30.14286 23.57143 20.85714
铌::::::::
我不需要顶级 kmeans,但我想指定聚类的数量并从这些聚类中检索点的有序列表。
这是一个示例,它使用?kmeans
的第一个示例来执行您的要求。它可能不是非常有效,但可以在此基础上进行构建。
#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))