2012-04-09 59 views
6

群集点我已经设置的数据(5000点与4周的尺寸),我已经在R.订购使用K均值和R

使用k均值群集我要通过其距离订购每个集群中的点该群集的中心。

很简单,数据看起来像这样(我使用的一个子集来测试各种方法):首先

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)) 

这将返回具有以下methods: cluster, centers etc.

但我canno一个k均值对象弄清楚如何比较每个点并产生一个有序列表。

其次,我尝试了系列化的做法被其他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 

NB ::::::::

我不需要顶部使用k均值,但我想指定集群的数量并从这些集群点的有序列表。

+0

这是一个很好的问题...请检查您不使用ID集群(我想有情况下,您可能想,但不太可能) – Seth 2012-04-09 16:13:47

+0

酷,我不想集群ID,代表我的监督。我会修改这个问题。谢谢..我 – slotishtype 2012-04-09 16:22:45

+2

我相信'kmeans()'也返回最后的集群中心。从那里,计算从每个点到其集群中心的距离应该不会太难。 – 2012-04-09 16:36:07

回答

6

下面是一个例子,它使用?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)) 
+0

谢谢@joran,一旦我对它有了更好的理解,我就向你表示祝贺,明天我会接受。我想完全理解这种方法。我可以问你一个简单的问题吗?这种方法是否适用于多维数据集?我只是想确保我的方法是正确的,我不必使用某种形式的MDS等。再次感谢。 – slotishtype 2012-04-09 19:34:11

+0

@slotishtype是的,你想要调整的主要事情是具体的维数(我已经在几个地方硬编码了这个数据,只有2列)和距离度量的选择;我在这里使用了欧几里德距离,这应该适用于kmeans。 – joran 2012-04-09 19:41:53

+0

Brill。感谢您的帮助,一旦我玩弄它,明天会接受它 – slotishtype 2012-04-09 19:42:54