社区划分的评价标准-模块度原理及代码实现-python3

在社区发现算法中,几乎不可能先确定社区的数目,于是,必须有一种度量的方法,可以在计算的过程中衡量每一个结果是不是相对最佳的结果。

模块度(Modularity)用来衡量一个社区的划分是不是相对比较好的结果。一个相对好的结果在社区内部的节点相似度较高,而在社区外部节点的相似度较低。

全局模块度

设Avw为网络的邻接矩阵的一个元素,定义为:
在这里插入图片描述
假设cv和cw分别表示点v和点w所在的两个社区,社区内部的边数和网络中总边数的比例:
在这里插入图片描述
函数δ(cv,cw)的取值定义为:如果v和w在一个社区,即cv=cw,则为 1,否则为 0。m 为网络中边的总数。

模块度的大小定义为社区内部的总边数和网络中总边数的比例减去一个期望值,该期望值是将网络设定为随机网络时同样的社区分配所形成的社区内部的总边数和网络中总边数的比例的大小,于是模块度Q为:
在这里插入图片描述
其中kv表示点v的度。
在这里插入图片描述
设eij表示社区i和社区j内部边数目的和与总边数的比例,ai表示社区i内部的点所关联的所有的边的数目与总边数的比例。
在这里插入图片描述
在这里插入图片描述
为了简化Q的计算,假设网络已经划分成n个社区,这个时候就有一个 n维矩阵,Q 的计算可以变成:
在这里插入图片描述
在进行每次划分的时候计算Q值,Q取值最大的时候则是此网路较理想的划分。Q值的范围在0-1之间,Q值越大说明网络划分的社区结构准确度越高,在实际的网络分析中,Q值的最高点一般出现在0.3-0.7之间。

局部模块度

有时候,可能不知道全网络的数据,可以用局部社区的局部模块度的方式来检查社区的合理性。假设有一个已经检测出来的社区,社区的节点的集合为V,这些节点所有的邻接节点而加入到集合当中来,形成新的集合V*。定义V的邻接矩阵为:
在这里插入图片描述
于是,和全局模块度相似的是,可以用节点集V
全部属于节点集V中的元素所占的比例的大小来衡量一个社区的好坏:
在这里插入图片描述
其中,δ(i,j)表示的是如果i,j都是V中则值为1,否则为0。m*表示的是邻接矩阵内边的数目。

局部模块度比全局模块度要快的多,因为局部模块度的计算只需要用到局部的网络信息,只需要在刚刚开始的时候扫描一下整个网络。对于中小规模的网络可能局部模块度的效果要低于全局模块度,但是而且对于中等或者大规模的社会网络来说,局部模块度的效果可能还要好一些。

代码

import numpy as np

def node_degree(node,array):
    #计算节点的度数
    degree =sum(array[node])
    return degree

def A(i,j,array):
    #判断两个节点是否存在边
    if array[i,j]==0:
        return 0
    else:
        return 1

def k(i,j,array):
    #计算两个节点的度数积
    kij = node_degree(i,array) *node_degree(j,array)
    return kij

def judge_cluster(i,j,l):
    #判断两个节点是否在一个社区
    if l[i] == l[j]:
        return 1
    else:
        return 0

def Q(array,cluster):
    q =0
    m =sum(sum(array))/2#总边数
    for i in range(array.shape[0]):
        for j in range(array.shape[0]):
            if judge_cluster(i,j,cluster) != 0:
                q +=(A(i,j,array) - (k(i,j,array)/(2*m))) *judge_cluster(i,j,cluster)
    q = q/(2*m)
    return q
if __name__ == '__main__':
    #数据集
    array = np.array([[0, 1, 1],
                      [1, 0, 0],
                      [1, 0, 0]])
    #社区划分
    cluster = [2, 1, 2]
    print(Q(array, cluster))

参考
https://blog.csdn.net/aspirinvagrant/article/details/45577033
https://blog.csdn.net/qq_35440510/article/details/104378110
https://blog.csdn.net/marywbrown/article/details/62059231
http://wap.sciencenet.cn/blog-2358872-950201.html?mobile=1

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STDC是一种基于C语言标准库的模块架构,它的核心思想是将代码按照功能模块划分成多个小模块,每个小模块负责处理一个特定的功能,这些小模块可以独立编译、测试和部署。STDC的模块架构可以让开发者更加高效地组织代码,提高代码的可维护性和可重用性。 下面是一个简单的STDC模块架构的示例: ``` stdc/ ├── include/ │ ├── module1.h │ ├── module2.h │ ├── ... ├── src/ │ ├── module1.c │ ├── module2.c │ ├── ... ├── Makefile ├── README.md ``` 在这个示例中,`include`目录包含了所有模块的头文件,`src`目录包含了所有模块的源代码文件。`Makefile`文件用于编译和链接所有模块代码,生成可执行文件或库文件。 下面是一个简单的STDC模块架构的Python代码实现示例: ``` stdc/ ├── __init__.py ├── module1/ │ ├── __init__.py │ ├── module1.py ├── module2/ │ ├── __init__.py │ ├── module2.py ├── ... ``` 在这个示例中,STDC模块架构被用于Python代码的组织。每个功能模块都被封装在一个独立的目录中,目录下包含了一个`__init__.py`文件和一个或多个Python代码文件。`__init__.py`文件用于定义模块的接口和导出需要暴露的函数和变量。 例如,`module1.py`文件可以定义一个名为`func1`的函数: ```python def func1(): print("This is module1's func1") ``` `__init__.py`文件可以将`func1`函数导出: ```python from .module1 import func1 ``` 这样,在其他Python模块中,可以使用以下语句导入`module1`模块并调用`func1`函数: ```python from stdc.module1 import func1 func1() ``` 总的来说,STDC模块架构的原理是将代码按照功能模块划分成多个小模块,每个小模块负责处理一个特定的功能,这些小模块可以独立编译、测试和部署。在Python中,可以通过创建独立的目录和`__init__.py`文件来实现STDC模块架构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值