R中的聚类二进制矩阵

时间:2013-12-11 22:26:03

标签: r matrix

我有2个变量之间的二进制矩阵。我想知道是否有办法在R中聚类二进制矩阵。如果是这样,我应该使用哪种算法?

矩阵看起来像这样

        hobby1  hobby2  hobby3  hobby4
person1   1       0       0       1
person2   0       1       0       1
person3   1       1       1       0
person4   0       1       1       1

因此,通过他们最常见的爱好将这些人聚集在一起。这样做的最佳方法是什么?

由于

2 个答案:

答案 0 :(得分:1)

crossprod()reshape2::melt()

怎么样?
# CREATE THE MATRIX
m.h<-(matrix(sample(0:1,200,T),nrow=20))

# CREATE CROSS_PRODUCT
m.cross<-matrix(unlist(lapply(1:nrow(m.h),function(x)crossprod(m.h[x,],t(m.h)))),nrow=nrow(m.h),byrow=T)

# USE reshape2 to melt/flatten the data
require(reshape2)
m.long<-melt(m.cross)
m.long[order(m.long$value,factor(m.long$Var2),factor(m.long$Var1)),]

require(ggplot2)
ggplot(m.long)+
  geom_tile(aes(Var1,Var2,fill=value))+
  geom_text(aes(Var1,Var2,label=value))+
  theme(axis.text.x = element_text(angle = 90, hjust = 1))+
  scale_fill_gradient(low="yellow",high="red") +
  scale_x_discrete(breaks = 1:nrow(m.h), labels=unlist(lapply(1:nrow(m.h),function(x)paste0("Person ",x)))) + 
  scale_y_discrete(breaks = 1:nrow(m.h), labels=unlist(lapply(1:nrow(m.h),function(x)paste0("Person ",x)))) +
  coord_cartesian(xlim=c(0,nrow(m.h)+1),ylim=c(0,nrow(m.h)+1))  

enter image description here

答案 1 :(得分:0)

您是否想知道用于聚类二进制数据的有用相似性/相异性指标是什么?有Jaccard index /系数,即

  

(交叉的大小)/(联合的大小)

a.k.a。 (共享1的#)/(两行中的一行具有1的列的数量)。相应的Jaccard距离为1 - Jaccard指数。 还有简单的匹配系数,即

  

(交叉的大小)/(向量的长度)

我确信为二进制数据提出了其他距离指标。这确实是一个统计问题,所以你应该查阅一本关于这个主题的书。

在R中,您可以使用dist(x, method="binary"),在这种情况下,我相信使用Jaccard索引。然后在选择聚类算法时使用距离矩阵对象dist.obj(例如hclust)。