LPA算法与模块度

LPA算法与模块度

    • 1.算法描述
    • 2.伪代码
    • 3.模块度计算
    • 4.代码
    • 5.相似度指标
    • 6.改进思路

1.算法描述

给每个节点添加标签,初始以每个节点的id作为标签,标签传播过程中将每个节点的邻居节点的
标签中数量最多的标签作为该节点的标签。标签就代表该节点所属社区。

  • 1 以节点id初始化标签
  • 2 遍历每个节点,使用其邻居节点的标签中数量最多的标签更新其自身标签。
  • 3 反复执行步骤2,直到满足终止条件。

关于终止条件

  • 1 直接设置迭代次数
  • 2 根据模块度的增加程度设定
  • 3 每个节点的标签不再变化
  • 4 其他

2.伪代码

中文:

输入:网络G=(V,E)具有|V|=n个节点和|E|=m条边,最大迭代次数maxt
输出:社团发现划分结果C={C1,C2,...Ck},k为社团数量
for each i in V
i.label = i
//每个节点分配唯一的标签
while 不满足终止条件
	g.labeled();
	t = t + 1;

3.模块度计算

模块度(Q,Modularity)是一种常用的衡量社团划分质量的标准。

常用的计算模块度的公式为:

Q = ∑ v = 1 k [ l v M − ( d v 2 M ) 2 ] Q=\sum\limits_{v=1}^k[\frac{l_v}{M}-(\frac{d_v}{2M})^2] Q=v=1k[Mlv(2Mdv)2]

其中,lv是社团v内部所包含的边数,dv是社团v中所有节点的度值之和,Mv是网络的边数。

4.代码

#include "lpa.h"

using namespace std;


void display_time(const char *str){
	time_t rawtime;
	time ( &rawtime );
	cerr << str << " : " << ctime (&rawtime);
}

int main(int argc, char **argv){
	srand(time(NULL));

	//parse_args(argc, argv);
	if(argc != 2){
		cerr << "argc not 2" << endl;
	}
	string filename = argv[1];
	cout << "filename = " << filename << endl;
	
	time_t time_begin, time_end;
	time(&time_begin);
	display_time("start");

	//sleep(3);
	LPA lpa(filename);
	int maxn = 10;//最大迭代次数
	double modu = lpa.modularity();
	double maxQ = modu;
	cout << "初始模块度 = " << modu << endl;
	do {
		lpa.labeled();
		lpa.display();
		modu = lpa.modularity();
		if(maxQ < modu){
			maxQ = modu;
			lpa.getmaxComms();
		}
		maxn--;
		cout << "迭代次数:" << 10-maxn << endl;
	}while(modu - lpa.modularity() < 0.1 && maxn > 0);//需要保存上一次迭代的结果

	//打印最后结果
	lpa.displayResult();
	cout << "迭代次数:" << 10-maxn << endl;

	display_time("end");

	time(&time_end);
	return 0;
}

5.相似度指标

6.改进思路

你可能感兴趣的:(community,detection,标签传播)