网络和属性(节点 - 邻居)
Network and attributes (nodes - neighbors)
在此示例中,来自数据帧 df 的网络具有 4 个节点和 5 个链接:
N T P
1 2 B
1 3 B
2 1 A
2 3 A
2 4 A
3 1 B
3 2 B
3 4 B
4 2 A
4 3 A
节点具有以下属性(摘要):
N P
1 B
2 A
3 B
4 A
对于每个节点,我需要计算相同类型的邻居的比例。
通过连接两个数据帧来构建网络,如果我 select 个节点 P=A
,我有:
N F1
1 1/2 # node 1 has only one node having P=A
2 1/3 # node 2 has 1 node with P=A and two with P=B
3 1/3
4 1/2
一旦我有了这个列表,我就需要为每个节点提供在该节点的 P=A
邻居上方找到的值的平均值列表。
这意味着
N F2
1 1/3
2 1/2
3 1/2, 1/3
4 1/3
构建网络的代码
G = nx.from_pandas_edgelist(df, source='N', target='T')
colors = []
for node in G:
if node in df["P"].values:
colors.append("lightblue")
else: colors.append("lightgreen")
nx.draw(G,
node_color=colors,
with_labels=True)
我不知道如何检查节点的邻居并计算它们具有相同 P 的概率,所以如何获得预期的输出 F1 和 F2。我觉得问题出在这上面。
获得 F1
非常简单。对于每一个唯一的节点属性值,归纳出一个子图,计算边数,除以节点的整体度数。
#!/usr/bin/env python
"""
Compute homophily score by node.
"""
import numpy as np
import matplotlib.pyplot as plt
import networkx as nx
if __name__ == '__main__':
edges = [
(1, 2),
(1, 3),
(2, 1),
(2, 3),
(2, 4),
(3, 1),
(3, 2),
(3, 4),
(4, 2),
(4, 3),
]
nodes = [
(1, {'property' : 'B'}),
(2, {'property' : 'A'}),
(3, {'property' : 'B'}),
(4, {'property' : 'A'}),
]
g = nx.Graph()
g.add_nodes_from(nodes)
g.add_edges_from(edges)
neighbours_of_same_type = dict()
for letter in 'AB':
nodes_with_property = [node for node, data in g.nodes(data=True) if data['property'] == letter]
h = g.subgraph(nodes_with_property)
neighbours_of_same_type.update(h.degree)
degree = dict(g.degree)
output = dict()
for node, _ in nodes:
output[node] = neighbours_of_same_type[node] / degree[node]
print(output)
# {1: 0.5, 2: 0.3333333333333333, 3: 0.3333333333333333, 4: 0.5}
Once I have this list, I'd need for each node either the list of mean of the values found above of the node's P=A neighbors.
你对 F2
的定义对我来说意义不大,但我怀疑它可以很容易地从 F1 计算出来?
在此示例中,来自数据帧 df 的网络具有 4 个节点和 5 个链接:
N T P
1 2 B
1 3 B
2 1 A
2 3 A
2 4 A
3 1 B
3 2 B
3 4 B
4 2 A
4 3 A
节点具有以下属性(摘要):
N P
1 B
2 A
3 B
4 A
对于每个节点,我需要计算相同类型的邻居的比例。
通过连接两个数据帧来构建网络,如果我 select 个节点 P=A
,我有:
N F1
1 1/2 # node 1 has only one node having P=A
2 1/3 # node 2 has 1 node with P=A and two with P=B
3 1/3
4 1/2
一旦我有了这个列表,我就需要为每个节点提供在该节点的 P=A
邻居上方找到的值的平均值列表。
这意味着
N F2
1 1/3
2 1/2
3 1/2, 1/3
4 1/3
构建网络的代码
G = nx.from_pandas_edgelist(df, source='N', target='T')
colors = []
for node in G:
if node in df["P"].values:
colors.append("lightblue")
else: colors.append("lightgreen")
nx.draw(G,
node_color=colors,
with_labels=True)
我不知道如何检查节点的邻居并计算它们具有相同 P 的概率,所以如何获得预期的输出 F1 和 F2。我觉得问题出在这上面。
获得 F1
非常简单。对于每一个唯一的节点属性值,归纳出一个子图,计算边数,除以节点的整体度数。
#!/usr/bin/env python
"""
Compute homophily score by node.
"""
import numpy as np
import matplotlib.pyplot as plt
import networkx as nx
if __name__ == '__main__':
edges = [
(1, 2),
(1, 3),
(2, 1),
(2, 3),
(2, 4),
(3, 1),
(3, 2),
(3, 4),
(4, 2),
(4, 3),
]
nodes = [
(1, {'property' : 'B'}),
(2, {'property' : 'A'}),
(3, {'property' : 'B'}),
(4, {'property' : 'A'}),
]
g = nx.Graph()
g.add_nodes_from(nodes)
g.add_edges_from(edges)
neighbours_of_same_type = dict()
for letter in 'AB':
nodes_with_property = [node for node, data in g.nodes(data=True) if data['property'] == letter]
h = g.subgraph(nodes_with_property)
neighbours_of_same_type.update(h.degree)
degree = dict(g.degree)
output = dict()
for node, _ in nodes:
output[node] = neighbours_of_same_type[node] / degree[node]
print(output)
# {1: 0.5, 2: 0.3333333333333333, 3: 0.3333333333333333, 4: 0.5}
Once I have this list, I'd need for each node either the list of mean of the values found above of the node's P=A neighbors.
你对 F2
的定义对我来说意义不大,但我怀疑它可以很容易地从 F1 计算出来?