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<-membership mem.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包(社群划分、画图)(三)的更多相关文章
- R语言入门级实例——用igragh包分析社群
R语言入门级实例——用igragh包分析社群 引入—— 本文的主要目的是初步实现R的igraph包的基础功能,包括绘制关系网络图(social relationship).利用算法进行社群发现(com ...
- R语言构建蛋白质网络并实现GN算法
目录 R语言构建蛋白质网络并实现GN算法 1.蛋白质网络的构建 2.生物网络的模块发现方法 3.模块发现方法实现和图形展示 4.附录:igraph中常用函数 参考链接 R语言构建蛋白质网络并实现GN算 ...
- R语言︱贝叶斯网络语言实现及与朴素贝叶斯区别(笔记)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 一.贝叶斯网络与朴素贝叶斯的区别 朴素贝叶斯的 ...
- R语言·文本挖掘︱Rwordseg/rJava两包的安装(安到吐血)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- R语言·文本挖掘︱Rwordseg/rJava ...
- R语言︱文本挖掘之中文分词包——Rwordseg包(原理、功能、详解)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:与前面的RsowballC分词不同的 ...
- R语言数据分析利器data.table包—数据框结构处理精讲
R语言数据分析利器data.table包-数据框结构处理精讲 R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代 ...
- R语言︱SNA-社会关系网络—igraph包(中心度、中心势)(二)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- SNA社会关系网络分析中,关键的就是通过一些指 ...
- R语言数据分析利器data.table包 —— 数据框结构处理精讲
R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代码简洁,只要一行命令就可以完成诸多任务,另一方面是处理 ...
- R语言︱文本挖掘——词云wordcloud2包
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者看到微信公众号探数寻理中提到郎大为Chif ...
随机推荐
- python中的协程及实现
1.协程的概念: 协程是一种用户态的轻量级线程.协程拥有自己的寄存器上下文和栈. 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切换回来的时候,恢复先前保存的寄存器上下文和栈. 因此,协程能保留 ...
- 单元测试系列:如何使用JUnit+JaCoCo+EclEmma完成单元测试
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6726664.html -----如 ...
- WPF 自定义图表(柱状图,曲线图)
1.功能 实现图表的数据绑定,动态绑定,属性更改绑定. 本文提供了一种思路. 2.原理 使用canvas绘制,使用反射来确定属性的绑定. 3.效果: 柱状图效果: 曲线图效果: 感谢阅读. 源码地址: ...
- Linux普通用户使用sudo权限启停apache服务
sudo的工作过程如下: 1,用户执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限 2,确认用户具有可执行sudo的权限后,让用户输入密码确认 3,若密码 ...
- 夏令营讲课内容整理 Day 3.
本日主要内容是树与图. 1.树 树的性质 树的遍历 树的LCA 树上前缀和 树的基本性质: 对于一棵有n个节点的树,必定有n-1条边.任意两个点之间的路径是唯一确定的. 回到题目上,如果题 ...
- PLECS_晶闸管调速系统_9w
3. 直流电机开环调压调速系统模型搭建 (1)电路图 (2)仿真 当 α = pi / 2.7 的时候,直流电机的稳定转速大约保持很低的速度. 随着α的减少,直流电机的速度逐渐增大.当α = pi / ...
- 一个很好的MySQL在线学习平台
一个很好的MySQL在线学习平台 https://www.techonthenet.com/sql/
- shell 脚本中执行SQL语句 -e "..."
/usr/local/mysql/bin/mysql -uroot -p123456 -e " use faygo source faygo.sql select * from devqui ...
- 插入排序实现&&选择排序实现
萌新刚刚开始学习算法,第一步是学习排序,毕竟算法的四大块"排序,查找,图,字符串"里面,排序是第一位的(PS:今天才知道算法提供的只是一个程序编写思路,一直以为是一个函数,难怪传入 ...
- JVM中对象访问定位两种方式
1.通过句柄方式访问, 在Java堆中分出一块内存进行存储句柄池,这样的话,在栈中存储的是句柄的地址 优点: 当对象移动的时候(垃圾回收的时候移动很普遍),这样值需要改变句柄中的指针,但是栈中的指针不 ...