使用 igraph 在 R 中进行 Louvain 社区检测 - 分配交替的组成员资格分配

2024-03-11

我一直在使用 igraph 在 R 中运行 Louvain 社区检测,感谢我之前查询的这个答案。 https://stackoverflow.com/questions/49834827/louvain-community-detection-in-r-using-igraph-format-of-edges-and-vertices/49842663#49842663然而,我发现cluster_louvain方法似乎在分配组成员身份方面做了一些奇怪的事情,我认为这是由于我导入数据的方式出现错误。虽然我认为我解决了这个问题,但我想了解问题是什么。

我在 400x400 相关矩阵(即 400 个人的相关得分)上运行了 Louvain 聚类。当我最初导入数据时,我的相关矩阵的行标题和列标题具有相同的个人 ID 号(即顶点号),如下所示:

    1     2     3     4   ... 400 
1   0     0.8   0.7   0.1 
2   0.8   0     0.6   0.3
3   0.7   0.6   0     0.9
4   0.1   0.3   0.9   0                    
...
400                          

该相关矩阵保存在“Correlations.csv”文件中,我使用该文件导入read.csv。然后,我使用下面的代码将其转换为距离矩阵,删除低于特定阈值的相关性,将其转换为 igraph 的邻接矩阵,然后运行 ​​cluster_louvain:(答案中也提供了此代码here https://stackoverflow.com/questions/49834827/louvain-community-detection-in-r-using-igraph-format-of-edges-and-vertices/49842663#49842663).

correlationmatrix <- read.csv("Correlations.csv", header = TRUE, 
row.name = 1, check.names = FALSE)

distancematrix <- cor2dist(correlationmatrix)
DM2<- as.matrix(distancematrix)
DM2[correlationmatrix < 0.33] = 0

G2 <- graph.adjacency(DM2, mode = "undirected", weighted = TRUE, diag = TRUE)
clusterlouvain <- cluster_louvain(G2)

sizes(clusterlouvain)
Community sizes
1  2
200 200

然后我想获取每个 ID 号旁边的簇号,以了解哪个个体属于每个社区。在顶点 ID 列表中,它们旁边的成员资格被列为“1 2 1 2 1 2 1 2”,这显然是不正确的(因为我们不希望数据集中的每个替代个体都被分配到不同的社区):

IDs_cluster <- cbind(V(G2)$name, clusterlouvain$membership)
IDs_cluster

ID  Membership
1   1
2   2 
3   1
4   2
5   1
6   2
…
400 2

通过查看其他数据集,我意识到问题可能是因为相关矩阵中的行标题是数字。所以我更改了相关矩阵,使行标题仍然是 ID 号,但列标题是“V1-V400”:

    V1    V2    V3    V4   ... V400 
1   0     0.8   0.7   0.1 
2   0.8   0     0.6   0.3
3   0.7   0.6   0     0.9
4   0.1   0.3   0.9   0                    
...
40

我将其导入为 .csv 文件并重新运行“cluster_louvain”,如下所示:

correlationmatrix_V <- read.csv("Correlations_withV.csv", header = TRUE,
row.name = 1, check.names = FALSE)

distancematrix_V <- cor2dist(correlationmatrix_V)
DM2_V <- as.matrix(distancematrix_V)
DM2_V[correlationmatrix_V < 0.33] = 0

G2_V <- graph.adjacency(DM2_V, mode = "undirected", weighted = TRUE, diag = TRUE)
clusterlouvain_V <- cluster_louvain(G2_V)

现在当我重新运行时cluster_louvain,它生成了三个集群的更合理的结果,每个集群的组成员资格看起来更像我们所期望的:

sizes(clusterlouvain_V)
Community sizes
1     2    3
168 52 180

IDs_cluster <- cbind(V(G2_V)$name, clusterlouvain_V$membership)
View(IDs_cluster)
ID  Membership
1   1
2   1 
3   3
4   2
5   2
6   2
…
400 1

我的问题是:是否可以澄清使用相同的行和列标题时发生的情况,这意味着组成员资格被分配给备用个人(即 ID 列表中的“1 2 1 2”,如第一个示例中所示),但在以下情况下得到解决:将列标题更改为非数字格式(如第二个示例中所示)?

这可能是一个简单的错误,因为当使用“read.csv”导入相关矩阵的 .csv 时,我没有使用正确的设置,因为我的列标题也是数字。

但是,我想了解为什么这意味着“cluster_louvain”以这种方式分配组成员资格。我发布这篇文章是为了如果有人犯了我上面犯的同样的错误,它可能会有用。欢迎任何见解,感谢您的建议!


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 igraph 在 R 中进行 Louvain 社区检测 - 分配交替的组成员资格分配 的相关文章

随机推荐

  • jquery地址怎么用呢?

    我试图了解如何使用 jQuery 地址插件来处理 ajax 的深度链接 但文档非常差 我找不到任何好的教程来解释正在发生的事情 我认为一个好的文档和好的例子对于每个插件都很重要 有人可以解释或提供一些有用的解释链接吗 address cha
  • codeigniter $this->upload->do_upload() = false

    我正在尝试上传文件 我选择一个文件然后提交它 但 this gt upload gt do upload 的结果始终为 false 这是我的表格
  • subprocess.Popen execve() arg 3 包含非字符串值

    我正在尝试通过 shell 运行另一个脚本 该脚本使用一组修改后的环境变量 def cgi call script environ pSCRIPT subprocess Popen script stdout subprocess PIPE
  • 替换失败是否是依赖非类型模板参数的错误?

    假设我有这些模板别名 enum class enabler template
  • “出于安全原因”pcntl 无法在 Ubuntu 上运行

    我已经在 Ubuntu 32 位 12 10 上运行的 PHP 5 4 6 上安装了 pcntl 使用this http www crimulus com 2010 07 30 howto enable pcntl in ubuntu ph
  • 包含声明

    我不明白的重要性CONTAINSFortran 90 中的声明 例如 PROGRAM BLABLA IMPLICIT NONE INTEGER i j k i 1 j 1 k 1 PRINT i j k CALL ABC i j k PRI
  • Gtk-CRITICAL **:IA__gtk_widget_style_get:断言“GTK_IS_WIDGET(小部件)”失败

    在静态构建我的 qt 应用程序之后 configure static debug and release confirm license nomake demos nomake examples nomake tools 它工作正常 但我收
  • 如何使固定大小的主体(或div)始终保持在页面的中心(甚至垂直!)

    我试图使 1024x768 的主体始终保持在页面的中心 上下间距相同 左右间距也相同 但是我在执行此操作时遇到了麻烦 我用的是trick距顶部的间距为 50 然后我将主体 绝对 定位在 384px 即 768 的一半 然而这种方法给我带来了
  • Yii 单选按钮

    我在 Yii 中使用单选按钮 无论我做什么 我都无法获取要发布的所选按钮的值 我确信这只是简单的事情 我没有使用 radioButtonList 因为我希望每个按钮都存在于其自己的 div 中 并在其上方有一个图像 这是我从视图中看到的代码
  • 为什么 Scala 在按名称参数重载时的行为与按值参数重载时的行为不同?

    鉴于以下 Scala 代码 object test def byval a Int println Int def byval a Long println Long def byname a gt Int println gt Int d
  • 为什么 [regex] match() 和 -match 不同?

    当我在 PowerShell 中使用正则表达式时 我偶然发现了一个与 Powershell 不同的奇怪场景 regex 班级匹配 match 在我尝试从字符串中删除空行的情况下 当使用 replace我的表情在与时都不起作用 regex r
  • 如何散列 std::string?

    我正在制作一个小实用程序来帮助我通过重复来记住密码 我想每天只输入一次密码 而不是在每次会话之前输入 当然 我不会存储密码本身 但很乐意存储其哈希值 那么 获取哈希值的最简单方法是什么std string使用 C 标准库 对于不涉及外部库的
  • 多重继承和指针实现

    给出以下代码 namespace Example1 class A public A virtual A private float data A class B public B virtual B protected float dat
  • viewpager和fragment中布局的幽灵

    I use the viewpager and fragment the adapter is FragmentStatePagerAdapter fragment s layout i use is SwipeRefreshLayout
  • 分配器类型参数的 C++ 设计模式

    C 03 标准库在将类型传递给旨在作为分配器的类时使用简单的模板类型参数 这是可能的 因为模板在 C 中的工作方式 但是 它并不是很简单 您可能不知道类型定义到底应该是什么样子 特别是在非标准类型的情况下 我认为使用适配器类可能是个好主意
  • vue动态mapGetters

    我有一个 props 我想用它来制作动态 mapGetters 但是 mapGetters 将 props 视为未定义 可能是因为计算值是在 props 之前加载的 有人知道我怎样才能让它变得动态吗 我的代码如下 export defaul
  • 从 VSCode 中删除 git 集成

    我下载了 Visual Studio Code 来在工作中试用 我几乎爱上了它的一切 但我不喜欢的一部分是 Git 集成 我导入了整个工作文件夹 约 14000 个源文件 git 项目 Visual Studio Code 中的布局和所有内
  • 切换大小写奇怪的范围

    在查看一些第 3 方 C 代码时 我遇到了类似的情况 switch state case 0 if c A open brace code break brace not closed case 1 code break close bra
  • python 中的套接字问题

    我有一个用 C 编写的服务器 我想用 python 编写一个客户端 当 python 客户端想要发送文件时 它会发送一个字符串 send some file 后跟文件的内容和字符串 end some file 这是我的客户端代码 file
  • 使用 igraph 在 R 中进行 Louvain 社区检测 - 分配交替的组成员资格分配

    我一直在使用 igraph 在 R 中运行 Louvain 社区检测 感谢我之前查询的这个答案 https stackoverflow com questions 49834827 louvain community detection i