在R中对二元矩阵进行聚类

3

我有两个变量之间的二进制矩阵。我想知道在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个回答

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
这是一个很好的回答,但是我还是有些困惑,例如,Person1属于哪个簇?您能否给我一个简单的解释,例如谁将属于特定的簇? - user1375640

0

你是否在想,对于聚类二进制数据来说,哪种相似度/不相似度度量是有用的?这里有Jaccard指数/系数,它是

(交集大小) / (并集大小)

也就是 (# of shared 1's) / (# of columns where one of the two rows has a 1)。相应的Jaccard距离将是1-Jaccard指数。 还有一个简单匹配系数,它是

(交集大小) / (向量长度)

我相信还有其他针对二进制数据提出的距离度量方法。这确实是一个统计学问题,所以你应该查阅相关主题的书籍。

特别地,在R中,你可以使用dist(x, method="binary"),在这种情况下,我相信使用的是Jaccard指数。然后你可以在你选择的聚类算法(例如hclust)中使用距离矩阵对象dist.obj。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接