如何将存储在磁盘上的邻接矩阵输入到 R 程序中,是进行社交网络分析的起点。在前面的章节中已经介绍了基本的数据结构以及代码结构,本章将会面对一个实质性问题,学习如何导入一个图以及计算图的一些属性。

图的文件表示

在计算机中,最常见的两种表示图的基本结构是邻接矩阵和邻接表。以最简单的无权无向图为例,邻接矩阵中第 \(i\) 行第 \(j\) 列的元素 \(a_{ij}\) 如果等于 1,则表示顶点 \(i\) 和顶点 \(j\) 之间有边,即邻接矩阵将所有节点之间的关系都表示出来。邻接表则是对顶点 \(i\) 建立一个单链表,这个单链表由顶点 \(i\) 的所有邻居节点构成,即邻接表只是把存在关系的节点表示出来。

网络上许多公开的数据集更常使用三元组去表示一个图。下面是一个三元组的示例,以第一行的三元组 (1, 2, 1) 为例,它表示有一条从顶点 1 指向顶点 2 的边,并且该边的权重为 1。对于无权图而言,通常会省略三元组中的第三个元素。

1	2	1
1 3 -1
2 3 -1
1 4 -1
3 4 1

提示

公开数据集大多数可以从下面的网站上找到:

1. Stanford Large Network Dataset Collection:http://snap.stanford.edu/data

2. The KONECT Project:http://konect.cc/networks

导入一个图

下面以 Dolphins 网络为例,将其导入到 R 程序中。Dolphins 是一个无权无向的真实网络,描述了生活在新西兰的一个峡湾附近的宽吻海豚社区,其中节点表示海豚,边表示海豚间的社会关系。将数据集下载完成后,打开名为 out 的文件。

% sym unweighted
9 4
10 6
10 7
11 1
......

在读取文件之前还需要对其进行一下修改,可以看到该文件的第一行“% sym unweighted”是由空格分隔的三个元素,R 语言还没有太过智能,在读取到第二行时会因为只有两个元素而报错,因此需要将第一行删除。下面使用 read.table() 将文件读入到 R 程序中:

graph.edges <- read.table(file = "out.dolphins", header = FALSE)

提示

也可以将 out 文件中的制表符(\t)替换成逗号(,),将文件更改为使用逗号分隔的 CSV 文件,并使用 read.csv() 函数读取。

你也许会好奇读入的 graph.edges 到底是什么东西,使用 class() 函数来看看变量的类型:

> class(graph.edges)
[1] "data.frame"

data.frame 似乎前面的章节并没有介绍,受限于研究的方向,这有可能是你唯一一次接触数据框类型,不用管它,下面将读入的数据转换为图:

> library(igraph)
> graph <- graph_from_data_frame(graph.edges, directed = FALSE)

下面画图看看导入的 Dolphins 网络:

> class(graph)
[1] "igraph"
> plot(graph)

输出一下 Dolphins 网络的规模:

> cat(sprintf("Nodes: %s\nEdges: %s\n", length(V(graph)), length(E(graph))))
Nodes: 62
Edges: 159

这里使用了两个全新的函数 V() 和 E(),其中 V() 是获取图的点集,E() 是获取图的边集,今后的大部分分析是建立在这两个集合之上,这两个函数会伴随你的 R 语言旅程直到结束。

导入的网络可以保存为 R 文件,下次可以直接载入使用,使用同样的方法也可以持久化实验数据。

> save(graph, file = "dolphins.RData")  # 保存 graph 变量
> load(file = "dolphins.RData") # 导入 RData 文件中存储的变量

生成人工网络

使用人工网络验证算法的有效性也是实验中必不可少的一环,下面介绍几种常见的人工网络结构。

  1. 全连接图
    graph <- make_full_graph(10)

  2. 树状图
    graph <- make_tree(21, children = 3, mode = "undirected")

  3. k-正则图
    graph <- sample_k_regular(20, 3)

  4. Erdos-Renyi Random
    graph <- sample_gnp(20, 0.1)

  5. 小世界网络
    graph <- sample_smallworld(dim = 1, size = 20, nei = 2, p = 0.1)

提示

其他人工结构请查看 igraph 文档:https://igraph.org/r/doc

图的基本分析

上文从导入外部网络和生成人工网络两个角度获得了 igraph 图对象,下面将使用 igraph 包中的函数对 Dolphins 网络进行简单的分析。

  1. 判断图的连通性
    > is.connected(graph)
    [1] TRUE
  2. 计算图的度
    > degree(graph)  # 计算图中所有节点的度,其中第一行为节点的名称,第二行为节点的度
    9 10 11 ...
    6 7 5 ...
    > degree(graph, v = "9") # 计算图中部分节点的度
    9
    6
  3. 计算图的密度
    > edge_density(graph)
    [1] 0.0840825
  4. 对图的路径分析
    > diameter(graph, directed = FALSE, weights = NA)  # 直径
    [1] 8
    > radius(graph) # 半径
    [1] 5
    > distances(graph, v = V(graph)$name[1], to = V(graph)$name[10], algorithm = "unweighted", weights = NA) # 计算节点间的最短距离
    20
    9 3
    > shortest_paths(graph, from = "1", to = "6", weights = NA) # 计算节点1到节点6的最短路径
    $vpath
    $vpath[[1]]
    + 6/62 vertices, named, from e1ce364:
    [1] 1 41 37 40 58 6
  5. 计算图的聚类系数
    > transitivity(graph, type = "average")
    [1] 0.3029323

️ 练习

1. 试着在数据集网站中下载其他网络导入到 R 程序中;

2. 试着计算导入网络的平均度;

3. 查找 igraph 文档,试着计算导入网络的同配系数(Assortativity)。

社交网络分析的 R 基础:(五)图的导入与简单分析的更多相关文章

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

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

  2. 社交网络分析的 R 基础:(三)向量、矩阵与列表

    在第二章介绍了 R 语言中的基本数据类型,本章会将其组装起来,构成特殊的数据结构,即向量.矩阵与列表.这些数据结构在社交网络分析中极其重要,本质上对图的分析,就是对邻接矩阵的分析,而矩阵又是由若干个向 ...

  3. 社交网络分析的 R 基础:(二)变量与字符串

    本章会从 R 语言中最基本的数据类型开始介绍,在此之后就可以开始 R 语言实践了.对社交网络分析而言,我们在处理字符串上所花费的时间要远远大于处理数字的时间,因此本章还会介绍常用的字符串处理操作. 变 ...

  4. 社交网络分析的 R 基础:(四)循环与并行

    前三章中列出的大多数示例代码都很短,并没有涉及到复杂的操作.从本章开始将会把前面介绍的数据结构组合起来,构成真正的程序.大部分程序是由条件语句和循环语句控制,R 语言中的条件语句(if-else)和 ...

  5. 社交网络分析的 R 基础:(六)绘图操作

    R 语言强大的可视化功能在科学研究中非常受欢迎,丰富的类库使得 R 语言可以绘制各种各样的图表.当然这些与本章内容毫无关系,因为笔者对绘制图表了解有限,仅限于能用的程度.接下来的内容无需额外安装任何包 ...

  6. 对苹果“五仁”编程语言Swift的简单分析

    对苹果"五仁"编程语言Swift的简单分析 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvUHJvdGVhcw==/font/5a6L5 ...

  7. OD 实验(五) - 对 PE 结构的简单分析

    载入程序,按 Alt+M 查看内存空间 双击进入程序的 PE 头 这些为 DOS 环境下才会运行的 这个执行 PE 的地址,PE 结构的偏移地址为 C0 找到这个地址 以 PE 开头 SizeOfCo ...

  8. [转] X-RIME: 基于Hadoop的开源大规模社交网络分析工具

    转自http://www.dataguru.cn/forum.php?mod=viewthread&tid=286174 随着互联网的快速发展,涌现出了一大批以Facebook,Twitter ...

  9. Social Network 社交网络分析

    Social Network 社交网络分析 一:什么是SNA-社交网络分析 社交网络分析的威力何在?我想几个案例来说明. 案例1:对一个毫无了解的组织(这个组织可以是一个公司,亦或是一个组织),如果能 ...

随机推荐

  1. IE播放音频踩坑之路---待修改

    在其他浏览器都是兼容的!在IE9就是显示一个黑色的框上面有个X 音乐无法播放   要显示播放界面的话,要添加 controls 属性(控件属性)例子:<audio src="xxx.m ...

  2. sql审核-避免离线sql导致的db集群故障

    关键词: sql审核.sql审批.sql检查.sql检测.sql执行 离线sql可能会导致的问题 首先,什么是离线sql呢?就是说手动触发执行的这种sql:相对的还有在线sql,位于我们的程序代码中, ...

  3. shell基础知识查缺补漏

    最近在看<Linux程序设计(第4版)>,其中有一个章节主要讲了shell脚本方面的,内容不细,但是利用较短的篇幅讲的也不少了.对我们自己来说也是一个查缺补漏的过程,所以就写下这篇读书笔记 ...

  4. mysql5.7安装和卸载过程

    安装mysql 5.7 点击下面链接下载 mysql-5.7.27-winx64.zip 压缩文件 链接:https://pan.baidu.com/s/1CF5mmKkZkD_hxsjFOQJrzw ...

  5. [STM32F10x] 利用定时器测量脉冲宽度

    硬件:STM32F103C8T6 平台: ARM-MDk V5.11 前面一篇文章讲过如何利用定时器测量信号的频率(见[STM32F10x] 利用定时器测量频率),使用的是定时器的捕获/比较单元(Ca ...

  6. 猫与ThinkPad

    高中时候看见过家里橘猫谁在舅舅的ThinkPad笔记本了,可惜没拍下来,我也不喜欢那只猫,更喜欢幼时的白猫和黑白猫. ThinkPad宣传图片诚不欺我. 怀念青春与当年陪我游戏的IBM的ThinkPa ...

  7. CMake语法—普通变量与子目录(Normal Variable And Subdirectory)

    目录 CMake语法-普通变量与子目录(Normal Variable And Subdirectory) 1 CMake普通变量与子目录示例 1.1 代码目录结构 1.2 父目录CMakeLists ...

  8. gin框架中请求路由组的使用

    1. gin框架中可以使用路由组来实现对路由的分类 package main import "github.com/gin-gonic/gin" func main() { rou ...

  9. golang中sha256、md5加密,base64encode、base64decode

    package tool import ( "crypto/md5" "crypto/sha256" "encoding/base64" & ...

  10. 如何加载本地下载下来的BERT模型,pytorch踩坑!!

    近期做实验频繁用到BERT,所以想着下载下来使用,结果各种问题,网上一搜也是简单一句:xxx.from_pretrained("改为自己的路径") 我只想说,大坑!!! 废话不多说 ...