图与网络

一个网络G,也可以称为图(graph)或网络图,是一种包含了节点V(即网络参与者,也称顶点)与边E(即节点之间的连接关系)的数学结构,记作G={V,E}。可以使用一个矩阵来存放节点之间的连接关系,这个矩阵称为邻接矩阵。如果网络中两个节点之间的边是有方向的,即从节点u出发指向节点v,这就是一个有向网络(有向图),否则称为无向网络(无向图)。网络的边也可以赋予权重,称为加权网络。

一、R的igraph包

igraph包是一个用来解决图与网络问题以及对其进行可视化的包。igraph是一个“历史悠久”的开源项目,提供了一组简单易用且功能强大的网络分析工具,igraph有多种语言接口,包括了R\Python\C++等等。尽管(无论在R还是Python中)已经有了更多的网络分析和可视化工具,igraph依然是最好的出发点。

igraph包中创建图的对象的函数是

make_graph(edges, ..., n = max(edges), isolates = NULL,directed = TRUE,dir = directed, simplify = TRUE)
1.其中edges参数为边组成的向量,这个向量中的元素既可以是数字也可以是字符,也可以是literals参数(但不经常用)。比如如果是数字,c(1,2)表示一条从点1到点2的边,c(1,2,2,3)表示两条边,一条从1到2,另一条从2到3,注意图中的点的编号不能用0来命名,否则会报错,至于原因就不太清楚啦;字母的原理与数字相同
2.n为最大边数,只在edges参数中的元素是数字的时候有用,但我还是不太清楚这个参数的实质作用是什么,好像一般情况下用不到。
3.isolates为孤立的点组成的向量,但只有在edges参数中的元素是字符时才有用,比如make_graph(c('a','b','b','c'),isolates = c('d','e'))这个图有两条边ab,bc,还有两个孤立的点d和e.
4.directed为一个布尔型参数,TRUE表示有向图,FALSE表示无向图,dir参数与directed参数是一样的,但两者不能同时出现。
5.simplify参数只有在edges参数使用literals时才有用。

make_graph(edges, ..., n = max(edges), isolates = NULL,directed = TRUE,dir = directed, simplify = TRUE)

1其中edges参数为边组成的向量,这个向量中的元素既可以是数字也可以是字符,也可以是literals参数(但不经常用)。比如如果是数字,c(1,2)表示一条从点1到点2的边,c(1,2,2,3)表示两条边,一条从1到2,另一条从2到3,注意图中的点的编号不能用0来命名,否则会报错,至于原因就不太清楚啦;字母的原理与数字相同

2.n为最大边数,只在edges参数中的元素是数字的时候有用,但我还是不太清楚这个参数的实质作用是什么,好像一般情况下用不到。

3.isolates为孤立的点组成的向量,但只有在edges参数中的元素是字符时才有用,比如make_graph(c('a','b','b','c'),isolates = c('d','e'))这个图有两条边ab,bc,还有两个孤立的点d和e.

4.directed为一个布尔型参数,TRUE表示有向图,FALSE表示无向图,dir参数与directed参数是一样的,但两者不能同时出现。

5.simplify参数只有在edges参数使用literals时才有用。

二、图的数据结构

图是一组顶点:通常用V(Vertex)表示顶点集合;一组边:通常用E (Edge) 表示边的集合,边是顶点对:如(v, k) ∈E ,其中v, k ∈ V;有向图的边表示从v指向k的边(单行线),无向图的边是无向边(v, k)(双向线);边的权:通常用W(Weight)表示权的集合,这三个集合构成的三元有序组就表示一个赋权图。简单图一般不考虑多重边和自回路,如下图所示。

library("igraph")
m <- matrix( c(1,2,6, 1,3,5, 1,4,4, 1,6,4, 3,6,4, 3,7,3, 4,7,3, 5,8,5, 6,8,4, 7,8,6) ,ncol = 3,byrow = T)
#创建一个无向图
g <- make_graph(t(m[,1:2]),directed = FALSE)
#创建一个有向图
h <- make_graph(t(m[,1:2]),directed = TRUE)
graph_attr(g,'weight') <- m[,3] #加载权重
graph_attr(h,'weight') <- m[,3] #加载权重
E(g)$weight=m[,3]
E(h)$weight=m[,3]
#也可以用第一个函数获得图的权
graph_attr(g,'weight') #得到g的权
plot(g,edge.label = graph_attr(g,'weight')) #图1
plot(h,edge.label = graph_attr(h,'weight')) #图2

图1 无向图

连通:如果从V到K存在一条(无向)路径,则称V和K是连通的。连通图(Connected Graph):如果对于图的任一两个顶点v、K∈V,v和K都是连通的,则称该图为连通图。连通是图最重要的性质,表面我们所研究的对象图是一个有机整体。

1. 图的邻接矩阵

邻接矩阵(Adjacency Matrix)是表示顶点之间相邻关系的矩阵 (两顶点若连接,则为1,反之为0)。设G=(V,E)是一个图,其中V={v1,v2,…,vn} 。G的邻接矩阵是一个的n阶方阵:

①对无向图而言,邻接矩阵一定是对称的,而且主对角线一定为零(在此仅讨论无向简单图),副对角线不一定为0,有向图则不一定如此。

②无向图的邻接矩阵一定是对称的,而有向图的邻接矩阵不一定对称。

无向网络的邻接矩阵(对称阵)

若节点i 和节点j之间存在连接,则令矩阵中第i行第j列上的元素yij=1;若节点i 和节点j之间不存在连接,则令矩阵元素yij=0。

有向矩阵的邻接矩阵(非对称阵)

若节点i和节点j之间存在有向连接,则令矩阵元素yij=1;若节点i和节点j之间不存在有向连接,则令矩阵元素yij=0。

图1的邻接矩阵为

get.adjacency(g)
[1,] . 1 1 1 . . . .
[2,] 1 . . . . 1 . .
[3,] 1 . . . . 1 1 .
[4,] 1 . . . . . 1 .
[5,] . . . . . . . 1
[6,] . 1 1 . . . . 1
[7,] . . 1 1 . . . 1
[8,] . . . . 1 1 1 .

图2的邻接矩阵为(!!!有向边默认以行为起点)

get.adjacency(h)
[1,] . 1 1 1 . . . .
[2,] . . . . . 1 . .
[3,] . . . . . 1 1 .
[4,] . . . . . . 1 .
[5,] . . . . . . . 1
[6,] . . . . . . . 1
[7,] . . . . . . . 1
[8,] . . . . . . . .

2. 图的加权邻接矩阵

若节点i 和节点j之间存在连接,则令矩阵中第i行第j列上的元素yij=权重;若节点i 和节点j之间不存在连接,则令矩阵元素yij=0。可见,网络的邻接矩阵是加权网络的特例,是权重值只有1和0两个取值的加权邻接矩阵。

图1的加权邻接矩阵

get.adjacency(g,attr = "weight",sparse = T)
[1,] . 6 5 4 . . . .
[2,] 6 . . . . 4 . .
[3,] 5 . . . . 4 3 .
[4,] 4 . . . . . 3 .
[5,] . . . . . . . 5
[6,] . 4 4 . . . . 4
[7,] . . 3 3 . . . 6
[8,] . . . . 5 4 6 .

3. 图的边列表

边列表,也称边表,图的储存结构之一。边表由表头结点和表结点两部分组成,图中每个顶点均对应一个存储在数组中的表头结点。边表是图的一种存储结构,用来描述图上的每一个点。对图的每个边进行编号,对图的每个顶点建立一个链表(n个顶点建立n个链表),第i个容器中的结点包含以顶点Vi为起点的所有边的编号。

图1的边列表

get.data.frame(g)
from to
1 1 2
2 1 3
3 1 4
4 2 6
5 3 6
6 3 7
7 4 7
8 5 8
9 6 8
10 7 8

参考文献

R语言igraph包的使用

图与网络分析—R实现(一)的更多相关文章

  1. Linux/Centos下使用mtr做路由图进行网络分析

    工具作用: mtr可以做路由图供我们分析哪里出现故障或者是否存在有网络拥塞的情况 1. 首先安装mtr 工具 使用yum  安装 :  yum  install mtr -y  2. 使用 我经常在工 ...

  2. 社交网络分析的 R 基础:(一)初探 R 语言

    写在前面 3 年的硕士生涯一转眼就过去了,和社交网络也打了很长时间交道.最近突然想给自己挖个坑,想给这 3 年写个总结,画上一个句号.回想当时学习 R 语言时也是非常戏剧性的,开始科研生活时到处发邮件 ...

  3. 用R包中heatmap画热图

    一:导入R包及需要画热图的数据 library(pheatmap) data<- read.table("F:/R练习/R测试数据/heatmapdata.txt",head ...

  4. 使用R画地图数据

    用R画地图数据 首先,从这里下载中国地图的GIS数据,这是一个压缩包,完全解压后包含三个文件(bou2_4p.dbf.bou2_4p.shp和bou2_4p.shx),将这三个文件解压到同一个目录下. ...

  5. R(四): R开发实例-map分布图

    前几章对R语言的运行原理.基本语法.数据类型.环境部署等基础知识作了简单介绍,本节将结合具体案例进行验证测试. 案例场景:从互联网下载全国三甲医院数据,以地图作为背景,展现各医院在地图上的分布图.全国 ...

  6. R实战读书笔记四

    第三章 图形入门 本章概要 1 创建和保存图形 2 定义符号.线.颜色和坐标轴 3 文本标注 4 掌控图形维数 5 多幅图合在一起 本章所介绍内容概括例如以下. 一图胜千字,人们从视觉层更易获取和理解 ...

  7. 《R实战》读书笔记三

    第二章  创建数据集 本章概要 1探索R数据结构 2使用数据编辑器 3数据导入 4数据集标注 本章所介绍内容概括例如以下. 两个方面的内容. 方面一:R数据结构 方面二:进入数据或者导入数据到数据结构 ...

  8. achartengine之折线图

    问题在文章的最后,大致说来就是折线图,如果点的个数大于3个的时候,不是所有的点都显示对应的值的,这是为什么呢,本来以为是小问题,但两天了还没找到原因) 将前两天的折线图代码做了小量修改,形成一个类似于 ...

  9. android使用achartengine 实现折线图

    折线图的实现分为下边几个步骤: 1.第一步:数据的准备 XYMultipleSeriesDataset mDataset = new XYMultipleSeriesDataset(); XYSeri ...

  10. R语言中文社区历史文章整理(类型篇)

    R语言中文社区历史文章整理(类型篇)   R包: R语言交互式绘制杭州市地图:leafletCN包简介 clickpaste包介绍 igraph包快速上手 jiebaR,从入门到喜欢 Catterpl ...

随机推荐

  1. DML操作数据

    添加数据 insert into 表名(列的名称)(数据);ps:列的名称用`  `包围可以减少出错 添加全部数据的时候可以把列的名称省略: 修改数据 update 表名  set 列名=数据,列名= ...

  2. testNG框架之我见

    testNG框架中会有一个xml文件夹,里面放xml文件,之后必须要在pom文件中配置 xml文件中有一个suite,在suite中可以配置parameter参数.test用例,还可以添加listen ...

  3. C语言中分治的思想-位运算

    (1) 有101个整数,其中有50个数出现了两次,1个数出现了一次, 找出出现了一次的那个数. 位运算的思想:任何数和零异或得到自己,任何数自己异或得到0. eg1.{2,1,5,1,2,2} num ...

  4. python开头

    python识别的正则模式 coding[:=]\s*([-\w.]+)#coding:utf8   ???不要用 #coding=utf-8#coding:utf-8# -*- coding: ut ...

  5. 三种遍历的方法(map和forEach的区别)

    一. for循环 arr[index]可以改变原数组 二. forEach方法 forEach方法的返回值是一个undefined: 2. 在循环体内改变item的值不会影响原数组,而是只在循环体内生 ...

  6. ASP.NET利用JQuery实现AJAX(前台脚本代码)调用后台静态方法

    前台页面的script代码 PS: 如果不需要参数的话,就把data那一行删除 $(function () { //AJAX同步后台 var orderid = parseInt($(this).pa ...

  7. 制作mnist格式数据集

    import os from PIL import Image from array import * from random import shuffle # # 文件组织架构: # ├──trai ...

  8. centos docker 部署.net6项目

    1 .生成dockerfile文件 FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE 5000 # 一般情况下必 ...

  9. UGUI六大基础组件——Graphic Raycaster

    一.组件作用 图形摄像投射器是用于检测UI输入事件的射线发射器.通过射线检测玩家和用户的交互,判断是否点击到了UI元素. 注意:不是通过碰撞器来检测的,而是通过图形来检测的. 二.参数解释 ***** ...

  10. vue-print-nb的应用

    1.cnpm i vue-print-nb 2.触发事件:v-print="printObj" 3.触发的是个对象: printObj:{                 id: ...