一、社区的定义

Newman第一次提出模块度定义就是在2004年发表的这篇文章“fast algorithm for community structure in networks”,第一次用量化的公式来确定社区划分。

首先,我们来看Newman如何定义社区的:the vertices in networks are often found to cluster into tightly knit groups with a high density of within-group edges and a lower density of between -group edges。

用大白话说就是:社区内部的边尽可能地多,但是社区之间的边尽可能地少

(一些定义):i、j指社区i和社区j;

n是网络中节点的数量;

m是网络中边的数量。一条边上连接两个节点,和明显,2m即网络中所有节点度之和

二、如何量化到模快度?

我们先用eij表示社区i和社区j之间连接的边的数量比整个网络边的数量,eii表示社区i内部边的数量比整个网络边的数量,既然这样的话我们只要使∑ieii尽可能大就好了,但是问题又来了,最大肯定就是1咯,所有节点归为一个社区,那这样很明显就没有意义了。

于是他有提出,网络中连接两个同种类型的边(即社区内部的边的比例eii)减去在相同结构下任意连接这两个节点边的比例的期望,于是模块度登场

Q=∑i(eii-ai2)

其中,ai=∑jeij  表示与社区i中节点相连的边占所有边的比例。如果社团内部边的比例不大于社团内部边随机连接的期望,那么Q=0,最大时为1。一般来说,Q值最大对应的社团结构就是网络中的社团结构

三、如何变成算法可操作性?

意思来了,我们只要优化Q就好了,但是如何把n个节点划分多少个社区?每个社区多少个节点?作者指出有2n-1种可能,这样的话根本无法将Q推广在高于20节点以上的网络?为了减少时间复杂度,作者提出一种贪婪策略

FN:(1)首先将网络中每个节点自定义成一个社区

(2)计算出两两社区结合是Q的值,找到Q增加最大的或者减少最少的合并方式进行社区合并

(3)直到所有社区合并成一个大社区时停止,找出合并过程中最大的Q是的社区划分结果

这个时候,Newman有注意到,当两个社区合并时,模块度的增量detaQ=(eji+eij-2ai*aj)=2(eij-2ai*aj)

四、代码来了

clear all
close all
clc % load preprocess.mat
% E=e;
load('dolphin.mat');
E=A;
% E(find(E>0))=1;%建立邻接矩阵
tic;
e=E;
e(e==1)=1/sum(E(:));
a=sum(e);
n=size(A,2);
b=[1:n];
b=num2cell(b);%用来存储社团元素的变量
c={};
k=1;
while length(e)>1
lg=length(e);
detaQ=-(10^9)*ones(n-k+1);%△Q
for i=1:lg-1
for j=i+1:lg
if e(i,j)~=0
detaQ(i,j)=2*(e(i,j)-a(i)*a(j));%计算△Q
end
end
end
if sum(detaQ+(10^9))==0
break
end
% Q(k)=max(detaQ(:));%寻找△Q的最大值,并把它存储进Q(k)矩阵
%-----------------------------寻找最大△Q对应的两个社团,并将其合并,并改变e矩阵
[I,J]=find(detaQ==max(detaQ(:))); for ii=1:length(I)
e(J(ii),:)=e(I(ii),:)+e(J(ii),:);
e(I(ii),:)=0;
e(:,J(ii))=e(:,I(ii))+e(:,J(ii));
e(:,I(ii))=0; % e(I,I)=e(I,I)/2;
%—————————记录△Q最大所对应的社团以及各社团中的元素 b{J(ii)}=[b{I(ii)} b{J(ii)}];
b{I(ii)}=0;
end e(I,:)=[];
e(:,I)=[];
b(I)=[];
c(k,:)=num2cell(zeros(1,n));
c(k,1:length(b))=b;
for kk=1:length(b)
c2=cell2mat(c(k,kk));
c2(c2==0)=[];
c{k,kk}=c2;
c2=[];
end
a=sum(e);
k=k+1;
tmp=0;
for jj=1:length(e)
tmp=tmp+(e(jj,jj)-a(jj)*a(jj));
end
Q(k)=tmp;
end
max_k=find(Q==max(Q(:)))-1; ll=0;
for i=1:length(c(max_k,:))
if sum(c{max_k,i})~=0
ll=ll+1;
c{max_k,i}=c{max_k,i}(c{max_k,i}~=0);
end
end
c_newman=c(max_k,1:ll);
label=zeros(n,1);
for i=1:ll
label(c{max_k,i}')=i;
end

  

Fast Newman-FN算法以及模块度定义介绍的更多相关文章

  1. 数据结构与算法 java描述 第一章 算法及其复杂度

    目录 数据结构与算法 java描述 笔记 第一章 算法及其复杂度 算法的定义 算法性能的分析与评价 问题规模.运行时间及时间复杂度 渐进复杂度 大 O 记号 大Ω记号 Θ记号 空间复杂度 算法复杂度及 ...

  2. C#开发微信门户及应用(43)--微信各个项目模块的定义和相互关系

    我们在开发微信相关的应用的时候,一般需要完善的基础模块支持,包括微信公众号,微信企业号,以及一些业务模块的支持,一般随着功能的增多,我们需要非常清晰的界定他们的关系.模块的分拆以及合并往往需要考虑的代 ...

  3. RequireJS 模块的定义与加载

    模块不同于传统的脚本文件,它良好地定义了一个作用域来避免全局名称空间污染.它可以显式地列出其依赖关系,并以函数(定义此模块的那个函数)参数的形式将这些依赖进行注入,而无需引用全局变量.RequireJ ...

  4. 使用AndroidStudio编写APICloud模块需要注意的地方,解决模块未定义。

    在新的版本下,使用AndroidStudio编写APICloud模块,已经非常简单了,解决模块未定义,最重要的就是要先看官方的视频! 注意在模块的module.json中name很重要,建议做到三统一 ...

  5. barnes-hut算法 && Fast Multipole Methods算法

    barnes-hut算法 http://arborjs.org/docs/barnes-hut Fast Multipole Methods算法 http://www.umiacs.umd.edu/~ ...

  6. 重拾算法之复杂度分析(大O表示法)

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  7. Python_模块的定义与使用

    1.模块的定义: 1.1 标准格式: import 模块名 模块名.函数名(实参列表) 1.2 特殊格式: from 模块名 import 函数名1,函数名2... 函数名(实参列表) 2.模块的使用 ...

  8. Python排序算法之选择排序定义与用法示例

    Python排序算法之选择排序定义与用法示例 这篇文章主要介绍了Python排序算法之选择排序定义与用法,简单描述了选择排序的功能.原理,并结合实例形式分析了Python定义与使用选择排序的相关操作技 ...

  9. WEB开发性能优化--核心定义介绍篇(1)

    推荐理由 随着 互联网的蓬勃发展,并且伴随着产品功能的越来越复杂,对于技术人员来说最大的挑战就是如何在保证业务快速发展的同时,也可保证不断复杂的业务对用户体验的影响,其中对用户来说最重要的体验指标是如 ...

随机推荐

  1. 2018.09.26 bzoj5218: [Lydsy2017省队十连测]友好城市(回滚莫队)

    传送门 比较简单的一道回滚莫队吧. 每次询问用bitset优化kosaraju统计答案. 就是有点难调. 然后向dzyo学长学习了回滚莫队的一种简洁的实现方式,就是直接建立一个sqrt(m)∗sqrt ...

  2. 2018.09.02 bzoj1003: [ZJOI2006]物流运输(dp+最短路转移)

    传送门 dp好题. 每一天要变更路线一定还是走最短路. 所以l~r天不变更路线的最优方案就是把l~r天所有不能走的点都删掉再求最短路.显然是可以dp的. 设f[i]表示第i天的最优花销.那么我们枚举在 ...

  3. 8.7 使用索引-notes

    七 正确使用索引 一 索引未命中 并不是说我们创建了索引就一定会加快查询速度,若想利用索引达到预想的提高查询速度的效果,我们在添加索引时,必须遵循以下问题 1 范围问题,或者说条件不明确,条件中出现这 ...

  4. python3.4用循环往mysql5.7中写数据并输出

    #!/usr/bin/env python # -*- coding:utf-8 -*- # __author__ = "blzhu" """ pyt ...

  5. struts2-core-2.3.20.jar

    核心配置位于该jar struts-default.xml struts-2.3.dtd <?xml version="1.0" encoding="UTF-8&q ...

  6. hdu 4888 最大流慢板

    http://acm.hdu.edu.cn/showproblem.php?pid=4888 添加一个源点与汇点,建图如下: 1. 源点 -> 每一行对应的点,流量限制为该行的和 2. 每一行对 ...

  7. log4j自动加载原理

    java虚拟机加载log4j的类(LogManager.class)后,执行静态代码块,这个类中的静态代码块,会load log4j的配置文件,依次加载log4j.xml,log4j.properti ...

  8. Redis之序列化POJO

    redis存储方式有很多种,但是我个人觉得最好用的并非是String存储类型,而是Hash存储类型,如果在使用redis的时候单纯的只使用到String存储类型的话,我个人觉得完全体现不了redis的 ...

  9. 在EBS里新建一个OU的步骤

    http://blog.csdn.net/kevingao/archive/2010/09/11/5877092.aspx 在EBS里新建一个OU的步骤1. 建立OU组织,关联SOB,LE2. 系统管 ...

  10. vux 入门备忘大佬多指点

    一.安装node.js https://nodejs.org/en/ 这样就可以使用npm喽 二.安装vux 安装vux npm install vux --save 安装vux-loader npm ...