CELF(Cost-Effective Lazy Forward selection)具有成本效益的惰性前向选择算法

本文主要是介绍CELF(Cost-Effective Lazy Forward selection)具有成本效益的惰性前向选择算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CELF(Cost-Effective Lazy Forward selection)算法解析
  

  引言:在社交网络影响力最大化问题的求解过程中,我们往往需要去选择一些目标种子结点作为信息初始传播的源头。贪婪算法在传播效果上的解决可以达到影响的最大化,但是在时间复杂度上面显得确十分糟糕。为此CELF算法应势而生,CELF算法利用了函数次模性的特点,在第一轮选择种子结点时,计算网络中所有节点的边际收益,但将在之后的过程中,不再做网络节点边际收益的重复计算,这相对于传统的贪婪算法,将在时间上得到非常明显的改善。本文是对论文《Cost-effective Outbreak Detection in Networks》的补充,如果你是看了这篇论文之后,依然不明白CELF算法,那么本文可能会给予你一点点启示。

一.函数的次模性(submodular)

  对于函数次模性的理解,举个例子,当我们在饿了的时候,吃一碗饭得到的满足感,是比饱腹的时候得到的更多,函数次模性数学解释如下:
在这里插入图片描述

图1 函数的次模性

  图中的 R ( ) R() R()函数,我们可以看作是一个收益函数,因为在原文中的解释相对稍微复杂,我就用另一个例子来说明。图1中的A和B看作是选好的种子集, R ( ) R() R()可以看作是A,B种子集在网络中影响到的非种子结点的数量!次模性的意思就是,当种子集A比B小的时候,新的种子结点S加入到种子集A和B中, R ( A ∪ R(A\cup R(A{s} ) − R ( A ) )-R(A) )R(A)获得边际收益更大!

二.CELF 算法伪码解读

在这里插入图片描述

图2 CELF算法伪码

  CELF算法的说明:因为算法最主要的是“篮筐处”,我对“篮筐”里面的伪码,做出如下逐行解释:(如果你已经熟悉伪码可以不用看)

  第一行:输入网络结构 g ( V , E ) g(V,E) g(V,E),网络结构 V V V是点的集合, E E E是边的集合;R是收益函数;c是成本函数;B是预算;type就是网络节点成本的类型,原文中有两种类型,UC统一成本(常数),CB非统一成本(会变化的)。

  第二行:最开始种子结点集A为空集;对于每一个V中的结点s,初始化它的边际收益 δ s \delta_{s} δs为无穷大。

  第三行:循环条件为,当把种子结点S加入到种子集A中的时候,成本函数的值c小于等于预算B,然后可以继续循环。循环为后置循环,意思是先循环再判断是否满足循环条件。

  第四行:进入循环体内,对于每一个非种子结点s,我们给它打上flase标签。

  第五行:永久循环,除非第八行运行条件成立退出。

  第六、七行:根据种子结点的成本类型为UC或者CB并进行以边际收益 δ s \delta_{s} δs为选则依据的结点选择(选择边际收益最大的)。

  第八行: 如果找出来的最大边际收益 δ s \delta_{s} δs结点的标签为ture,则加入种子集A,并结束循环,进行下一轮选择。

  第九行:如果找出来的最大边际收益结点的标签为flase,则重新计算边际收益,并改标签为ture。

次模性在CELF中的体现解析
  在第二轮选择种子结点的时候,并没有全部计算所有结点的边际收益(可能计算了部分)

  因为:
在这里插入图片描述

图3 论文截图处“蓝色框部分”给出了解释

  因为第一轮边际收益计算后,排序在顶端的点依然在顶端,只有可能当他们的边际收益很接近的时候,可能在第K(k>1)轮需要多计算几次。另外,如果结点之间的边际收益相隔大,那么之后的计算完全没必要感觉,直接依靠第一轮的边际收益排序来选择就好了!

  这就是相比于贪婪算法时间节省的地方,第一轮时间复杂度是一样的,后面的选择轮数就不需要再去遍历估计那些没有被选为种子结点的结点的边际收益,此处正是次模性的体现(领会)
   该解析如果还是看得不明白,可以参考另一位作者写的,虽然简陋,希望能一起结合论文看,能让你明白!
https://blog.csdn.net/s1102379635/article/details/8524447

这篇关于CELF(Cost-Effective Lazy Forward selection)具有成本效益的惰性前向选择算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/hahaxq/article/details/106469527
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/344578

相关文章

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

exfat和ntfs哪个好? U盘格式化选择NTFS与exFAT的详细区别对比

《exfat和ntfs哪个好?U盘格式化选择NTFS与exFAT的详细区别对比》exFAT和NTFS是两种常见的文件系统,它们各自具有独特的优势和适用场景,以下是关于exFAT和NTFS的详细对比... 无论你是刚入手了内置 SSD 还是便携式移动硬盘或 U 盘,都需要先将它格式化成电脑或设备能够识别的「文

Spring框架中@Lazy延迟加载原理和使用详解

《Spring框架中@Lazy延迟加载原理和使用详解》:本文主要介绍Spring框架中@Lazy延迟加载原理和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、@Lazy延迟加载原理1.延迟加载原理1.1 @Lazy三种配置方法1.2 @Component

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

基于Python实现多语言朗读与单词选择测验

《基于Python实现多语言朗读与单词选择测验》在数字化教育日益普及的今天,开发一款能够支持多语言朗读和单词选择测验的程序,对于语言学习者来说无疑是一个巨大的福音,下面我们就来用Python实现一个这... 目录一、项目概述二、环境准备三、实现朗读功能四、实现单词选择测验五、创建图形用户界面六、运行程序七、