系列文章目录

文章目录

  • 系列文章目录
  • 参考
  • 背景
  • 实现与改进
    • 传统实现方法
    • 改进方法
    • 代码实现
    • 数据集格式

参考

  • 论文Visualizing complex networks by leveraging community structures

背景

力导向图非常适合于渲染关系型信息图,其主要思想是将关系图的节点视为电荷、连边视作弹簧,在多次动态更新之后节点的位置将最终趋向于稳定状态。
对适用于一般网状结构数据绘图的算法来说,力导向算法是一种常被应用的方法。通过对每个节点的计算,算出引力和排斥力综合的合力,再由此合力来移动节点的位置。执行一次后根据节点新位置算出新的能量值,如同力学概念,能量值越小,表示整个网络越趋于稳定。一般来说能量值越小,网络图的配置显示就会越清晰,因此当能量值到达最小值的时候,网状图的配置状态就是我们想要的结果。

实现与改进

传统实现方法

  1. 随机生成节点位置
  2. 迭代循环调整点的位置
    • 点与点之间均存在斥力
    • 有连边的节点直接存在引力
    • 引力和斥力产生合力改变节点位置

利用上述方法对有社区结构的网络图进行可视化,最终得到以下效果(这里就画出了节点位置,没有画出连边):
可以看到映射的节点对应的社区结构并不明显。

改进方法

为了体现出社区中节点的关联性,我们将节点间的作用力中的引力做以下修改:
将原来的有连边的节点直接存在引力修改为以下四级:无边相连且不在同一簇 < 有边相连但是不是同一簇的 < 同一簇但无边相连 < 有边相连且是同一簇的。这样子的布局既保证了社区内节点的关联性,也保证了社区间节点的关系。
最终得到的可视化效果:
只有节点位置映射的

加上连边的

代码实现

核心代码

import json
from turtle import position
import numpy as np
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
from tools import readGraphData, getClusterLabels, drawNodesMapdef sparse_fruchterman_reingold(A, k=None, pos=None, fixed=None, iterations=500, threshold=1e-5, dim=2):# np.random.seed(1)nodes_num = A.shape[0]pos = np.asarray(np.random.rand(nodes_num, dim), dtype=A.dtype)if fixed is None:fixed = []if k is None:k = np.sqrt(1.0 / nodes_num) * 60.0   ## k作为斥力的系数t = max(max(pos.T[0]) - min(pos.T[0]), max(pos.T[1]) - min(pos.T[1])) * 0.1dt = t / float(iterations + 1)displacement = np.zeros((dim, nodes_num))for iteration in range(iterations):displacement *= 0for i in range(A.shape[0]):if i in fixed:continuedelta = (pos[i] - pos).Tdistance = np.sqrt((delta ** 2).sum(axis=0))distance = np.where(distance < 0.001, 0.001, distance)Ai = A[i,:]   ## 相当于与每个节点的弹簧的吸引力displacement[:, i] += \(delta * (k * k / distance ** 2 - Ai * distance / k)).sum(axis=1)length = np.sqrt((displacement ** 2).sum(axis=0))length = np.where(length < 0.01, 0.1, length)delta_pos = (displacement * t / length).Tpos += delta_pos# cool temperaturet -= dterr = np.linalg.norm(delta_pos) / nodes_numif err < threshold:breakreturn posclass ClusterNodesLayout(object):"""## 用于布局聚类后的网络图```整体思想为:使用力导向图算法,计算每个节点的位置斥力: 所有节点间都有引力:无边相连且不在同一簇 < 有边相连但是不是同一簇的 < 同一簇但无边相连 < 有边相连且是同一簇的```"""def __init__(self, graph, label2nodesArr) -> None:"""## 初始化:param graph: 网络图:param label2nodesArr: 聚类后的节点到簇的映射 -> {label:[node1, node2, ...], ...}"""self.graph = graphself.label2nodesArr = label2nodesArrself.__initNodesMatrix()self.__initNodesLabels()def __call__(self, iterations=300):springMatrix = self.SpringLink()self.nodesPosition = sparse_fruchterman_reingold(springMatrix, iterations=iterations)nodesPositionInfo = self.getNodesPositionInfo()return nodesPositionInfodef __initNodesLabels(self):"""## 初始化节点到簇的映射"""nodes = self.nodeslabel2nodesArr = self.label2nodesArrif isinstance(label2nodesArr, dict):node2label = {node:idx for idx, nodeItems in enumerate(label2nodesArr.values()) for node in nodeItems }nodesLabels = [node2label[node] for node in nodes]self.nodesLabels = nodesLabelselif isinstance(label2nodesArr, list):self.nodesLabels = label2nodesArrdef __initNodesMatrix(self):nodes = sorted(self.graph.nodes())linkMatrix = np.asarray(nx.adjacency_matrix(self.graph, nodelist=nodes,weight='weight').todense(),dtype='float32')self.nodes = nodesself.linkMatrix = linkMatrixdef SpringLink(self):"""## 获得弹簧长度对应的矩阵在这里设置前面提到的四级引力关系"""linkMatrix = self.linkMatrixnodesLabels = self.nodesLabelsk = 1.0linkMatrix *= kspringMatrix = []for i, line in enumerate(linkMatrix):itemLinks = []for j, item in enumerate(line):if nodesLabels[i] == nodesLabels[j] and item != 0:itemLinks.append(1.5*k)elif nodesLabels[i] == nodesLabels[j]:itemLinks.append(1.2*k)else:itemLinks.append(item)springMatrix.append(itemLinks)springMatrix = np.array(springMatrix)springMatrix *= 0.8return springMatrixdef getNodesPositionInfo(self):"""## 转化最终要保存的节点位置信息"""nodes = self.nodesnodesPosition = self.nodesPositionnodesPositionInfo = [{"id": pointId, "x": point[0], "y": point[1]} for pointId,point in zip(nodes,nodesPosition)]self.nodesPositionInfo = nodesPositionInforeturn nodesPositionInfodef test():graphs, graphsMatrix, nodes = readGraphData(f'./data/CELE.txt')labelGroups = getClusterLabels(f'./未融合的聚类结果/pta-CELE-类数-10-1.json')task = ClusterNodesLayout(graphs[0], labelGroups)positionInfo = task(iterations=300)drawNodesMap(task.nodesPosition, task.nodesLabels)plt.show()if __name__ == '__main__':test()

tools中的相关函数

import json
import numpy as np
import pandas as pd
import networkx as nx
import matplotlib.pyplot as pltColors = ['red', 'green', 'blue', 'yellow', 'orange', 'purple', 'black', 'brown', 'pink', 'gray', 'cyan', 'indigo', 'magenta']def readGraphData(filename):"""## 读取图数据:params filename: 文件路径"""df = pd.read_csv(filename, header=None, sep=' ', names=['layerID', 'source', 'target', 'weight'], dtype='int32')layers = list(set(df['layerID'].tolist()))graphs = []graphsMatrix = []nodes = []for i in layers:g = nx.from_pandas_edgelist(df[df['layerID'] == i], source='source', target='target',edge_attr='weight')nodelist=sorted(g.nodes())L = np.asarray(nx.adjacency_matrix(g, nodelist=nodelist,weight='weight').todense(),dtype='float32')graphs.append(g)graphsMatrix.append(L)nodes = nodelistreturn graphs, graphsMatrix, nodesdef getClusterLabels(filePath):"""## 获取节点聚类的标签数据"""with open(filePath, 'r') as f:data = json.load(f)return datadef drawNodesMap(nodesPosition, labels):"""## 绘制布局出来的散点图并绘制连线:param nodesPosition: 节点的坐标:param labels: 节点对应的类标签"""plt.figure(figsize=(10,10))plt.title('Graph')for idx, node in enumerate(nodesPosition):plt.scatter(node[0], node[1], c=Colors[labels[idx]], s=50)def getCommunityData(filePath):"""## 读取保存的模块度得到的社区数据"""if filePath.endswith('.txt'):with open(filePath, "r", encoding="utf-8" ) as file:data = file.read().replace("frozenset({", "[").replace("})", "]")data = json.loads(data)community_data = {idx:nodes for idx, nodes in enumerate(data) }return community_dataelif filePath.endswith('.json'):with open(filePath, "r", encoding="utf-8" ) as file:data = json.load(file)community_data = {idx:nodes for idx, nodes in enumerate(data.values()) }return community_data

数据集格式

利用社区结构可视化复杂网络相关推荐

  1. 复杂网络社区结构划分方法

    复杂网络社区结构划分方法 随着对网络性质的物理意义和数学特性的深入研究,人们发现许多实际网络都具有一个共同性质,即社区结构.也就是说,整个网络是由若干个"社区"或"组&q ...

  2. 计算机网络二分法划分网络,三种经典复杂网络社区结构划分算法研究_GN算法

    论文导读::复杂网络是复杂系统的高度抽象.即社区结构特性[3].算法是一种试探优化法[4].算法. 关键词:复杂网络,社区结构,Laplace图谱,Kernighan-Lin算法,GN算法 1引言 现 ...

  3. 网络中的模块化和社区结构(Modularity and community structure in networks)

    Machine learning and the physical sciences 摘要 Ⅰ.引言 Ⅱ.最佳模块化方法(The Method of Optimal Modularity) Ⅲ.将网络 ...

  4. 数据可视化—复杂网络关系图的绘制

    数据可视化的含义 将抽象概念进行形象性表达,将抽象语言进行具象图形可视的过程. 以数据为工具,以可视化为手段,去达到描述真实,探索世界的目的. 以数据的视角,去看待世界. 数据可视化其实是一个处于不断 ...

  5. 这个Python库助你发现网络图的社区结构

    来源:机器之心 熟知社区发现算法,你不能错过这个 Python 库.它涵盖 Louvain 算法.Girvan-Newman 算法等多种社区发现算法,还具有可视化功能. 网络是由一些紧密相连的节点组成 ...

  6. Metapath2vec:Scalable Representation Learning for Heterogeneous Networks(结构化深度网络特征表示)

    目录 1.图嵌入背景介绍 1.1 什么是图嵌入 1.2 为什么要使用图嵌入 2.论文背景介绍 2.1 同质网络 & 异质网络 2.2 异质网络与Metapath2vec 3.Metapath2 ...

  7. Jeff Dean强推:可视化Bert网络,发掘其中的语言、语法树与几何学

    大数据文摘出品 来源:pair-code.github 作者:Andy Coenen等 编译:刘佳玮.万如苑.龙心尘 本文是论文(Visualizing and Measuring the Geome ...

  8. KDD 2016 | SDNE:结构化深层网络嵌入

    目录 前言 摘要 1. 引言 2. 相关工作 2.1 深度神经网络 2.2 网络嵌入 3. SDNE 3.1 问题定义 3.2 模型 3.2.1 框架 3.2.2 损失函数 3.2.3 优化 3.3 ...

  9. 集成学习模型(xgboost、lightgbm、catboost)进行回归预测构建实战:异常数据处理、缺失值处理、数据重采样resample、独热编码、预测特征检查、特征可视化、预测结构可视化、模型

    集成学习模型(xgboost.lightgbm.catboost)进行回归预测构建实战:异常数据处理.缺失值处理.数据重采样resample.独热编码.预测特征检查.特征可视化.预测结构可视化.模型保 ...

最新文章

  1. Java 异常处理的误区和经验总结--转载
  2. JSBinding+SharpKit / 更新的原理
  3. ios 不被遮挡 阴影_解决ios10导航栏底部阴影线条隐藏失效问题
  4. 开始入坑深度学习(DeepLearning)
  5. Linux编译C没有文件名,crt1.o linux x64上没有这样的文件c编译错误
  6. Zookeeper C 回调函数
  7. android q哪些手机型号,华为公布8款安卓Q首批升级机型
  8. Struts2文件上传与下载
  9. 单按钮启停电路实物图_手绘220V清洗机电路原理图和接线方法,单相电机常见故障排查...
  10. Avast! 4 Server 服务器版license许可文件获得方法
  11. oracle 0604,Oracle建立配置环境
  12. win10 C盘优化清理
  13. clickhouse索引原理介绍
  14. 前端安装项目报错1.gyp info it worked if it ends with ok
  15. Excel实战小技巧——批量操作
  16. 自定义starter出现Unable to read meta-data for class 这样解决
  17. 心态-《好奇心》书中的精髓:保持好奇心,能让我们的学习和生活更精彩。
  18. [分布式] Git结合Github进行版本控制
  19. 超详细基于Qt平台实现C/C++调用Matlab函数全流程
  20. CVPR 2022 Oral 学习不分割的内容:关于小样本分割的新视角

热门文章

  1. 请简述cat和tail -f 的区别?
  2. 达梦dmfldr快速加载报col nums in data file is not enough错误
  3. cocos2d-x 分享(外链)【link:Software MyZone】
  4. 12月4日,IMG副总裁将出席世界智能汽车大会
  5. linux mpeg4ip 编译,[操作系统]CentOS6.2下编译mpeg4ip
  6. 马走日(DFS深搜)
  7. memcache底层原理及安装使用
  8. 摘抄《人工智能》的经典语句
  9. Android OpenCV(五十八):SURF特征点检测
  10. 口才盛宴丨 CBK第二阶段第一期训练营正式开营