影響力最大化 CELF 成本效益延遲轉發算法

簡介

對於影響力最大化問題,我以前寫過幾個blog
影響力最大化 IC模型+貪心算法
影響力最大化 模擬爆發(粗糙筆記)
影響力最大化 IC 蒙特卡洛模擬 貪心算法
影響力最大化 IMRank 我心中的最優算法
影響力最大化 CELF 成本效益延遲轉發算法

這篇文章採用CELF的算法來解決影響力最大化問題。

CELF——Cost Effective Lazy Forward Algorithm

這個算法是在2007年提出的,論文地址如下:
Leskovec et al. (2007)

主要是對於基於IC模型的貪心算法的一種改進,IC模型我以前的文章中說過,有興趣的可以從前面的簡介中跳轉去看一看。

我們知道,IC模型和貪心算法的結合對於解決影響力最大化問題存在效率低的問題,因爲需要遍歷每一個未激活節點的IC模型影響力,才能找到一個最大的影響力的節點加入seed set。這樣的算法雖然能夠保證正確率,但是時間上的消耗算力上的消耗面對真正應用中的複雜網絡就是不能使用的。

成千上萬個節點求一個最大影響力集合用貪心+IC估計得跑個好幾天了。這是不行的。

所以CELF算法對於時間方面做了很好的提升。

算法原理

CELF利用擴展函數的子模屬性,這意味着在Greedy算法的一次迭代中給定節點的邊際擴展不能大於其在先前迭代中的邊際擴展。這有助於我們以更復雜的方式選擇要爲其評估擴散函數的節點,而不是簡單地評估所有節點的擴散。

更具體地說,在第一輪中,我們計算所有節點的蔓延(我們仍然選擇greedy算法),並將它們存儲在列表中,然後進行排序。頂部節點在第一次迭代中被添加到種子集中,然後從列表中刪除。在下一次迭代中,僅計算頂部節點的影響力差值。

如果在排序後該節點仍位於列表的頂部,則它必須具有所有節點中最高的邊際增益。之所以得到這個結論,因爲我們知道,如果我們計算所有其他節點的邊際增益,它們將低於列表中當前的值,因此“頂部節點”將保持在頂部。此過程繼續進行,在計算完邊際擴展後找到保留在頂部的節點,然後將其添加到種子集中。通過避免計算許多節點的擴展,CELF的結果比貪婪的要快得多。

我知道上面有很多術語讓大家有點蒙,沒關係後面的代碼很簡單,看到後面就明白了。

算法實現

celf算法主要有兩個部分組成:

  1. 利用Greedy算法,遍歷圖中節點,根據影響力進行排序。

在這裏插入圖片描述

然後選擇排名最高的,也就是影響力最大的節點進入seed set。

在這裏插入圖片描述
2. 查找剩餘k-1個種子節點

在每次迭代中,該算法將評估列表Q中頂部節點的邊際擴展,並將其替換爲列表中的Q。如果在計算排序後,頂部節點保留在原位,則將該節點選作下一個種子節點。如果不是,則評估Q中新的頂部節點的邊際擴展,依此類推。

在這裏插入圖片描述

其中我們利用LOOKUPS來記錄每一次種子集新添加的節點執行的邊際差次數。

代碼實現

傳送門

實例測試

首先引入庫函數

%matplotlib inline
import matplotlib.pyplot as plt
from random import uniform, seed
import numpy as np
import pandas as pd
import time
from igraph import *
import random

然後構建一個簡單地測試圖

source = [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,3,4,5]
target = [2,3,4,5,6,7,8,9,2,3,4,5,6,7,8,9,6,7,8,9]

g = Graph(directed=True)
g.add_vertices(range(10))
g.add_edges(zip(source,target))

plot(g)

在這裏插入圖片描述

一個很簡單的圖。

結果:

在這裏插入圖片描述

大家共勉~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章