社区发现的3个评估指标:标准化互信息NMI,ARI指标,以及模块度(modularity)
转载请注明出处:http://www.cnblogs.com/bethansy/p/6890972.html
一、已知真实社区划分结果
1.NMI指数,互信息和标准化互信息
具体公式和matlab代码参见博客,Python代码参加,C++代码参见
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | function MIhat = nmi( A, B ) %NMI Normalized mutual information % http://en.wikipedia.org/wiki/Mutual_information % http://nlp.stanford.edu/IR-book/html/htmledition/evaluation-of-clustering-1.html % Author: http://www.cnblogs.com/ziqiao/ [2011/12/15] if length ( A ) ~= length ( B) error ( 'length( A ) must == length( B)' ); end if iscolumn(A) A=A'; end if iscolumn(B) B=B'; end total = length (A); A_ids = unique (A); A_class = length (A_ids); B_ids = unique (B); B_class = length (B_ids); % Mutual information idAOccur = double ( repmat ( A, A_class, 1) == repmat ( A_ids', 1, total )); %得到节点社区矩阵N*C idBOccur = double ( repmat ( B, B_class, 1) == repmat ( B_ids', 1, total )); idABOccur = idAOccur * idBOccur'; Px = sum (idAOccur') / total; Py = sum (idBOccur') / total; Pxy = idABOccur / total; MImatrix = Pxy .* log2 (Pxy ./(Px' * Py)+ eps ); MI = sum (MImatrix(:)); % Entropies Hx = - sum (Px .* log2 (Px + eps ),2); Hy = - sum (Py .* log2 (Py + eps ),2); %Normalized Mutual information MIhat = 2 * MI / (Hx+Hy); % MIhat = MI / sqrt(Hx*Hy); another version of NMI end |
重叠社区NMI指数可参照博客
2.ARI指数
文献来源:【2015浙江大学博士】复杂网络节点影响力模型及其应用_王益文
ARI原理介绍,ARI MATLAB代码下载 ,ARI评估指数包含在EDA工具箱中,EDA工具箱介绍
ARI的评估函数在EDA的工具箱中,调用函数甚多,就不贴出来了。自己下载EDA工具箱,放在matlab\toolbox文献夹下,设置完路径即可调用adjrand()
二、不知道真实社区划分情况
1.模块度Q(社区内的边尽可能多,而社区之间的边尽量地少)
Q就是模块度,模块度越大则表明社区划分效果越好。Q值的范围在[-0.5,1),论文表示当Q值在0.3~0.7之间时,说明聚类的效果很好
具体推导流程参见博客,这篇博客推导流程非常详细,而且使用矩阵运算减少了运算复杂度。
代码如下,A是图的邻接矩阵, a是n*1的向量,即每个节点所属社区。例如[1 2 1 1 2],表示节点1、3、4属于社区1,节点2、5属于社区5
1 2 3 4 5 6 7 8 9 10 11 12 | function [Q1]=modul(A,a) one = 1: length (A); a = [one' a]; % 建立节点社区矩阵 a = accumarray (a,1); a = a(:, any (a)); % 删除A中全0的列 % 进行网络A模块度Q1运算 m = sum ( sum (A))/2; k = sum (A,2); B = A - ( repmat (k,[1, size (A,1)]) .* repmat (k',[ size (A,1),1])) / (2*m); Q1 = 1/(2*m) .* trace (a'*B*a); end |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!