在R'中构建社区检测数据;s曲线图
我不熟悉igraph和社交网络分析,但不熟悉R 我正在努力为社区检测正确构建数据集,但已成功使用iGraph生成共现矩阵。我接下来要做的是在同一个数据集上使用社区检测算法来创建一个显示集群的图 如何执行此操作的示例代码如下所示:在R'中构建社区检测数据;s曲线图,r,igraph,R,Igraph,我不熟悉igraph和社交网络分析,但不熟悉R 我正在努力为社区检测正确构建数据集,但已成功使用iGraph生成共现矩阵。我接下来要做的是在同一个数据集上使用社区检测算法来创建一个显示集群的图 如何执行此操作的示例代码如下所示: df1 <- graph.famous("Zachary") df2 <- walktrap.community(df1) #any algorithm plot.communities(df2, df) 我试图在我所研究的人群中找到重叠的兴趣群,因此ID
df1 <- graph.famous("Zachary")
df2 <- walktrap.community(df1) #any algorithm
plot.communities(df2, df)
我试图在我所研究的人群中找到重叠的兴趣群,因此ID
是一个人,兴趣
是这个人的兴趣,评论
是他们表现出兴趣的次数的索引。这有用吗
我已经尝试在这个数据集上运行社区算法(例如,
df2一个图不允许你对个体进行聚类,而只允许你找出哪些变量是相关的。不过,如果你想从你的数据中构建一个图,你必须这样做。(请注意,我已将您的示例数据保存为.csv文件,并将其上载到dropbox,以创建易于复制的示例)
首先,您需要创建一个矩阵,其中每个特征一行一列:
matrix=matrix
rownames(matrix)=unique(test[,1])
colnames(matrix)=unique(test[,2])
如果单元格的值与利益的强度相对应:
for (i in 1:nrow(matrix)){
temp=test[test[,1]==i,][,2:3]
for (j in 1:ncol(matrix)){
matrix[i,j]=sum(temp[temp[,1]==colnames(matrix)[j],2]) # sum is used because of duplicates
}
}
你得到的是:
> matrix
comedy electronic gaming pop ent
1 2 11 14 1 1
2 14 0 45 1 26
3 8 0 10 0 4
4 0 1 9 2 0
5 0 0 1 2 1
6 0 0 12 0 0
然后,您可以从中创建一个邻接矩阵:
x=t(matrix)%*%matrix
你得到的是:
> x
comedy electronic gaming pop ent
comedy 264 22 738 16 398
electronic 22 122 163 13 11
gaming 738 163 2547 79 1225
pop 16 13 79 10 29
ent 398 11 1225 29 694
从中构建图形很容易:
g=graph.adjacency(x,weighted=T,mode="undirected",diag=FALSE)
g=simplify(g)
您可以将任何社区检测算法应用于对象g
,例如:
spinglass.community(g,weight=E(g)$weight)
如果您想对个体而不是变量进行聚类,我会研究PCA和层次聚类(例如,请参阅FactoMineR包中的优秀函数)。在这种情况下,您将使用上面的对象矩阵(无需计算邻接矩阵).图形由节点和边组成。数据集中的哪些节点与节点相关,您如何知道哪些节点是连接的?对于Zarchary数据,它可以由邻接矩阵(get.adjacy(df1)
)或边列表(get.edgelist(df1)
)@MrFlick表示。节点是“兴趣”列中的值--即喜剧、游戏等。我试图在我所研究的人群中找到重叠的兴趣群,因此ID是个人,兴趣是个人的兴趣,以及“评论”是他们显示兴趣的次数的索引。这有帮助吗?这是有意义的,但这仍然不能很好地转化为图形语言。因此,您希望每个兴趣都是一个节点,然后如果用户共享这两个兴趣,您希望节点之间有一条边?我不确定您将如何处理“注释”列,因为这似乎不起作用t以及节点或边权重。我仍然很难看到这些数据如何以图形形式表示。@MrFlick我可能没有准确沟通……我的最终目标是找到具有兴趣组合的独特人群。因此,可能有一群人喜欢“游戏和娱乐”,这可能与喜欢“游戏和喜剧”的人有关(但不同)。这些“评论”是为了提供一个相对的兴趣权重(并用于共现分析)但是我真的只是想通过一种建议的聚类方法来蒙混过关…@roody如果你觉得我的答案很有帮助或者回答了你的问题,请投票/接受。否则,请不要犹豫发表评论以澄清。你能解释一下矩阵x中的数字代表什么吗,这是交叉预测的结果ct请。@user20650请查看图形的文档。邻接
函数:感谢您的回答。要进一步回答我的问题,例如,在x
的喜剧/喜剧
元素中,264
与什么有关?我看不出这与原始数据有什么关系(我知道我一直很慢)顺便说一句,我知道你试图形成一个加权邻接矩阵。@user20650这些值本身没有任何物理意义,它们只是有意义的权重,因为它们允许比较,而且,矩阵是对称的,我们不关心对角线。这些值表示两个值之间共现的强度变量。例如,电子和游戏的联合出现频率(163)远高于电子和喜剧(22)。在创建加权图时,这些数字将决定边缘的“厚度”。@user20650注意,我更正了一个打字错误:x=t(matrix)%*%matrix
而不是x=t(x)%*%x
g=graph.adjacency(x,weighted=T,mode="undirected",diag=FALSE)
g=simplify(g)
spinglass.community(g,weight=E(g)$weight)