📜  社交网络中的 Fatman 进化模型

📅  最后修改于: 2022-05-13 01:55:47.444000             🧑  作者: Mango

社交网络中的 Fatman 进化模型

先决条件:社交网络简介

在 Fatman 进化模型中,有 3 个主要概念来构建进化模型,即同质性、社会影响和封闭性。

  1. 同质性 - 彼此相似的人,他们倾向于彼此交朋友。
  2. 社会影响——人们因社会影响而改变他们的行为和属性。
  3. 包 - 有 3 种主要的闭包,即三元闭包、成员闭包和焦点闭包。
  • 三元闭包——在三元闭包中,如果 A 是 B 的朋友,B 是 C 的朋友,那么 C 最终将成为 A 的朋友。
  • 会员关闭-在会员关闭中,如果 A 和 B 在同一个俱乐部,那么他们有成为朋友的趋势。
  • 焦点闭合——当他们有相同的焦点时成为朋友的概率。

所以,根据法特曼假说,要小心胖友,如果你的朋友很胖,那么你发胖的概率就会变高。

现在下面的代码将通过一个例子向您展示使用Python中的进化模型来实现上述3个概念。

假设有一个城市有很多人,我们有每个人的 BMI。然后我们将看到随着进化的继续,具有相似 BMI 的人们彼此成为朋友,这就是同质性。然后我们将创建一些像 Gym 等的焦点,看看具有相似焦点的人最终如何成为朋友,然后我们将实施社交焦点。

算法:

  1. 创建一个包含 N 个节点的图,
  2. 为每个节点添加边和标签。
  3. 现在为每个节点添加社交焦点和社交焦点标签
  4. .现在实现同质化。
  5. 之后实施关闭。
  6. 最后发挥社会影响力。
  7. 现在可视化图表。

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)


输出:

输出包含具有同质性、闭合性和行为变化(即社会影响)的图。