賈蘇 符精晶 張君
摘要:互聯(lián)網(wǎng)的發(fā)展也帶動了社會網(wǎng)絡(luò)的發(fā)展,但社會網(wǎng)絡(luò)規(guī)模較大,網(wǎng)絡(luò)結(jié)構(gòu)較為稀疏,都給實際應(yīng)用帶來了挑戰(zhàn),且單線程算法對算力的使用不充分,因此在單機(jī)上開展了對算法并行化研究,使用線程池技術(shù),通過實驗證明減少了算法運行的實際時間。
關(guān)鍵詞:社會網(wǎng)絡(luò);影響力最大化;線程池
中圖分類號:TP391? ? ? ? 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2022)19-0119-03
1 引言
隨著互聯(lián)網(wǎng)的快速發(fā)展,越來越多的人開始從傳統(tǒng)的線下社交轉(zhuǎn)移到線上社交,這給社交網(wǎng)絡(luò)[1]的發(fā)展帶來了前所未有的機(jī)遇,涌現(xiàn)出了一批像Facebook、Twitter、QQ等知名互聯(lián)網(wǎng)社交產(chǎn)品。社交網(wǎng)絡(luò)在方便人們溝通的同時,也會影響著人們實際的社會行為,這給我們對社交網(wǎng)絡(luò)的分析與應(yīng)用帶來了機(jī)遇,比如商家想要通過在線上的活躍用戶的推薦獲取其銷量上的提升,也就是病毒式營銷(virtal -marketing)[2]。病毒式營銷基于具有較大影響力的個體群體向其他的個體進(jìn)行推薦,感化其他不具有購買意愿的個體,因此如何找出社交網(wǎng)絡(luò)中影響力最大的群體是病毒式營銷開展的關(guān)鍵。
影響力最大化問題(Influence Maximization)最先由Domingos和Richardson等人[3]提出并定義,Kempe等人[4]在此基礎(chǔ)上進(jìn)一步研究,提出了top-k的影響力最大化問題,并證明了影響力最大化問題是一個NP-hard問題。并提出了一個貪心算法,可以保證在[1-1/e]的范圍內(nèi)接近最優(yōu)解。
2 背景知識
2.1 影響力最大化問題(Influence Maximization)
將社交網(wǎng)絡(luò)抽象為一個圖[G=V,E],其中[V]是網(wǎng)絡(luò)中個體的集合,[E]是網(wǎng)絡(luò)中個體之間關(guān)系的集合。網(wǎng)絡(luò)中的個體我們使用[v∈V]來代表,節(jié)點[v]的狀態(tài)有兩種,一種是活躍(active),在營銷中表示具有購買欲望,另一種是不活躍(inactive),營銷中表示不具有購買欲望。個體間的關(guān)系使用[e∈E] 來代表。網(wǎng)絡(luò)上不同節(jié)點之間的影響力是不同的,我們使用[Pu,v→(0,1)] 代表節(jié)點[u]對節(jié)點[v]的影響力即集合E中邊[u,v]上的值。
影響力最大化問題就是希望從[V]中選擇k(0<=k<=|V|)個節(jié)點作為種子集合[S],種子集合中所有節(jié)點的狀態(tài)均為活躍。非種子集合的節(jié)點均為不活躍。然后在擴(kuò)散模型下,種子集合中的節(jié)點去激活非激活狀態(tài)的節(jié)點。節(jié)點一旦激活便不再改變。我們希望最終的被激活的節(jié)點是最多的,即找到這樣的一個種子集合[S]:
[S*=argmaxInf(S)]
表示種子集合S的影響力擴(kuò)散的大小。
2.2 影響力傳播模型-獨立級聯(lián)模型(Independent Cascade Model)
獨立級聯(lián)模型[4-6]最初是Jacob Goldenberg提出,是一個離散的概率模型。在此模型下,節(jié)點的狀態(tài)分為兩種,一種是激活狀態(tài),另一種是不激活狀態(tài)。激活狀態(tài)的節(jié)點會嘗試激活不激活狀態(tài)的節(jié)點,節(jié)點對節(jié)點的激活作用是相互獨立的,不會累積,而且只能嘗試激活一次,只能從不激活狀態(tài)變?yōu)榧せ顮顟B(tài)且激活之后狀態(tài)不再發(fā)生改變。節(jié)點間激活狀態(tài)的改變模擬了信息的傳播,在此傳播模型下,連續(xù)的信息傳播被分解為獨立、離散的過程,也更有利于分析統(tǒng)計。
Kempe首次使用獨立級聯(lián)模型作為影響力傳播的模型,節(jié)點激活的狀態(tài)代表節(jié)點被影響力影響了,處于非激活的狀態(tài)代表此時節(jié)點尚未被影響。此模型下的影響力傳播過程如下:
初始時刻[t=0], 網(wǎng)絡(luò)中只有種子節(jié)點處于激活狀態(tài),其余非種子節(jié)點處于未激活狀態(tài)。
在任意時刻[t>0] , 任意一個[t-1]時刻被激活的節(jié)點[u]有且僅有一次機(jī)會以概率[puv]去嘗試激活它的每一個處于非激活狀態(tài)的鄰居[v]。[puv]是節(jié)點[u]和[v]邊上的傳播概率。
如果存在多個處于激活狀態(tài)的節(jié)點同時嘗試激活它們的共同鄰居節(jié)點[v],按照獨立級聯(lián)模型的定義,節(jié)點間的激活順序是獨立的,那么這些節(jié)點以隨機(jī)且獨立的順序去嘗試激活[v],一旦激活,節(jié)點[v]的狀態(tài)即改變,不再受其他節(jié)點的影響。
在[t]時刻被激活的節(jié)點,會在[t+1]時刻也嘗試激活其鄰居節(jié)點。
重復(fù)上述過程,直到某一個時刻網(wǎng)絡(luò)中不再有新的節(jié)點被激活,影響力傳播過程終止。此時,網(wǎng)絡(luò)中被激活的非種子節(jié)點數(shù)就是此種子集合影響力的規(guī)模。
3 影響力最大化算法及其多線程實現(xiàn)
影響力最大化的貪心算法如下:
其中[InfS?v] 為種子集合加入節(jié)點[v]之后的影響力規(guī)模,為了準(zhǔn)確地度量,我們使用Monto-carlo模擬來模擬影響力擴(kuò)散的過程。由于每加入一個節(jié)點都需要多次的模擬,所以造成了算法所需要的時間很高。解決此問題有兩種思路:第一種是對其算法進(jìn)行一定的改進(jìn),第二種是使用并行化手段完成算法的運行。
為了縮短算法運行所需要的時間,我們使用了多線程技術(shù)。針對當(dāng)前機(jī)器核心數(shù)為4,我們使用了大小為4的線程池,其中每一個線程都去度量在當(dāng)前種子集合的影響力大小,使用Callable接口去持有線程返回的結(jié)果。篩選出具有最大增益的非種子節(jié)點后更新種子集合,完成此輪種子節(jié)點選擇。線程池的使用可以降低傳統(tǒng)多線程創(chuàng)建和銷毀帶來的開銷,并對線程進(jìn)行了統(tǒng)一的分配和監(jiān)控,處理大量計算任務(wù)時其優(yōu)勢更加明顯。
使用線程池具體代碼如下:
private Set
// 線程池
ExecutorService threadPool = Executors.newFixedThreadPool(4);
// 初始化非種子節(jié)點
noseeds.addAll(fromNodes);
for (int i = 0; i < k; i++) {
Map
int ca_c = 0;
for (Integer candidate : noseeds) {
if(edges.get(candidate).size() == 0) //當(dāng)節(jié)點->目的節(jié)點的個數(shù)不為0
continue;
int count_Once = 0;
for (int j = 0; j < 100; j++) { // monto_carlo
Callable
// 執(zhí)行任務(wù)并獲取Future對象
Future
while (!f.isDone()) { // no execute end loop it
//System.out.println("? ?In while");
}
count_Once += f.get(); // spread的累加
} //end for
candidate_Spread.put(candidate, count_Once);
}
// refresh seeds
Optional
.max(Map.Entry.comparingByValue());
// 這里避免了每次都加入具有最大值spred值的candidate
if (!seeds.contains(max_vlu.get().getKey())) {
seeds.add(max_vlu.get().getKey());// 更新seeds
noseeds.remove(max_vlu.get().getKey());// 從noseeds中刪除當(dāng)前種子
}
}
return seeds;
}
4 數(shù)據(jù)集以及實驗結(jié)果
4.1 數(shù)據(jù)集及實驗相關(guān)設(shè)置
本文選擇了DBLP數(shù)據(jù)集和LiveJournal作為實驗的數(shù)據(jù)集(來自:http://snap.stanford.edu/data/com-DBLP.html)。DBLP是一個關(guān)于科研論文發(fā)表共同作者的網(wǎng)絡(luò),其中如果兩位作者至少發(fā)表一篇論文,則可以將他們聯(lián)系起來,即將作者看成是社交網(wǎng)絡(luò)中的節(jié)點,聯(lián)系則是節(jié)點間的邊。LiveJournal是一個擁有近1000萬會員的免費在線社區(qū),它允許成員維護(hù)日志、個人日志和組日志,并且允許人們標(biāo)記其他成員是他們的朋友。數(shù)據(jù)集的具體的拓?fù)湫畔⑷绫?所示:
實驗代碼使用Java進(jìn)行編寫,運行于Windows10機(jī)器上,處理器為I5 9500,內(nèi)存8GB。實驗中使用獨立級聯(lián)模型(IC)作為影響力傳播模型。為了保證實驗結(jié)果的準(zhǔn)確性,我們設(shè)置蒙特卡洛模擬的次數(shù)[R=2000],這個過程也是實驗中最為耗時的過程,為了縮短運行所需要的時間,我們在這個過程中加入了多線程。
4.2 實驗結(jié)果
(1) 在DBLP上的實驗結(jié)果
(2) 在LiveJournal上的實驗結(jié)果
5 總結(jié)和展望
本文回顧了社會網(wǎng)絡(luò)上影響力最大化的發(fā)展及在其上的應(yīng)用—病毒式營銷,針對影響力最大化的貪心算法做出了多線程的實現(xiàn),在不影響實驗結(jié)果精度的情況下,縮短了實驗運行所需要的時間,并在DBLP和LiveJournal這兩個真實的社會網(wǎng)絡(luò)集合上進(jìn)行了實驗,將影響力最大化的貪心算法進(jìn)行了并行化 ,并將實驗運行時使用單線程和線程池所需的時間進(jìn)行了對比。實驗證明通過并行化可以減少算法運行的時間。
在企業(yè)的實際操作中,希望很快地獲取他們期待的結(jié)果以供做出相對應(yīng)的決策。因此,即使加入了多線程,也難以滿足企業(yè)級的實時性。下一步,我們將對算法進(jìn)行一定的改進(jìn)以提高算法的效率,并使用服務(wù)器集群技術(shù)完成現(xiàn)有計算任務(wù)。
參考文獻(xiàn):
[1] 汪小帆,李翔,陳關(guān)榮.網(wǎng)絡(luò)科學(xué)導(dǎo)論[M].北京:高等教育出版社,2012.
[2] Bass F M.A new product growth for model consumer durables[J].Management Science,1969,15(5):215-227.
[3] Domingos P, Richardson M. Mining the network value of customers[J].Proceedings of the 7th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining. San Francisco,USA,2001.
[4] Kempe . Maximizing the spread of influence through a social network[J]. Proc.of Acm Sigkdd Intl Conf.on Knowledge Discovery & Data Mining, 2003.
[5] Goldenberg J , Muller L E . Talk of the Network: A Complex Systems Look at the Underlying Process of Word-of-Mouth[J]. Marketing Letters, 2001, 12(3):211-223.
[6] Goldenberg J, Libai B, Muller E. Using complex systems analysis to advance marketing theory development: Modeling heterogeneity effects on new product growth through stochastic cellular automata[J]. Academy of Marketing Science Review,2001,2001:1.
收稿日期:2021-09-18
基金項目:沙洲職業(yè)工學(xué)院青年教師基金(SGJJ2021B09)
作者簡介:賈蘇(1993—),江蘇寶應(yīng)人,男,沙洲職業(yè)工學(xué)院電子信息工程系助教;符精晶(1994—),江蘇江都人,女,沙洲職業(yè)工學(xué)院電子信息工程系助教;張君(1986—),江蘇張家港人,男,沙洲職業(yè)工學(xué)院電子信息工程系助教。