- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个大约 100 个 igraph 对象的列表,其中一个典型的对象有大约 700 个顶点和 3500 个边。
我想确定更可能存在联系的顶点组。我的计划是然后使用混合模型来预测使用顶点和组属性的组内连接顶点的数量。
有些人可能想回应我项目的其他方面,这会很棒,但我最感兴趣的是有关 igraph 中用于对顶点进行分组的函数的信息。我遇到过这些 community detection algorithms但我不确定它们的优缺点,或者其他一些功能是否更适合我的情况。我看到了链接 here同样,但它们并非特定于 igraph。谢谢你的建议。
最佳答案
以下是有关当前在 igraph 中实现的社区检测算法的简短摘要:
edge.betweenness.community
是一个分层分解过程,其中边按照边介数分数(即通过给定边的最短路径的数量)的降序删除。这是因为连接不同组的边更有可能包含在多个最短路径中,因为在许多情况下,它们是从一组到另一组的唯一选择。这种方法产生了良好的结果,但由于边缘介数计算的计算复杂性以及每次边缘去除后必须重新计算介数分数,因此速度非常慢。具有 ~700 个顶点和 ~3500 个边的图形大约是使用这种方法进行分析的可行图形的大小上限。另一个缺点是edge.betweenness.community
构建一个完整的树状图,并没有给你任何关于在哪里切割树状图以获得最终组的指导,所以你必须使用其他一些度量来决定(例如,每个级别的分区的模块化分数树状图)。 fastgreedy.community
是另一种分层方法,但它是自底向上而不是自顶向下。它试图以贪婪的方式优化称为模块化的质量函数。最初,每个顶点都属于一个单独的社区,社区被迭代合并,这样每次合并都是局部最优的(即产生最大的模块化当前值增加)。当无法再增加模块性时,算法就会停止,因此它会为您提供分组和树状图。该方法速度很快,并且通常作为第一近似尝试使用该方法,因为它没有要调整的参数。但是,已知存在分辨率限制,即低于给定大小阈值的社区(如果我没记错的话,取决于节点和边的数量)将始终与相邻社区合并。 walktrap.community
是一种基于随机游走的方法。一般的想法是,如果您在图上执行随机游走,那么游走更有可能留在同一个社区内,因为只有少数边缘通向给定社区之外。 Walktrap 运行 3-4-5 步的短随机游走(取决于其参数之一),并使用这些随机游走的结果以自下而上的方式合并不同的社区,如 fastgreedy.community
.同样,您可以使用模块化分数来选择切割树状图的位置。它比快速贪婪方法慢一点,但也更准确(根据原始出版物)。 spinglass.community
是统计物理学的一种方法,基于所谓的 Potts 模型。在这个模型中,每个粒子(即顶点)可以处于 c 个自旋状态之一,粒子之间的相互作用(即图的边缘)指定哪些顶点对更愿意保持相同的自旋状态,哪些顶点对更愿意保持自旋状态。更喜欢有不同的自旋状态。然后针对给定数量的步骤对模型进行模拟,最终粒子的自旋状态定义了社区。后果如下: 1)最终永远不会超过c个社区,尽管您可以将c设置为高达200,这可能足以满足您的目的。 2) 最终可能会少于 c 个社区,因为一些自旋状态可能会变空。 3) 不能保证网络中完全远程(或断开连接)部分的节点具有不同的自旋状态。这更可能是断开连接图的问题,所以我不会担心。该方法不是特别快,也不是确定性的(因为模拟本身),但具有确定簇大小的可调分辨率参数。 Spinglass 方法的一个变体也可以考虑负链接(即端点更喜欢在不同社区中的链接)。 leading.eigenvector.community
是一种自顶向下的分层方法,再次优化了模块化功能。在每一步中,图被分成两部分,分离本身会显着增加模块性。 split 是通过评估所谓的模块化矩阵的前导特征向量来确定的,还有一个停止条件可以防止紧密连接的组进一步 split 。由于涉及到特征向量计算,它可能不适用于 ARPACK 特征向量求解器不稳定的退化图。在非退化图上,它可能比快速贪婪方法产生更高的模块化分数,尽管它有点慢。 label.propagation.community
是一种简单的方法,其中每个节点都被分配了 k 个标签之一。然后,该方法迭代地进行,并以每个节点以同步方式获取其邻居的最频繁标签的方式为节点重新分配标签。当每个节点的标签是其邻域中最常见的标签之一时,该方法停止。它非常快,但会根据初始配置(随机决定)产生不同的结果,因此应该多次运行该方法(例如,对于图 1000 次),然后建立一个共识标签,这可能是乏味。 fastgreedy.community
或
walktrap.community
作为第一个近似值,然后在结果证明这两种方法由于某种原因不适用于特定问题时评估其他方法。
关于r - igraph中的社区检测算法有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9471906/
滑动窗口限流 滑动窗口限流是一种常用的限流算法,通过维护一个固定大小的窗口,在单位时间内允许通过的请求次数不超过设定的阈值。具体来说,滑动窗口限流算法通常包括以下几个步骤: 初始化:设置窗口
表达式求值:一个只有+,-,*,/的表达式,没有括号 一种神奇的做法:使用数组存储数字和运算符,先把优先级别高的乘法和除法计算出来,再计算加法和减法 int GetVal(string s){
【算法】前缀和 题目 先来看一道题目:(前缀和模板题) 已知一个数组A[],现在想要求出其中一些数字的和。 输入格式: 先是整数N,M,表示一共有N个数字,有M组询问 接下来有N个数,表示A[1]..
1.前序遍历 根-左-右的顺序遍历,可以使用递归 void preOrder(Node *u){ if(u==NULL)return; printf("%d ",u->val);
先看题目 物品不能分隔,必须全部取走或者留下,因此称为01背包 (只有不取和取两种状态) 看第一个样例 我们需要把4个物品装入一个容量为10的背包 我们可以简化问题,从小到大入手分析 weightva
我最近在一次采访中遇到了这个问题: 给出以下矩阵: [[ R R R R R R], [ R B B B R R], [ B R R R B B], [ R B R R R R]] 找出是否有任
我正在尝试通过 C++ 算法从我的 outlook 帐户发送一封电子邮件,该帐户已经打开并记录,但真的不知道从哪里开始(对于 outlook-c++ 集成),谷歌也没有帮我这么多。任何提示将不胜感激。
我发现自己像这样编写了一个手工制作的 while 循环: std::list foo; // In my case, map, but list is simpler auto currentPoin
我有用于检测正方形的 opencv 代码。现在我想在检测正方形后,代码运行另一个命令。 代码如下: #include "cv.h" #include "cxcore.h" #include "high
我正在尝试模拟一个 matlab 函数“imfill”来填充二进制图像(1 和 0 的二维矩阵)。 我想在矩阵中指定一个起点,并像 imfill 的 4 连接版本那样进行洪水填充。 这是否已经存在于
我正在阅读 Robert Sedgewick 的《C++ 算法》。 Basic recurrences section it was mentioned as 这种循环出现在循环输入以消除一个项目的递
我正在思考如何在我的日历中生成代表任务的数据结构(仅供我个人使用)。我有来自 DBMS 的按日期排序的任务记录,如下所示: 买牛奶(18.1.2013) 任务日期 (2013-01-15) 任务标签(
输入一个未排序的整数数组A[1..n]只有 O(d) :(d int) 计算每个元素在单次迭代中出现在列表中的次数。 map 是balanced Binary Search Tree基于确保 O(nl
我遇到了一个问题,但我仍然不知道如何解决。我想出了如何用蛮力的方式来做到这一点,但是当有成千上万的元素时它就不起作用了。 Problem: Say you are given the followin
我有一个列表列表。 L1= [[...][...][.......].......]如果我在展平列表后获取所有元素并从中提取唯一值,那么我会得到一个列表 L2。我有另一个列表 L3,它是 L2 的某个
我们得到二维矩阵数组(假设长度为 i 和宽度为 j)和整数 k我们必须找到包含这个或更大总和的最小矩形的大小F.e k=7 4 1 1 1 1 1 4 4 Anwser是2,因为4+4=8 >= 7,
我实行 3 类倒制,每周换类。顺序为早类 (m)、晚类 (n) 和下午类 (a)。我固定的订单,即它永远不会改变,即使那个星期不工作也是如此。 我创建了一个函数来获取 ISO 周数。当我给它一个日期时
假设我们有一个输入,它是一个元素列表: {a, b, c, d, e, f} 还有不同的集合,可能包含这些元素的任意组合,也可能包含不在输入列表中的其他元素: A:{e,f} B:{d,f,a} C:
我有一个子集算法,可以找到给定集合的所有子集。原始集合的问题在于它是一个不断增长的集合,如果向其中添加元素,我需要再次重新计算它的子集。 有没有一种方法可以优化子集算法,该算法可以从最后一个计算点重新
我有一个包含 100 万个符号及其预期频率的表格。 我想通过为每个符号分配一个唯一(且前缀唯一)的可变长度位串来压缩这些符号的序列,然后将它们连接在一起以表示序列。 我想分配这些位串,以使编码序列的预
我是一名优秀的程序员,十分优秀!