影響力最大化 IC 蒙特卡洛模擬 貪心算法

簡介

個人對於影響力最大化這個問題本身比較感興趣,這是我原來寫過的鏈接:

影響力最大化 IMRank 我心中的最優算法

影響力最大化 模擬爆發(粗糙筆記)

影響力最大化 IC模型+貪心算法

這一偏還是基於貪心算法的IC模型,但是原來寫的是基於LT的IC,也就是線性閾值的獨立級聯模型。
而這一篇我使用的是蒙特卡洛模擬的方法實現IC。那麼我們就先來看看到底有什麼區別。

IC 獨立級聯算法

首先我們得知道獨立級聯算法,這裏我不過多解釋了,因爲其實這是很常見很普通的概念,大家不妨記住,後面慢慢理解。

獨立級聯模型(Independent Cascade Mode,IC模型)是一種概率模型,當一個節點v被激活時,它會以概率p[v,w]對它未激活的出邊鄰居節點w嘗試激活,這種嘗試僅僅進行一次,而且這些嘗試之間是互相獨立的,即v對w的激活不會受到其他節點的影響。

其中一定要記住的是“獨立”的概念,這種思路其實我認爲是IC的靈魂,不是說多麼高級,只是這是IC實現的基礎。有利於理解IC。

蒙特卡洛和LT線性閾值

這是兩種實現IC的思路:
什麼意思呢? 我們舉個例子:
如下圖所示:
在這裏插入圖片描述
在線性閾值的情況下,我們爲每一個節點設置一個閾值T(這裏我們設置爲1)。對於上圖節點二來說,如果此時1和0已經被激活,那麼節點2的激活能力 = P[1,2] weight[1] + P[0,2] weight[0],當然如果簡化來說的話,也可以不乘每個點的權重。由此我們就可以計算出來當遍歷一遍之後,未激活點的存儲的激活能力。

然後每個點的激活能力和T進行比較,如果超過了T就說明該點已經被激活,我們將它放入S集合中。最後得到的S的個數就是影響力大小。

對於蒙特卡洛模擬來說,其實大家可以看看我原來的一篇 模擬爆發的文章,那個時候我以爲叫模擬爆發,其實就是蒙特卡洛模擬。這種方法更加暴力。
還是用剛纔的例子,此時0、1節點已經被激活,那麼我們現在只看節點2的激活情況,此時生成兩個隨機數random1、random2(0 < random < 1),
if(random1 > p[0,2] or random2 > p[1, 2])then 節點2被激活

這就是兩種方法的區別。
所以,接下來:

實現基於蒙特卡洛模擬的IC模型

簡介

解決該問題原來在計算上非常繁重。
例如,在一個由1,000個節點組成的相對較小的網絡中,存在8萬億個大小爲k = 5的種子集的不同可能候選對象,即使在最新的高性能計算資源下也無法直接求解。因此,在過去的15年中,非常活躍的文獻試圖找到可以快速解決的問題的近似解決方案。

那麼我們先實現這個經典的傳播模型,並利用貪心算法進一步求解影響力最大化問題。

引入庫函數

%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

測試圖

這裏我用的上面的例子:
在這裏插入圖片描述
用gephi換了個樣子haha~
畢竟是貪心,節點數太多了實在是慢。

蒙特卡洛模擬

在這裏插入圖片描述
上面一段就是用到模擬的地方,大致就是隨機生成了一個數組,然後和我輸入的設定p進行比較,如果小於就可以被激活,當然了我這裏偷懶了,沒有egde的權重。呵呵,也就是沒有傳播概率,那就是相當於每兩個被連接點的p相同。

然後我就可以得到模擬一次的激活情況,但是這樣的效果是不穩定的,存在很大的偶然性,所以模擬幾次,然後取平均就可以了。

源代碼在後面:

貪心求最大影響力

這個算法思路,和我原來的blog其實是一樣的,所以不多說了,但是區別還是有的。

這次沒有用原始的鄰接矩陣進行編程,使用的是igraph,所以還是顯得很簡潔嘀。
代碼地址放在最後。

源代碼

傳送門

大家共勉~~

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