我有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
因此,通过他们最常见的爱好将这些人聚集在一起。这样做的最佳方法是什么?
由于
答案 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))
答案 1 :(得分:0)
您是否想知道用于聚类二进制数据的有用相似性/相异性指标是什么?有Jaccard index /系数,即
(交叉的大小)/(联合的大小)
a.k.a。 (共享1的#)/(两行中的一行具有1的列的数量)。相应的Jaccard距离为1 - Jaccard指数。 还有简单的匹配系数,即
(交叉的大小)/(向量的长度)
我确信为二进制数据提出了其他距离指标。这确实是一个统计问题,所以你应该查阅一本关于这个主题的书。
在R中,您可以使用dist(x, method="binary")
,在这种情况下,我相信使用Jaccard索引。然后在选择聚类算法时使用距离矩阵对象dist.obj(例如hclust
)。