如何控制网络布局算法的异常节点?
Posted
技术标签:
【中文标题】如何控制网络布局算法的异常节点?【英文标题】:How to control outlier nodes for network layout algorithms? 【发布时间】:2019-07-18 09:23:39 【问题描述】:使用带有 Fruchterman-Reingold 布局算法的 igraph
包呈现大图(> 10000 个节点;> 10000 条边)。一些异常节点会使可视化变得困难,99% 的节点挤在一起,而 1% 的异常节点位于很远的地方。例如,99.9% 的节点位于 0 到 10 之间,但 0.1% 的节点位于 10000 之外。问题是如何控制这些异常节点以呈现所有节点。
这是一个示例,其中 0.2% 的异常值节点使完整呈现变得困难。
> library(igraph)
> ig <- erdos.renyi.game(12000,1/10000,directed=TRUE,loops=FALSE)
> set.seed(12)
> ig.layout <- layout_with_fr(ig)
> apply(ig.layout,2,quantile,c(0,0.001,0.01,0.1,0.9,0.99,0.999,1))
[,1] [,2]
0% -54.7584289 -58.192821
0.1% -49.8806632 -51.090376
1% -29.7822097 -33.073435
10% -0.2196407 -1.170996
90% 10.1564691 10.513665
99% 2026.5245335 737.739440
99.9% 16433.7302032 13168.400710
100% 22614.7986797 22284.309659
【问题讨论】:
【参考方案1】:“控制”异常值的一种方法是消除它们。这将减少您最初的问题,但您仍然会遇到难以可视化的大图表。但是,让我们一次处理一件事。首先,异常值。
不幸的是,您在生成图表之后设置了种子。我将首先移动set.seed
语句,以便结果可重现。
library(igraph)
set.seed(12)
ig <- erdos.renyi.game(12000,1/10000,directed=TRUE,loops=FALSE)
ig.layout <- layout_with_fr(ig)
apply(ig.layout,2,quantile,c(0,0.001,0.01,0.1,0.9,0.99,0.999,1))
[,1] [,2]
0% -5.359639e+01 -9.898871e+01
0.1% -4.996891e+01 -5.046219e+01
1% -3.040131e+01 -2.934615e+01
10% -1.221806e-02 1.513951e-02
90% 1.207328e+01 1.130579e+01
99% 1.111746e+03 6.994646e+02
99.9% 1.418739e+04 1.182382e+04
100% 1.968552e+04 2.025938e+04
我得到的结果与你的相当。更重要的是,该图被异常值严重扭曲。
plot(ig, layout=ig.layout, vertex.size=4, vertex.label=NA,
edge.arrow.size=0.4)
但是这些异常值是什么?
igComp = components(ig)
table(igComp$csize)
1 2 3 4 5 6 7 10489
1041 137 42 8 5 1 1 1
您的图表有一个非常大的组件和相当多的小组件。 “异常值”是小的、不连贯的组件中的节点。我的建议是,如果您想看图表,请消除这些小组件。只看大组件。
C1 = induced_subgraph(ig, which(igComp$membership ==1))
set.seed(12)
C1.layout <- layout_with_fr(C1)
apply(C1.layout,2,quantile,c(0,0.001,0.01,0.1,0.9,0.99,0.999,1))
[,1] [,2]
0% -18.111038 -30.5068075
0.1% -11.257167 -14.4507491
1% -4.570292 -3.2830470
10% 0.124789 0.1836629
90% 7.182714 7.1506193
99% 12.291679 13.1523646
99.9% 26.812703 23.6325447
100% 35.186445 26.8564644
现在布局更合理了。
plot(C1, layout=C1.layout, vertex.size=4, vertex.label=NA,
edge.arrow.size=0.4)
现在“异常值”消失了,我们看到了图表的核心。你现在有一个不同的问题。看 10500 个节点很难理解它,但至少你可以看到这个核心。祝您进一步探索顺利。
【讨论】:
以上是关于如何控制网络布局算法的异常节点?的主要内容,如果未能解决你的问题,请参考以下文章
Graph Anomaly Detection with Deep Learning——节点检测