作者:JUDGE_MENT
邮箱:gao19920804@126.com
优快云博客:http://blog.youkuaiyun.com/sinat_23137713
最后编辑时间:2016.12.5 V1.1
声明:
1)该资料结合官方文档及网上大牛的博客进行撰写,如有参考会在最后列出引用列表。
2)本文仅供学术交流,非商用。如果不小心侵犯了大家的利益,还望海涵,并联系博主删除。
3)本人才疏学浅,难免出错,还望各位大牛悉心指正。
4)转载请注明出处。
一、 纵向网络/动态网络是一种包括时间信息的简单网络。你可以想象一下关你的朋友关系网络;节点数和连接数随着时间的增长而增长,属性值也随之变化。如果每个人都有一个"孩子数"属性,这个属性也是可能会增长的《o(* ̄︶ ̄*)o, 还不去生孩子》。我们称之为动态属性,他们的值是与根据特定的时间段相关的。
纵向网络
为了使用gephi对这些特征进行建模,我们使用区间的概念来定义一段时间。有两种基本的方式来对纵向网络进行建模,一种是每个网络集合都有一个特定的时间点(一天,一个月,…),或是网络片段中的每个元素都有其存在时间。这可以分别看作是离散时间与连续时间的表示方式。本文中我们选择第二种方式,因为他更加灵活。
举例来说:
如果我们有一个三年包含三个点的网络。下面左边的是方法1(网络集合)在不同的三个时间点。右边是相应的方法2(每个元素)表示使用间隔。(右边n1的右区间是开的,因为这个点只在2008有,2009就没了)
在
Gephi
中你可以在“数据实验室”中看到时间区间是如何被创建的。如果网络是纵向的,将会有一个时间区间列。这列给出了元素的应该存在的时间区间。你可以通过在数据实验室配置对话框,开启展示时间区间图表选项,这样你就可以可视化了。
二、 导入动态GEXF文件
你在GEXF中增加开始和结束的位置就是设置一个点或边的开始或消失。
1、基本的例子:
<?xml version="1.0" encoding="UTF-8"?>
<gexfxmlns="http://www.gexf.net/1.1draft"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.gexf.net/1.1draft
http://www.gexf.net/1.1draft/gexf.xsd"
version="1.1">
<graphmode="dynamic"defaultedgetype="directed">
<nodes>
<nodeid="n1"label="Node 1"start="2007"endopen="2009" />
<nodeid="n2"label="Node 2"start="2007"end="2009" />
<nodeid="n3"label="Node 3"start="2008"end="2009" />
</nodes>
<edges>
<edgesource="n1"target="n2" />
<edgesource="n1"target="n3"start="2008"/>
<edgesource="n3"target="n2"start="2008"endopen="2009"/>
</edges>
</graph>
</gexf>
注意以下几点:
1. 我们将图 模式设为“dynamic”,这是必须的,因为GEXF格式也可以展现静态图。
2. 对于闭区间的就用start和end;如果是开区间的就用startopen和endopen。
3. 不强制一定要对于每一个元素都设定一个开始和结束时间。如果不设置自动创建一个[-infinity,+infinity]这么个时间间隔,从正无穷到负 无穷。如果只有一个边界被定义了,像上诉代码第二条边似的,那么将会自动变成 [2009,+inf].
2、动态属性
<gexfxmlns="http://www.gexf.net/1.1draft"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.gexf.net/1.1draft
http://www.gexf.net/1.1draft/gexf.xsd"
version="1.1">
<graphmode="dynamic"defaultedgetype="directed">
<attributesclass="node"mode="dynamic">
<attributeid="price"title="Price"type="float"/>
</attributes>
<nodes>
<nodeid="n1"label="Node 1"start="2007"endopen="2009" >
<attvalues>
<attvaluefor="price"value="25.5"start="2007"end="2008"/>
<attvaluefor="price"value="42.5"start="2008"/>
</attvalues>
</node>
<nodeid="n2"label="Node 2"start="2007"end="2009" >
<attvalues>
<attvaluefor="price"value="12"start="2008"/>
</attvalues>
</node>
<nodeid="n3"label="Node 3"start="2008"end="2009" >
<attvalues>
<attvaluefor="price"value="40.5"start="2008"end="2009" />
</attvalues>
</node>
</nodes>
<edges>
<edgesource="n1"target="n2" />
<edgesource="n1"target="n3"start="2008"/>
<edgesource="n3"target="n2"start="2008"endopen="2009"/>
</edges>
</graph>
</gexf>
attvalues
:属性值
注意以下几点:
不强制到处设置属性值 ,为了防止没值,我们可以使用默认值。
对于节点 n2 ,他的价格“ 12 ”从 2008 年开始,但是没有定义结束时间,这会自动调整为 [2008 , +infinity] 。
3. 动态权值
方法就是定义边的时候加上“weight”。然后,使用“attvalue”来设置weight的变化。跟节点属性那一样。
<attributes class="edge" mode="dynamic">
<attribute id="weight" title="Weight" type="float"/>
</attributes>
三. 时间列转换为动态网络
想象你和一些朋友的社交网络。每个节点都是一个朋友,一个属性列是你遇到一个朋友的日期。问题是我们怎样才能将这个列转换成一个动态的时间间隔,然后通过时间线探索整个网络。
步骤1:点击 数据实验室 - 合并列
注意,开区间似乎已经被弃用了
步骤
3
:选择哪列是开始,选择哪列是结束。如果没有结束时间,就留空。如果列是数字化的(整数,浮点型,长浮点型),那么就选择“
parse numbers
”。如果数据是
string
形式的,他们也可以被解析转换为时间间隔。我们的“
fiist met
”列就是一年中的某一天,就是一个数字而已。
四. 使用时间框架,导入多个静态的GEXF充当动态的GEXF
注意,这个方法的实现仍然处于试验阶段,而且可能不会在所有的情况下工作。一定要确认以下几点:
- 不同文件中,节点标识符完全要一样(至少标签要一致)。
- GEXF文件中设置为static
- gephi工作区要保持干净,不要有别的图
- 属性列在所有GEXF中都是一样的
1. 数据集
假如说我们有三个静态GEXF,分别是2007年的GEXF,2008年的GEXF和2009年的GEXF。2007年的静态网络如下,注意价格属性:
<?xml version="1.0" encoding="UTF-8"?>
<gexfxmlns="http://www.gexf.net/1.1draft"version="1.1">
<graphmode="static"defaultedgetype="directed">
<attributesclass="node"type="static">
<attributeid="price"title="Price"type="int"/>
</attributes>
<nodes>
<nodeid="1"label="Node 1">
<attvaluefor="price"value="12"/>
</node>
<nodeid="2"label="Node 2">
<attvaluefor="price"value="8"/>
</node>
<nodeid="3"label="Node 3">
<attvaluefor="price"value="5"/>
</node>
</nodes>
<edges>
<edgesource="1"target="2"weight="1" />
<edgesource="1"target="3"weight="2" />
</edges>
</graph>
</gexf>
2008年的静态网络如下,节点“3”消失了,一个节点出现“4”。价格和边缘的权重也已经改变了。
<?xml version="1.0" encoding="UTF-8"?>
<gexfxmlns="http://www.gexf.net/1.1draft"version="1.1">
<graphmode="static"defaultedgetype="directed">
<attributesclass="node"type="static">
<attributeid="price"title="Price"type="int"/>
</attributes>
<nodes>
<nodeid="1"label="Node 1">
<attvaluefor="price"value="15"/>
</node>
<nodeid="2"label="Node 2">
<attvaluefor="price"value="6"/>
</node>
<nodeid="4"label="Node 4">
<attvaluefor="price"value="8"/>
</node>
</nodes>
<edges>
<edgesource="1"target="2"weight="4" />
<edgesource="1"target="4"weight="3" />
<edgesource="2"target="4"weight="1" />
</edges>
</graph>
</gexf>
静态网络在2009年, 节点“3”回来了,节点“2”消失了, 并且再次改变价格。
<?xml version="1.0" encoding="UTF-8"?>
<gexfxmlns="http://www.gexf.net/1.1draft"version="1.1">
<graphmode="static"defaultedgetype="directed">
<attributesclass="node"type="static">
<attributeid="price"title="Price"type="int"/>
</attributes>
<nodes>
<nodeid="1"label="Node 1">
<attvaluefor="price"value="10"/>
</node>
<nodeid="3"label="Node 3">
<attvaluefor="price"value="3"/>
</node>
<nodeid="4"label="Node 4">
<attvaluefor="price"value="12"/>
</node>
</nodes>
<edges>
<edgesource="1"target="3"weight="5" />
</edges>
</graph>
</gexf>
2. 导入Gephi
步骤1:导入第一个GEXF文件,并在导入报告是选择Time Frame,单击OK。这将显示一个设置对话框。
步骤2:选择一个日期或一个数字作为时间。默认选择是一个数字,这里我们把2007年输入。单击OK,文件导入。
步骤3: 现在你重复步骤2。只是相应的时间,第二个文件选择2008、..2009等。
结果就会得到在Gephi里出现的纵向/动态网络,节点和边有他们相应的时间段。同样的,所有属性都是动态属性。数据集中的“价格”属性是DYNAMIC_INTEGER格式的列。此外,边的权重也是动态的。