我正在寻找社区检测算法的实现,例如Girvan-Newman算法(2002).我访问了该领域的几位研究人员的网站(Newman,Santo等)但无法找到任何代码.我想有人在那里发布了这些算法的实现(甚至可能是一个工具包?),但我似乎无法找到它.
还有就是在现有的igraph社区检测算法的比较优秀这里.然而,在算法中使用加权边缘可以应用权重存在一些模糊性.
通常,边缘权重将被定向,使得较高权重建议将节点保持在一起(例如,友谊的强度).通过比较内部和外部的平均加权密度,这与模块化分数很好地协作.
然而,Newman-Girvan社区检测算法使用基于距离的中间性.在这种情况下,我希望边权重应该反映节点之间的距离,以便计算最短路径对路径上的权重求和.也就是说,权重是成本或距离得分,其中较高的值应该分成不同的社区.
在使用Newman-Girvan时,我是否正确期望更高的权重,如果是这样,那么如何通过使用模块化来决定在哪里削减社区数量?
我有如下所示的数据:https : //imgur.com/a/1hOsFpF
第一个数据集是标准格式数据集,其中包含人员及其财务属性的列表。
第二个数据集包含这些人之间的“关系”——他们互相支付了多少,以及他们彼此欠了多少。
我有兴趣了解更多关于网络和基于图的聚类 - 但我试图更好地了解什么类型的情况需要基于网络的聚类,即我不想在不需要的地方使用图聚类(避免“方钉圆孔"类型情况)。
使用 R,首先我创建了一些假数据:
library(corrr)
library(dplyr)
library(igraph)
library(visNetwork)
library(stats)
# create first data set
Personal_Information <- data.frame(
"name" = c("John", "Jack", "Jason", "Jim", "Julian", "Jack", "Jake", "Joseph"),
"age" = c("41","33","24","66","21","66","29", "50"),
"salary" = c("50000","20000","18000","66000","77000","0","55000","40000"),
"debt" = c("10000","5000","4000","0","20000","5000","0","1000"
)
Personal_Information$age = as.numeric(Personal_Information$age)
Personal_Information$salary = as.numeric(Personal_Information$salary)
Personal_Information$debt = as.numeric(Personal_Information$debt)
create second data set
Relationship_Information <-data.frame(
"name_a" = c("John","John","John","Jack","Jack","Jack","Jason","Jason","Jim","Jim","Jim","Julian","Jake","Joseph","Joseph"),
"name_b" = c("Jack", "Jason", "Joseph", "John", "Julian","Jim","Jim", "Joseph", "Jack", "Julian", "John", "Joseph", "John", "Jim", "John"),
"how_much_they_owe_each_other" = …Run Code Online (Sandbox Code Playgroud)