如何对复杂网络建模所需要的数据进行预处理

上一篇文章介绍了如何构建Space L实体网络的模型,这一篇是对上一篇文章的一个补充优化。

以下部分摘自上一篇文章:如何建立复杂网络实体网络的Space L模型

地铁网络,一般都有三四百个节点,线路十几条左右,看地铁图的是一个眼花缭乱。若是人工统计出来数据也是一项大工程。看着就想放弃,但其实掌握一定的方法并没有那么的费劲。

  1. 按线路进行节点的统计,先编号,然后去除掉重合的节点
  2. 统计连接关系时有一定的规则:比如从左往右统计、从上往下统计,这样可以避免重复统计
  3. 不要直接列出邻接矩阵,先统计出连接关系生成邻接表,然后再转成邻接矩阵
  4. 关于邻接表,最好再检查一遍
  5. 以上工作最好分成数天进行,否则负荷工作效率低且出错率较高

可以看到,建模时候最头疼的就是数据的处理问题,运用以上的经验可以提升我们的效率,但是治标不治本,依旧会浪费掉我们大量的时间。其实,如果不考虑换乘站(重复节点),连接关系还是比较好统计的,比如一条线路有10个站点,按顺序分别为a、b、c….j,那么连接关系可以表示为下图的1-9列:

线路转化邻接表

最近有一个需求,要统计某市的公交网络,有300多条线路,大概有3000多节点。如果此时还按之前的办法:人工统计线路中的站点,然后进行编号的话,那整个工程量不仅巨大,并且在统计过程中也很容易出错。

所以可以让程序帮助我们去识别站点名称,然后依次给它们编号,这样就可以生成直接使用邻接表。

具体处理方式,可以大概分为以下几个步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
% 1.从xls文件中,读取数据(或者直接新建数据)
% rawDataNum是读取到的数值,可以是权重,数据类型:double
% rawDataStr是读取到的字符串,是邻接表,数据类型:cell

% 2.用b接收rawDataStr中的所有不重复的字符串,数据类型 cell

% 3.因为cell类型矩阵中存储的是字符串数据,不好处理
% 所以需要把b和rawDataStr转换为string数组b_str和raw_str
% 注意这里可以检查一下b_str中的字符串

%4.进行数据处理
test = [];

for i = 1:length(b_str)
for j = 1:length(raw_str)
%判断条件
if(raw_str(j,1) == b_str(i,1))
test(j,1) = i;
end


%判断条件
if(raw_str(j,2) == b_str(i,1))
test(j,2) = i;
end

end
end
%这时就可以得到邻接表test

%判断是否为无权网络,判断标准rawDataNum是否为空,这与你的初始数据有关
if(length(rawDataNum) ~= 0)
test = [test rawDataNum];
else
disp('无权网络')
end

%这一步就是把邻接表test直接转换为邻接矩阵A,
%可以参照:如何建立复杂网络实体网络的Space L模型中的函数
A = ainc2adj( test );
% 判断是否有孤立节点
if(length(find(~sum(A))))
disp('存在孤立节点')
end

测试邻接表:

结果:

邻接表

节点编号与名称对应关系:

可以看到效果还是不错的,而且不仅限于交通网络。对于一些较大型的实体网络,比如作者合作网络、社交网络,应该也会有不错的效果。欢迎大家与我进行交流,

该文章首发于:XuXing’s blog

复杂网络相关内容可以访问:复杂网络

© 2021 XuXing's blog All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero