社交网络中的 Fatman 进化模型
先决条件:社交网络简介
在 Fatman 进化模型中,有 3 个主要概念来构建进化模型,即同质性、社会影响和封闭性。
- 同质性 - 彼此相似的人,他们倾向于彼此交朋友。
- 社会影响——人们因社会影响而改变他们的行为和属性。
- 闭包 - 有 3 种主要的闭包,即三元闭包、成员闭包和焦点闭包。
- 三元闭包——在三元闭包中,如果 A 是 B 的朋友,B 是 C 的朋友,那么 C 最终将成为 A 的朋友。
- 会员关闭-在会员关闭中,如果 A 和 B 在同一个俱乐部,那么他们有成为朋友的趋势。
- 焦点闭合——当他们有相同的焦点时成为朋友的概率。
所以,根据法特曼假说,要小心胖友,如果你的朋友很胖,那么你发胖的概率就会变高。
现在下面的代码将通过一个例子向您展示使用Python中的进化模型来实现上述3个概念。
假设有一个城市有很多人,我们有每个人的 BMI。然后我们将看到随着进化的继续,具有相似 BMI 的人们彼此成为朋友,这就是同质性。然后我们将创建一些像 Gym 等的焦点,看看具有相似焦点的人最终如何成为朋友,然后我们将实施社交焦点。
算法:
- 创建一个包含 N 个节点的图,
- 为每个节点添加边和标签。
- 现在为每个节点添加社交焦点和社交焦点标签
- .现在实现同质化。
- 之后实施关闭。
- 最后发挥社会影响力。
- 现在可视化图表。
Fatman 进化模型的Python代码:
Python3
import networkx as nx
import matplotlib.pyplot as plt
import random
import math
# 1- Create a graph with lets say 100 nodes
# 2- Add egdes and labels.
def create():
G = nx.Graph()
G.add_nodes_from(range(1, 101))
return G
def visualize(G):
labeldict = get_labels(G)
nodesize = get_size(G)
color = get_colors(G)
nx.draw(G, labels=labeldict, node_size=nodesize, node_color=color)
plt.show()
def assign_bmi(G):
for each in G.nodes():
G.nodes[each]['name'] = random.randint(15, 40)
G.nodes[each]['type'] = 'person'
def get_labels(G):
dict1 = {}
for each in G.nodes():
dict1[each] = G.nodes[each]['name']
return dict1
def get_size(G):
array1 = []
for each in G.nodes():
if (G.nodes[each]['type'] == 'person'):
array1.append(G.nodes[each]['name'] * 20)
else:
array1.append(500)
return array1
# 3. Add foci nodes
def add_foci_nodes(G):
n = G.number_of_nodes()
i = n + 1
foci_nodes = ['gym', 'eatout', 'movie_club',
'karate_club', 'yoga_club']
for j in range(5):
G.add_node(i)
G.nodes[i]['name'] = foci_nodes[j]
G.nodes[i]['type'] = 'foci'
i += 1
def get_colors(G):
c = []
for i in G.nodes():
if (G.nodes[i]['type'] == 'person'):
if (G.nodes[i]['name'] == 15):
c.append('yellow')
elif (G.nodes[i]['name'] == 40):
c.append('green')
else:
c.append('blue')
else:
c.append('red')
return c
def get_person_nodes(G):
p = []
for i in G.nodes():
if (G.nodes[i]['type'] == 'person'):
p.append(i)
return p
def get_foci_nodes(G):
f = []
for i in G.nodes():
if (G.nodes[i]['type'] == 'foci'):
f.append(i)
return f
def add_foci_edges(G):
foci_nodes = get_foci_nodes(G)
person_nodes = get_person_nodes(G)
for i in person_nodes:
r = random.choice(foci_nodes)
G.add_edge(i, r)
# 4. Implement Homophily
def homophily(G):
pnodes = get_person_nodes(G)
for u in pnodes:
for v in pnodes:
if (u != v):
diff = abs(G.nodes[u]['name'] - G.nodes[v]['name'])
p = 1 / (diff + 1000)
r = random.uniform(0, 1)
if (r < p):
G.add_edge(u, v)
# 5. Implement Closure
def common(u, v, G):
nu = set(G.neighbors(u))
nv = set(G.neighbors(v))
return (len(nu & nv))
def closure(G):
array1 = []
for u in G.nodes():
for v in G.nodes():
if (u != v and G.nodes[u]['type'] == 'person' or G.nodes[v]['type'] == 'person'):
# common function will return start node,
# end node and Graph itself.
k = common(u, v, G)
p = 1 - math.pow(1 - 0.01, k)
tmp = []
tmp.append(u)
tmp.append(v)
tmp.append(p)
array1.append(tmp)
for i in array1:
u = i[0]
v = i[1]
p = i[2]
r = random.uniform(0, 1)
if r < p:
G.add_edge(u, v)
# 6. Implement Social Influence
def social_influence(G):
fnodes = get_foci_nodes(G)
for i in fnodes:
if (G.nodes[i]['name'] == 'eatout'):
for j in G.neighbors(i):
if (G.nodes[j]['name'] != 40):
G.nodes[j]['name'] = G.nodes[j]['name'] + 1
if (G.nodes[i]['name'] == 'gym'):
for j in G.neighbors(i):
if (G.nodes[j]['name'] != 15):
G.nodes[j]['name'] = G.nodes[j]['name'] - 1
G = create()
assign_bmi(G)
# to add foci field in the nodes
add_foci_nodes(G)
add_foci_edges(G)
visualize(G)
for t in range(1, 3):
homophily(G)
visualize(G)
closure(G)
visualize(G)
social_influence(G)
visualize(G)
输出:
输出包含具有同质性、闭合性和行为变化(即社会影响)的图。