独立级联(Independent Cascade)模型的原理及代码实现
目录
- 1. 原理
- 2. 代码实现
- 2.1 数据集
- 2.2 独立级联
1. 原理
独立级联模型在影响力最大化任务中属于比较经典的影响力传播模型。
具体来讲,针对某一具体传播的实体(谣言、绯闻、产品等),将图中的每个点描述为两种可能状态:不活跃(inactive)和活跃(active)。不活跃状态表示该个体还没有接受对应实体,而活跃状态表示该个体已经接受对应的实体。节点从不活跃状态变为活跃状态表示该节点接受了对应实体,也称之为被激活。
在社交网络间,如果存在边e=(u,v)
,我们可以说节点u
对节点v
存在影响力,反之不一定。给定一个初始的激活节点集合(也称为种子节点集合)
,集合中的节点将以一定概率去激活(影响)
它们未被激活的邻居节点,被激活的邻居节点又继续去激活剩下的未被激活的邻居节点,如此往复,直至没有节点可激活。需要注意的是,每个被激活的节点只有一次机会去激活其未被激活的邻居节点,如果未激活就不再尝试。
独立级联模型的关键在于“独立”
,对于一个未被激活的节点v
来讲,在t
时刻其邻居节点中可能存在多个在t-1
时刻被激活的邻居节点,这些邻居节点都会尝试激活节点v
,而这些激活动作间是相互独立的。
假设在t
时刻节点v
有n
个在t-1
时刻被激活的邻居节点a1,a2,...,ana_1, a_2,...,a_na1,a2,...,an,这些节点激活节点v
的概率分别为pa1,v,pa2,v,...,pan,vp_{a_1,v},p_{a_2,v},...,p_{a_n,v}pa1,v,pa2,v,...,pan,v,那么节点vvv被激活的概率为:
1−(1−pa1,v)(1−pa2,v)...(1−pan,v)1-(1-p_{a_1,v})(1-p_{a_2,v})...(1-p_{a_n,v})1−(1−pa1,v)(1−pa2,v)...(1−pan,v)
具体来讲,只要有一个节点将节点v
激活那么节点v
就被激活。
那么算法步骤可以被分解为:
- 初始化种子节点,然后激活种子节点作为初始激活集合。
- 寻找尚未被激活且有激活节点作为邻居节点的节点,放入备选节点集合。
- 将激活集合清空。依次对备选节点集合中的节点计算激活概率,然后尝试激活,激活过程具体来讲为:随机初始化一个概率值,如果激活概率大于等于该值则进行激活。被激活的节点将被放进激活集合。
- 重复23步骤,直至没有可激活的节点。
2. 代码实现
在本次代码实现中,每个节点激活邻居节点的概率都由采样得到,采样分布为01之间的均匀分布。
2.1 数据集
数据集采用PyG中已经处理好的GemsecDeezer数据集,具体来讲为:
data = GemsecDeezer('data', name='RO')
graph = data[0]
G = to_networkx(graph)
GemsecDeezer表示从一个音乐网站Deezer上收集到的用户及其关注者社交网络,一共包含三个欧洲国家的用户:
其中name=RO
表示罗马尼亚用户数据集。
2.2 独立级联
首先为每条边(u,v)
都初始化一个概率值,表示节点u
激活节点v
的概率:
# init probability
init_pro = uniform(size=G.number_of_edges())
for idx, e in enumerate(G.edges()):G[e[0]][e[1]]['p'] = init_pro[idx]
初始的种子节点设置:
init_seed = [4606]
然后是IC模型的定义:
def ic_model():activated = copy.deepcopy(init_seed)activated_status = np.zeros(G.number_of_nodes(), dtype=int)# initial activatefor seed in init_seed:activated_status[seed] = 1while True:# 寻找未被激活且与激活节点相连的节点candidate_nodes = []candidate_nodes_pro = {}for v in G.nodes():candidate_nodes_pro[v] = []for u in activated:if G.has_edge(u, v) and activated_status[v] != 1:if v not in candidate_nodes:candidate_nodes.append(v)# 添加概率candidate_nodes_pro[v].append(G[u][v]['p'])print(candidate_nodes)if len(candidate_nodes) == 0:break# 计算概率probability = []for candidate_node in candidate_nodes:pro = 1.0for p in candidate_nodes_pro[candidate_node]:pro = pro * (1 - p)probability.append(1 - pro)# 尝试激活# 下一轮传播过程中的初始激活节点是本轮被激活的节点activated = []for candidate_node, pro in zip(candidate_nodes, probability):s = random.random()if pro >= s:activated_status[candidate_node] = 1activated.append(candidate_node)return activated_status
最后返回网络中所有节点的激活状态。
独立级联(Independent Cascade)模型的原理及代码实现相关推荐
- Epoll 反应堆模型核心原理及代码讲解
Epoll 反应堆模型核心原理及代码讲解 [Ⅰ] Epoll 原理及应用 && ET模式与LT模式 [Ⅱ] Epoll 反应堆模型核心原理及代码讲解 一.反应堆核心原理 二.反应堆模型 ...
- Glove模型的原理与代码
文章目录 一.背景 二.原理部分 1.共现矩阵 2. F值的获取 3. Glove公式的获取 4. 损失函数的获取 三.代码部分 1.词表映射 2. 词嵌入 3. 训练函数 4. 输出结果 总结 一. ...
- 手把手写深度学习(18):finetune微调CLIP模型的原理、代码、调参技巧
前言:在前面的博客<手把手写深度学习(16):用CILP预训练模型搭建图文检索系统/以图搜图/关键词检索系统>中介绍了如何在图文检索.以图搜图.关键词检索等任务中使用CLIP.这篇博客重点 ...
- mmpose关键点(四):优化关键点模型(原理与代码讲解,持续更新)
在工程中,模型的运行速度与精度是同样重要的,本文中,我会运用不同的方法去优化比较模型的性能,希望能给大家带来一些实用的trick与经验. 有关键点检测相关经验的同学应该知道,关键点主流方法分为Heat ...
- 独立级联模型线性阈值模型
预备知识 一个社交网络描述成一张有向图G,其中V是节点的集合,E⊆V∗VE\subseteq V*VE⊆V∗V是有向边的集合. 每一个节点v∈Vv\in Vv∈V代表一个社交网络中的人,每一条边(u, ...
- python 靶心_手把手教你使用Python实战反欺诈模型|原理+代码
原标题:手把手教你使用Python实战反欺诈模型|原理+代码 作者 | 萝卜 来源 | 早起Python(ID: zaoqi-python) 本文将基于不平衡数据,使用Python进行 反欺诈模型数据 ...
- OpenCV56:级联分类器|Cascade Classifier
目标 在本教程中, 将学习 Haar级联对象检测的工作原理 将使用基于Haar Feature的Cascade分类器了解人脸检测和眼睛检测的基础知识 将使用cv::CascadeClassifier类 ...
- 使用opencv训练目标检测模型基于cascade模型
使用opencv训练目标检测模型基于cascade模型 基于Haar特征的cascade分类器(classifiers) 是Paul Viola和 Michael Jone在2001年,论文" ...
- OpenCV级联分类器Cascade Classifier
OpenCV级联分类器Cascade Classifier 级联分类器Cascade Classifier 目标 理论 OpenCV中的Haar级联检测 结果 级联分类器Cascade Classif ...
最新文章
- 刚进园子,广州的冬天像夏天
- HDU 1061 Rightmost Digit
- 安装python,如果让升级版本的话
- 脆弱的Scrum,敏捷在哪里?
- HTML 5 Web 音频
- Pycharm同步git代码提示:Merge failed
- c语言图形化编程入门_C语言C++新手入门,VS2013编程器安装教程
- 前端之旅,做一点有回报的事情
- 重温《数据库系统概论》【第一篇 基础篇】【第2章 关系数据库】
- JavaScript 变量提升
- __mmc_claim_host
- No rule to make target `/usr/lib/arm-linux-gnueabihf/libopencv_videostab.so.2.4.8'
- Linux -- sudoers (简单:转)
- 做java项目_初学者做java项目的流程
- 矩阵分解(5)-- 正定矩阵与半正定矩阵
- 手写bpnn算法实现iris多分类
- 微信小程序 词典代码_微信小程序省市区联动,自定义地区字典
- html5超萌哈士奇,哈士奇,是一种让人又爱又恨,又拥有自己独特风格的雪橇犬...
- linux邮箱客户端安装指令,如何在Ubuntu 18.04中安装邮件客户端Geary 0.12.2
- 桥梁工程智慧工地管理系统,实现工程项目的精细化管理
热门文章
- React学习笔记一(React入门+JSX+脚手架)
- 初始化springboot项目
- 达人评测 i5 11300h和r7 5800h哪个好r75800h和i511300h功耗
- layui+poi 做 导入 Excel
- JAVA 四种引用类型和垃圾回收器
- 计算机水冷散热器原理,一体式水冷散热器原理及特点_散热器新闻-中关村在线...
- 下载被Outlook自动拦截的附件(以py和js为例)
- Unity3D《太空战机》如何给战机加上防护罩
- OKTA==springboot2.5.4整合OKTA实现单点登录demo
- csharp进阶练习题:复杂的数字序列试验【难度:2级】--景越C#经典编程题库,不同难度C#练习题,适合自学C#的新手进阶训练