【问题标题】:Ordering clustered points using Kmeans and R使用 Kmeans 和 R 对聚类点进行排序
【发布时间】:2012-04-21 22:32:10
【问题描述】:

我有一组数据(4 个维度的 5000 个点),我在 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 对象,该对象具有以下 methods: cluster, centers etc.

但我不知道如何比较每个点并生成有序列表。

其次,我尝试了另一个SO用户here建议的序列化方法

我使用这些命令:

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 

注意:::::::::

我不需要 top use kmeans 但我想指定集群的数量并从这些集群中检索点的有序列表。

【问题讨论】:

  • 这是一个很好的问题...检查您是否没有使用 ID 进行集群(我猜有些情况您可能想要,但不太可能)
  • 酷,我不想集群 id,代表我监督。我会修改问题。谢谢..j
  • 我相信kmeans()也会返回最终的聚类中心。从那里开始,计算每个点到其集群中心的距离应该不会太难。
  • 嗨@Jack Maney,你是对的,它用集群表示例如:集群表示:X.Ans X.Accep X.Ques X.Kudos 1 83.33333 83.66667 93.33333 91.66667 2 30.28571 30.14286 23.57143 20.85714 但我不知道如何访问聚类数据点来比较距离。我觉得这很简单,但我不确定如何进行。
  • 您拥有数据点(即与您输入kmeans() 的数据相同)。您拥有每个集群的集群分配和中心。究竟是什么让您对计算每个点与该点的集群中心之间的距离感到困惑?

标签: r cluster-analysis k-means


【解决方案1】:

这是一个可以满足您要求的示例,使用来自?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))

【讨论】:

  • 谢谢@joran,我支持你,一旦我对它有了更好的理解,我明天就会接受。我确实想完全理解这种方法。我能问你一个简单的问题吗?这种方法是否适用于多维数据集?我只是想确保我的方法是正确的,并且我不必使用某种形式的 MDS 等。再次感谢。
  • @slotishtype 是的,您需要调整的主要内容是特定的维度数量(我已经在几个地方对只有 2 列的数据进行了硬编码)和距离度量的选择;我在这里使用了欧几里得距离,这应该适用于 kmeans。
  • 布里尔。感谢您的帮助,明天我会接受它
  • 嘿@joran,只是想知道您能否(简要地)解释以下几行:dt
  • dt 是来自集群i 的数据; ct 是集群i 的中心。在cbind 行之前添加browser() 并运行代码。然后玩弄你不理解的部分,这样你就可以看到每个组件在做什么,以及对象是什么。
猜你喜欢
  • 2019-01-06
  • 2014-03-07
  • 1970-01-01
  • 2015-02-05
  • 2019-11-27
  • 2018-06-14
  • 1970-01-01
  • 2016-06-03
  • 2016-04-04
相关资源
最近更新 更多