簡體   English   中英

R中的簇二元矩陣

[英]Cluster binary matrix in R

我有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

因此,將這些人按他們最常見的愛好聚在一起。 最好的方法是什么?

謝謝

怎么樣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))  

在此處輸入圖片說明

您是否想知道對二進制數據進行聚類的有用的相似度/不相似度度量是什么? Jaccard索引 /系數,即

(交叉點的大小)/(聯合的大小)

aka(共享1的數量)/(兩行之一具有1的列數)。 相應的Jaccard距離將為1-Jaccard索引。 還有一個簡單的匹配系數,即

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

我確定還有其他針對二進制數據的距離指標。 這確實是一個統計問題,因此您應該參考有關該主題的書。

特別是在R中,您可以使用dist(x, method="binary") ,在這種情況下,我相信會使用Jaccard索引。 然后,您可以在選擇聚類算法(例如hclust )時使用距離矩陣對象dist.obj。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM