社交网络分析——影响力最大化(附带python例子实现)

本文通过python实现影响力最大化模型,所用例子为空手道俱乐部。

文章目录:
社交网络分析——信息传播模型(附带三个模型的python实现)
信息传播模型——SIR的Python实现

大纲:

  1. 什么是影响力
  2. 衡量影响力
  3. 影响力最大化问题

影响力定义:
影响力,一般认为指的是用一种为别人所乐于接受的方式,改变他人的思想和行动的能力。(搜狗百科)

影响,控制或操纵某物或某人的权力; 改变诸如行为,思想或决定之类的波动事物发展的能力。

影响扩散的因素

  • 网络结构(无权)
    密度
    度分布
    连通区域
    社区结构
  • 链接强度(有权)
    交流频率
    影响力
  • 信息质量
    信息的吸引力和特殊性

影响力最大化
问题:选择k个种子用户去最大化影响用户数量
输入:具有边影响概率的社交网络图
输出:大小为k的种子集合

问题陈诉:

  • 集合S的扩散:F(S)
    如果集合S为初始集合,则结果为期望的激活节点的数量;
  • 问题:
    给定一个参数k,找到一个节点数为k的集合S来最大化F(S)
    以F(S)为目标函数的约束优化问题

F(S)特性:
非负的
单调的:F(S+v)≥F(S)

代码:

import networkx as nx
import numpy as np
import random

'''
author:xiao黄
time:2020.10.23
blog:https://blog.csdn.net/Python_Matlab
'''

# 计算节点集的影响力
def influence_computation_IC(seed):
    influence = 0
    if len(seed) == 0: # 种子为0 直接返回0 -> 无影响力
        return influence

    for i in range(R):
        result_list = []
        result_list.extend(seed)

        # 保存激活的状态
        checked = np.zeros(g.number_of_nodes()) 
        for node in result_list:
            checked[node] = 1

        # 当前节点不为空,进行影响
        while len(result_list) != 0:
            influence += 1
            current_node = result_list.pop(0)
            for nbr in g.neighbors(current_node): # 得到当前节点的邻居节点
                if checked[nbr] == 0:
                    wt = g.get_edge_data(current_node, nbr)
                    if random.uniform(0,1) < wt['weight']:
                        checked[nbr] = 1
                        result_list.append(nbr)

    return influence/R

if __name__ == "__main__":
    k = 3 # 影响力最大的几个点,这里设置为三个点
    R = 1000 # 传播过程 一般 10000次
    seed = []
    node_list = []
    
    g = nx.karate_club_graph() # 空手道俱乐部

    for edge in g.edges:
        g.add_edge(edge[0], edge[1], weight=random.uniform(0,1)) # 权值为(0,1)
    
    for i in range(k):
        f = np.zeros(g.number_of_nodes())
        state = np.zeros(g.number_of_nodes())
        for v in seed:
            state[v] = 1
        for v in g.nodes:
            node_list.extend(seed)
            if state[v] == 0:
                node_list.append(v)
                f[v] = influence_computation_IC(node_list) - influence_computation_IC(seed)  
            node_list.clear()
        print(f)
        seed.append(f.argmax()) 
    print(seed)

运行结果:

[25.077 24.788 25.167 25.008  9.963 12.557 13.154 21.757 24.127 23.861
 10.47  13.772 21.72  25.032 16.781 22.805 12.536 17.224  3.04  23.631
  5.204 15.163 24.503 25.039 15.542 18.434 23.283 13.992 18.303 24.907
 23.444 24.781 25.    25.121]
[ 0.184 -0.157  0.     0.348  1.339  1.693  1.554  0.178  0.17   0.032
  1.177  0.424  0.308  0.216  0.725  0.135  1.614  0.228  0.97   0.375
  0.7    0.275  0.284  0.385  0.814  0.704  0.391  1.007  0.45   0.384
 -0.121  0.389  0.17   0.387]
[-0.086  0.142  0.     0.102  0.759  0.     0.267  0.18   0.099 -0.091
  0.734  0.282  0.199  0.203  0.57   0.277 -0.017  0.374  0.906  0.45
  0.762  0.555  0.232  0.237  0.95   0.337  0.326  0.863  0.487  0.284
  0.141  0.318  0.234  0.24 ]
[2, 5, 24]

其中[2,5,24]为某次运行得到的影响力最大化的三个节点。

注意:因为本文中边的权值是随机的,所以每次运行结果可能不一样。

  • 5
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiao黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值