R语言︱SNA-社会关系网络—igraph包(社群划分、画图)(三)

2023-11-01 03:10

本文主要是介绍R语言︱SNA-社会关系网络—igraph包(社群划分、画图)(三),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



每每以为攀得众山小,可、每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~

———————————————————————————


社群划分跟聚类差不多,参照《R语言与网站分析》第九章,社群结构特点:社群内边密度要高于社群间边密度,社群内部连接相对紧密,各个社群之间连接相对稀疏。


社群发现有五种模型:点连接、随机游走、自旋玻璃、中间中心度、标签发现。

评价社群三个指标:模块化指标Q、网络聚类系数、网络密度。

画图有三种方法:直接plot、书中自编译函数、SVG。


———————————————————————————————————


不同社群划分模型的区别



社群模型概念效果
点连接某点与某社群有关系就是某社群的最差,常常是某一大类超级多
随机游走利用距离相似度,用合并层次聚类方法建立社群运行时间短,但是效果不是特别好,也会出现某类巨多
自旋玻璃关系网络看成是随机网络场,利用能量函数来进行层次聚类耗时长,适用较为复杂的情况
中间中心度找到中间中心度最弱的删除,并以此分裂至到划分不同的大群落耗时长,参数设置很重要
标签传播通过相邻点给自己打标签,相同的标签一个雷跟特征向量可以组合应用,适用于话题类


———————————————————————————————————


一、社群发现模型


1、基于点连接的社群发现——clusters


如果一个点与社群有联系则放在一个网络中,简单易懂,耗时短,但是分类效果并不特别好。




clusters(g.dir,mode="weak")

mode是用来选择强关联还是弱关联,weak or strong.


2、随机游走的社群发现



member<-walktrap.community(g.undir,weights=E(g)$weight,step=4)
weight代表线权重,默认就是E(g)$label;step代表游走步长,越大代表分类越粗糙,分类类别越小。默认为4.

3、自旋玻璃社群发现


member<-spinglass.community(g.undir,weights=E(g.undir)$weight,spins=2)
#需要设置参数weights,因为无默认值
weight代表线权重,但是与随机游走不同,其要自己赋上去,weight=E(g)$label不能少;spins代表产生的社群数,默认值为25。
这个社群分类函数有了自己定义分类数量的效果。


4、中间中心度社群发现




member<-edge.betweenness.community(g.undir,weight=E(g)$weight,directed=F)

有默认的线权重,并且默认是无向线的,directed=T时就代表有向线。


5、传播标签社群发现



#社群发现方法五:标签传播社群发现
member<-label.propagation.community(g.undir,weights=V(g.undir)$weight)
V(g.undir)$member
member<-label.propagation.community(g.undir,weights = E(g.undir)$weight,initial = c(1,1,-1,-1,2,-1,1))
V(g.undir)$member
member<-label.propagation.community(g.undir,weights = E(g.undir)$weight,initial = c(1,1,-1,-1,2,-1,1),fixed=c(T,F,F,F,F,F,T))

initial是社群初始化函数,默认为-1(不设置初始值),当然这里你也可以设置;如initial=c(1,1,-1,-1,2)就代表1,2个数为社群1;3、4不设置初始值;5个为社群2
fixed是用来固定函数的,当然如果没有设定初始值,如3.4.6则T,F都无效;如果设定了初始值,T则代表固定在原设定上。


———————————————————————————————————


二、衡量社群的指标


1、模块化指标Q——modularity


相当于是组内误差。

modularity(g.undir,membership=c(1,1,1,2,2,2,2))  #社群总差异,membership设置社群号

membership是每个点的各自分组情况。




2、网络聚类系数——transitivity


按照图形理论,聚集系数是表示一个图形中节点聚集程度的系数,一个网络一个值。

transitivity(g)
可以衡量网络中关联性如何,值越大代表交互关系越大。说明网络越复杂,越能放在一块儿,聚类。
比如c(1,2,2,3,3,1)=1;c(1,2,2,3,3,1,1,4,4,3)=0.75,他是衡量是否有loop,能否找到循环到自己的线,三元组。


3、网络密度——graph.density


跟网路聚类系数差不多,也是用来形容网络的结构复杂程度。越大,说明网络越复杂,说明网络越能够放在一块。

graph.density(g.zn)
graph.density(group1)
graph.density(group2)
#从中可以看到不同社群与整体之间的网络密度情况(关联程度)


———————————————————————————————————


三、画 图


由于关系网络图很复杂,而且数据量一大,小的图片形式网路图基本就是一坨浆糊。所以这里JPEG一定要足够大,最好的就是SVG格式。SVG格式的好处就是矢量图,你可以自己放大缩小,而且还可以用工具进行修改。但是最不好就是,一般的工具还打开不了,要用一些特有的工具,打开之后也会出现一些问题。

当然你是可以直接plot的。


1、直接plot


plot(g.test,layout=layout.fruchterman.reingold,edge.arrow.size=0.1,vertex.color=rainbow(7,alpha=0.3),edge.arrow.mode = "-")

代码解读:edge.arrow.size=0.1箭头大小;

vertex.color=rainbow(7,alpha=0.3)颜色,七种;

edge.arrow.mode = "-"连接方式用-。

其中还有很多参数类型:

#vertex.size=1表示节点的大小
#layout表示布局方式(发散性)
#vertex.label=NA,不显示任何点信息,默认显示idx号
#vertex.color=V(g)$color 点的颜色设置
#mark.groups表示设置分组
#vertex.shape='none'不带边框 
#vertex.label.cex=1.5, #节点字体大小
#vertex.label.color='red'
#edge.arrow.size=0.7 #连线的箭头的大小
#edge.color = grey(0.5)#线的颜色
#edge.arrow.mode = "-" 箭头换成线
#vertex.label.dist=5  点标签和节点之间的距离一般0.1,便于错开重叠


2、简易画图自编译函数


R语言与网站分析中还专门写了一个画图函数。

plot.membership<-function(graph,membership,main=""){V(graph)$member<-membershipmem.col<-rainbow(length(unique(membership)),alpha=0.3)V(graph)$color<-mem.col[membership]plot(graph,edge.width=E(graph)$weight,vertex.color=V(graph)$color,main=main)
}

函数需要输入三样东西(关系网络,分组情况,标题)。这里借助上面的社群分类都是可以得到的。用点连接来举个例子:

plot.membership(g.undir,clusters(g.undir)$membership,"无向图的社群发现")


3、SVG如何画高质量图


画一个好看的图你需要考虑这么几个问题:

不同重要性的点是否需要不同的大小?——V(g)$size

重要的点是否要加入其名字标签?——V(g)$label

不同社群的点,是否需要不同的颜色?——V(g)$member


(1)设置点大小


V(gg)$size = 5
V(gg)[degree(g)>=3000]$size = 15

其他节点尺寸都是5,而点度数大于3000的节点尺寸是15;


(2)设置不同社群颜色


mem.col<-rainbow(length(unique(V(g)$member)),alpha = 0.3)
V(g)$color<-mem.col[V(g)$member]
rainbow是生成颜色的参数,比如"#FF00004D" "#00FFFF4D"
第二句话是将每个点附上颜色。


(3)设置重点词标签

V(g)$label=NA
V(g)[degree(g)>=3000]$label=V(gg)[degree(g)>=3000]$name

非重点词不给标签,重点词点度大于3000的给标签名字。

 

最后的SVG画图函数就是:

svg(filename=paste("C:/Users/long/Desktop","/1.svg",sep = ""),width = 40,height = 40)
plot(data.g,layout=layout.fruchterman.reingold,vertex.color=V(g)$color,vertex.label=V(g)$label,<span style="font-family: Arial, Helvetica, sans-serif;">vertex.size=V(g)$size</span>)
dev.off()

其中layout.fruchterman.reingold是发散式的布局方式。


打开SVG可以用adobe illustrator,而且也可以修改,就是笔者遇到的问题是,图中会出现很多问题。盗图一张,来自博客:社会网络分析:探索人人网好友推荐系统




每每以为攀得众山小,可、每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~

———————————————————————————

这篇关于R语言︱SNA-社会关系网络—igraph包(社群划分、画图)(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/320051

相关文章

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了

poj 2112 网络流+二分

题意: k台挤奶机,c头牛,每台挤奶机可以挤m头牛。 现在给出每只牛到挤奶机的距离矩阵,求最小化牛的最大路程。 解析: 最大值最小化,最小值最大化,用二分来做。 先求出两点之间的最短距离。 然后二分匹配牛到挤奶机的最大路程,匹配中的判断是在这个最大路程下,是否牛的数量达到c只。 如何求牛的数量呢,用网络流来做。 从源点到牛引一条容量为1的边,然后挤奶机到汇点引一条容量为m的边

Thread如何划分为Warp?

1 .Thread如何划分为Warp? https://jielahou.com/code/cuda/thread-to-warp.html  Thread Index和Thread ID之间有什么关系呢?(线程架构参考这里:CUDA C++ Programming Guide (nvidia.com)open in new window) 1维的Thread Index,其Thread

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return