目前使用的主要有:Q(Modulartiy),Jaccard指数与Fsame值,NMI也是常用指标。
c语言实现:
//当i和J属于同一个社团时,E函数等于l,否则等于0. 故只需计算同一社区的函数值
double Modulartiy(int * cluster_assignment, int ** M, int vertices)
{
int i, j, k;
int maxlable = cluster_assignment[0]; //最大标号
for (i = 1; i < vertices; i++)
{
if (maxlable < cluster_assignment[i])
maxlable = cluster_assignment[i];
}
int TotalLinks; //总边数 (m)
TotalLinks= SumSumMartex(M, vertices, vertices)/2;
double Q = 0; //Q函数
vector <int> index;
for (i = 1; i <= maxlable; i++)
{
FindIndexInVector(cluster_assignment, index, vertices, i);
unsigned len = index.size();
double li = 0;
//社区内部边的边数 (I)
for (j = 0; j < len; j++)
for (k = 0; k < len; k++)
li += M[index[j]][index[k]];
li = li / 2;
//社区内所有顶点的度之和 (D)
double di = 0;
for (j = 0; j < len; j++)
for (k = 0; k < vertices; k++)
di = di + M[index[j]][k];
Q = Q + (li - (di * di) /(TotalLinks*4) );
index.clear();
}
Q = Q / TotalLinks;
return Q ;
}
/************找出两种分类结果中相同标签的元素个数**********/
double FindjaccardIndex(int* A, int* B, int vertices)
{
int a,b,c;
a=0; b=0; c=0;
for(int i=0; i<vertices; i++)
{
for(int j=0; j<vertices; j++)
{
if((A[i]==A[j])&&(B[i]==B[j])) a++;
if((A[i]==A[j])&&(B[i]!=B[j])) b++;
if((A[i]!=A[j])&&(B[i]==B[j])) c++;
}
}
return a/(double)(a+b+c);
}
/********************计算两种分区结果的Fsame值***************/
double FsameIndex(int*A, int*B, int As,