优先附件,Matlab 中的复杂网络
Preferential Attachment, Complex Networks in Matlab
大家好!
我现在正在 MATLAB 中研究优先依恋模型,但我在理解以下内容时遇到了一些困难:
假设我一开始有4个节点,连接如下:
time = 0
1 <-----> 2
3 <-----> 4
在下一个时间步骤中,我添加一个节点和 4 个连接,然后添加另一个节点和 4 个连接。
我与节点 i 的链接概率的公式是:
P_link(i) = degree(i) / sum of all degrees at time-1
这导致第一步中每个节点 i = 1 到 4 的概率为 1/4,然后,将节点 5 连接到 1、2、3 和 4,我将得到 "sum of degrees" = 12,当在后面的时间步添加节点6时。
这意味着链接概率为:1/6、1/6、1/6、1/6 和 1/3。
如何在 MATLAB 中进行设置?我的问题是,我通常将这些东西写在纸上以获得更好的理解,如果有随机化,我只是 "simulate" 将其写在纸上以将其与简单的 MATLAB 程序进行比较。
我现在要做的是:我取一个随机数,比方说 0.3045。
要将其添加到节点,它必须在
的范围内
node1: [0.0000, 1/6],
node2: [1/6, 1/3],
node3: [1/3, 1/2],
node4: [1/2, 2/3],
node5: [2/3, 1.0000].
---> CONNECT to node2
所以对于第一步,我知道如何去做,但现在我有两个不同的问题,我认为它们密切相关:
- 我怎样才能在 MATLAB 中实现这个,范围方法是个好主意吗?
- 在为其余部分添加第一个连接后,概率如何变化,假设它只能连接到每个节点一次? (这可能是我不得不承认的一个更数学的问题......)
非常抱歉,这个问题看起来很乱,但我希望有人能给我一些关于这个实现的提示。
提前致谢!
我会做以下事情...
有邻接矩阵
>> A = [0 1 0 0; 1 0 0 0; 0 0 0 1; 0 0 1 0]
和度数矩阵
>> D = sum(A)
在每次迭代中,任意顶点i
的度数为D(i)
,总度数为
>> d = sum(D)
请注意,您希望在第一次迭代之前获得 d
,然后在迭代循环的最后再次获得,以便它保持 time-1
的值,在这种情况下你可能想通过
来规范化 P
>> P = P ./ max(P)
然后计算选择任何顶点的概率(即简化范围方法)
>> P = cumsum(D ./ d)
ans = [0.2500, 0.5000, 0.7500, 1.0000]
并且使用范围 <0,1>
中的随机标量数 r
,您通过
选择随机选择的顶点的索引 i
>> i = find([-1 P]<r, 1, 'last')
并将索引为 j
的新顶点推送到 A
,将其连接到旧顶点 i
,您只需
>> A(i, j) = 1
>> A(j, i) = 1
现在您只需将所有内容包含在 loop 中,您的问题就解决了 ;]
大家好!
我现在正在 MATLAB 中研究优先依恋模型,但我在理解以下内容时遇到了一些困难:
假设我一开始有4个节点,连接如下:
time = 0
1 <-----> 2
3 <-----> 4
在下一个时间步骤中,我添加一个节点和 4 个连接,然后添加另一个节点和 4 个连接。
我与节点 i 的链接概率的公式是:
P_link(i) = degree(i) / sum of all degrees at time-1
这导致第一步中每个节点 i = 1 到 4 的概率为 1/4,然后,将节点 5 连接到 1、2、3 和 4,我将得到 "sum of degrees" = 12,当在后面的时间步添加节点6时。
这意味着链接概率为:1/6、1/6、1/6、1/6 和 1/3。
如何在 MATLAB 中进行设置?我的问题是,我通常将这些东西写在纸上以获得更好的理解,如果有随机化,我只是 "simulate" 将其写在纸上以将其与简单的 MATLAB 程序进行比较。
我现在要做的是:我取一个随机数,比方说 0.3045。
要将其添加到节点,它必须在
node1: [0.0000, 1/6],
node2: [1/6, 1/3],
node3: [1/3, 1/2],
node4: [1/2, 2/3],
node5: [2/3, 1.0000].
---> CONNECT to node2
所以对于第一步,我知道如何去做,但现在我有两个不同的问题,我认为它们密切相关:
- 我怎样才能在 MATLAB 中实现这个,范围方法是个好主意吗?
- 在为其余部分添加第一个连接后,概率如何变化,假设它只能连接到每个节点一次? (这可能是我不得不承认的一个更数学的问题......)
非常抱歉,这个问题看起来很乱,但我希望有人能给我一些关于这个实现的提示。
提前致谢!
我会做以下事情...
有邻接矩阵
>> A = [0 1 0 0; 1 0 0 0; 0 0 0 1; 0 0 1 0]
和度数矩阵
>> D = sum(A)
在每次迭代中,任意顶点i
的度数为D(i)
,总度数为
>> d = sum(D)
请注意,您希望在第一次迭代之前获得 d
,然后在迭代循环的最后再次获得,以便它保持 time-1
的值,在这种情况下你可能想通过
P
>> P = P ./ max(P)
然后计算选择任何顶点的概率(即简化范围方法)
>> P = cumsum(D ./ d)
ans = [0.2500, 0.5000, 0.7500, 1.0000]
并且使用范围 <0,1>
中的随机标量数 r
,您通过
i
>> i = find([-1 P]<r, 1, 'last')
并将索引为 j
的新顶点推送到 A
,将其连接到旧顶点 i
,您只需
>> A(i, j) = 1
>> A(j, i) = 1
现在您只需将所有内容包含在 loop 中,您的问题就解决了 ;]