社交網路演算法
Ⅰ 社交網路的核心推薦演算法有哪些
對好友推薦演算法非常熟悉,有些積累。好友推薦演算法一般可以分為下面幾類:
1、基於關系的推薦
基於關系的推薦,最近寫了一個專欄文章,具體介紹了常用演算法,可以看下有沒有幫助,傳送門:http://zhuanlan.hu.com/gongwenjia/20533434
簡介:
a.社會網路中,三元閉包理論,以及常用推薦演算法
b.Facebook中的推薦演算法是如何做的
2、基於用戶資料的推薦
3、基於興趣的推薦
剩下兩個方面有時間再寫。
近來學習聚類,發現聚類中有一個非常有趣的方向—社交網路分析,分享一下我的大致了解。這篇只是一篇概況,並沒有太多的公式推導和代碼,基本是用人話解釋社交網路分析中的常用的幾種演算法。詳細到每個演算法的以後有空再把詳細的公式和代碼補上。
社區發現演算法,GN演算法,Louvain演算法,LPA與SLPA
Louvain演算法思想
1.不斷遍歷網路中的節點,嘗試把單個節點加入能使模塊度提升最大的社區,直到所有節點不再改變
2.將第一階段形成的一個個小的社區並為一個節點,重新構造網路。這時邊的權重為兩個節點內所有原始節點的邊權重之和。
3.重復以上兩步
LPA演算法思想:
1.初始化每個節點,並賦予唯一標簽
2.根據鄰居節點最常見的標簽更新每個節點的標簽
3.最終收斂後標簽一致的節點屬於同一社區
SLPA演算法思想:
SLPA是LPA的擴展。
1.給每個節點設置一個list存儲歷史標簽
2.每個speaker節點帶概率選擇自己標簽列表中標簽傳播給listener節點。(兩個節點互為鄰居節點)
3.節點將最熱門的標簽更新到標簽列表中
4.使用閥值去除低頻標簽,產出標簽一致的節點為社區。
Ⅱ 《社交網路》中寫在玻璃上的數學公式是什麼公式
影片中的公式如下:
按照電影中的情節,扎克伯格用這個公式來給女孩相貌打分。谷歌一下,這個公式是Elo Rating System的一部分,顯然在這里應用的就是Elo Rating System分級系統。
參考wiki對Elo Rating System的解釋,就很容易理解這個公式如何來用。
Elo分級系統由美國物理學教授Arpad Elo提出,最初是用於計算象棋比賽中的選手的相對水平,現在已經廣泛用於很多類比賽的選手分級。
在一場比賽中,選手都有一個分數,這個分數代表了選手的實力。分越高表示選手實力也越高。而分數可以通過打敗其他選手來獲得。
Elo演算法的實現細節如下:
假設選手A和B,當前擁有的分數分別為RA和RB。
則選手A得分的期望值為:
類似地選手B得分的期望值為:
Ⅲ 猜你喜歡是如何猜的——常見推薦演算法介紹
自從頭條系的產品今日頭條和抖音火了之後,個性化推薦就進入了大眾的視野,如果我們說搜索時人找信息的話,那麼推薦就是信息找人。搜索是通過用戶主動輸入索引信息告訴機器自己想要的東西,那麼推薦的這個索引是什麼才能讓信息找到人呢?
第一類索引是「你的歷史」,即基於你以前在平台上對某物品產生的行為(點贊,轉發,評論或者收藏),尋找與你產生過相似行為的用戶所喜歡的其他物品或者與你喜歡的物品相似的其他物品來為你推薦。這一基於用戶行為相似的演算法有:協同過濾演算法、基於內容的推薦演算法和基於標簽的推薦演算法。
基於用戶的協同過濾演算法是尋找與A用戶有相似行為的所有B用戶所喜歡的而A用戶還不知道的物品推薦給A用戶 。該演算法包括兩個步驟:
-根據用戶所喜歡的物品計算用戶間相似度,找到與目標用戶相似的用戶集合;
-找到該用戶集合所喜歡的而目標用戶所不知道的物品。
那麼,找出一批物品以後哪個先推薦哪個後推薦?用戶間相似程度大的先推薦,用戶對物品的感興趣程度大要先推薦。即假設A用戶與B用戶的相似程度為0.9,與C用戶的相似程度為0.7,用戶B喜歡物品a和物品b的程度分別為1和2,用戶C喜歡物品a和物品b的程度分別為0.1和0.5,那麼先推薦物品b。多個用戶多個物品,只要擬定了用戶間的相似度和用戶對物品的感興趣程度,即可對物品進行打分並且進行綜合排序。
基於物品的協同過濾演算法是根據用戶行為而不是物品本身的相似度來判斷物品的相似度 ,即如果物品A和物品B被很多的用戶同時喜歡,那麼我們就認為物品A和物品B是相似的。該演算法也是包括兩個步驟:
-根據用戶行為計算物品間的相似度;
-根據物品的相似度和用戶的歷史行為給用戶生成推薦列表。
與UserCF相似的是,同樣會遇到推薦的先後順序問題,那麼ItemCF所遵循的原則是:物品間相似程度大的先推薦,用戶對物品的感興趣程度大要先推薦。假設用戶對物品a和物品b感興趣的程度分別為1和0.5,物品a與物品c和物品d的相似度分別為0.5和0.1,物品b與物品c和物品d的相似度分別為0.3和0.4,那麼先推薦物品d。用戶喜歡多個物品,並且多個物品與其他物品都有相似的情況下,只要擬定了用物品間的相似度和用戶對物品的感興趣程度,即可對物品進行打分並且進行綜合排序。
協同過濾演算法的核心都是通過用戶行為來計算相似度,User-CF是通過用戶行為來計算用戶間的相似度,Item-CF是通過用戶行為來計算物品間的相似度。
推薦演算法很重要的一個原理是為用戶推薦與用戶喜歡的物品相似的用戶又不知道的物品。物品的協同過濾演算法是通過用戶行為來衡量物品間的相似(喜歡物品A的用戶中,同時喜歡物品B的用戶比例越高,物品A與物品B的相似程度越高),而基於內容的推薦演算法衡量則是通過物品本身的內容相似度來衡量物品間的相似。
假如,你看了東野圭吾的《解憂雜貨店》,那麼下次系統會給你推薦東野圭吾的《白夜行》。假設你看了小李子的《泰坦尼克號》,系統再給你推薦小李子的《荒野獵人》。
該演算法與前兩種不同的是,將用戶和物品之間使用「標簽」進行聯系,讓用戶對喜歡的物品做記號(標簽),將同樣具有這些記號(標簽)的其他物品認為很大程度是相似的並推薦給用戶。其基本步驟如下:
統計用戶最常用的標簽
對於每個標簽,統計最常被打過這個標簽次數最多的物品
將具有這些標簽最熱門的物品推薦給該用戶
目前,國內APP中,豆瓣就是使用基於標簽的推薦演算法做個性化的推薦。
第二類索引是「你的朋友」,基於你的社交好友來進行推薦,即基於社交網路的推薦。例如,微信看一看中的功能「朋友在看」就是最簡單的基於社交網路的推薦,只要用戶點擊公眾號文章的「在看」,就會出現在其好友的「朋友在看」的列表中。
復雜一點的演算法會考慮用戶之間的熟悉程度和興趣的相似度來進行推薦。目前,在信息流推薦領域,基於社交網路進行推薦的最流行的演算法是Facebook的EdgeRank演算法,即為用戶推薦其好友最近產生過重要行為(評論點贊轉發收藏)的信息。
第三類索引是「你所處的環境」,基於你所處的時間、地點等上下文信息進行推薦。例如,我們看到很APP中的「最近最熱門」,就是基於時間上下文的非個性化推薦;以及,美團和餓了么這些基於位置提供服務的APP中,「附近商家」這一功能就是基於用戶位置進行推薦。高德地圖在為用戶推薦駕駛路線時,會考慮不同路線的擁堵程度、紅綠燈數量等計算路線用和路程距離再進行綜合排序推薦。
很多時候,基於時間上下文的推薦會協同過濾這類個性化推薦演算法結合使用。例如,在使用協同過濾推薦策略的時候,會將時間作為其中一個因素考慮進入推薦策略中,最近的信息先推薦。
以上就是常見的推薦演算法。作為產品人,我們不需要知道如何實現,但是我們必須知道這些推薦演算法的原理,知道在什麼場景下如何去做推薦才能提升推薦的效率,這才是產品經理的價值所在。
參考資料:《推薦演算法實戰》項亮
Ⅳ PageRank演算法實現好友推薦(演算法原理)
對於社交系統與電商網站,推薦系統佔有很重要的位置,當數據量越來越大的時候,用戶無法確定該選擇什麼商品,因此在電商系統中需要按照興趣或者相似度給用戶推薦相應的商品。相應的,在一個大型社交網路平台中,睜喚手對於一些用戶,我們希望推薦一些知名度較高,活躍度較高或者感興趣的用戶,比如一些明星,歌手,演員等等。在社交網路中,PageRank演算法有著廣泛的應用,因此,本篇文章主要介紹其原理。
對於大部分社交系統來說,如果只是簡單的獲取好友的信息遠遠不夠,我們可以通過獲取好友的好友的信息來擴展用戶的朋友圈,使得信息量更加豐富,本項目中使用PageRank演算法來完成二級鄰居,然後按照Rank排序,選擇Top5用戶實現用戶的好友的好友的推薦。
PageRank演算法由Google的創始人拉里·佩奇和謝爾·布林於1998年發明.這項技術設計之初是為了體現網頁的相關性和重要性,在搜索引擎優化操作中經常被用來評估網頁優化的成效因素之一.
從技術上看,搜索引擎需要解決以下三個問題:
本質就是一個爬蟲問題,通過爬蟲獲取整個互聯網的數據
關鍵在於快速找到.
它的實現方式有: 倒排索引,簽名文件,後綴樹等。我們最熟悉的是 倒排索引 。(並不熟悉,以後有機會再看)
排序是Google的搜索引擎能夠興起的一個決定性因素。
對網頁排序有很多種方式,我們來看三種:
就是原封不懂地把索引到的鏈接直接返回給用戶,缺點就不說了,想找自己感興趣的內容估計要費不少功夫。
這種方式是一種只從關鍵詞出現的次數和位置進行排序的方法。該方法以一個關鍵詞與網頁的相關度大小作為排序標准,而關鍵詞在網頁的相關度大小作為排序標准,而關鍵詞在網頁中的相關度則由它在網頁中出現的頻次和位置兩方面加權計算得出。
缺點也很明顯,容易出現刷分的情況,整篇文章中大量地刷關鍵詞就能提高排名。
真正找到計算網頁自身質量的完美的數學模型是Google的創始人拉里佩奇和謝爾蓋布林。 下一節講一下原理。
我們模擬一個悠閑的上網者,上網者首先隨機選擇一個網頁打開,然後在這個網頁上呆了幾分鍾後,跳轉到該網頁所指向的鏈接,這樣無所事事、漫無目的地在網頁上跳來跳去,PageRank就是估計這個悠閑的上網者分布在各個網頁上的概率,這個概率就代表這個網頁的重鏈大要性.
PageRank主要基於兩個重要的假設:
如果一篇文章被越來越多的人引用,那麼這篇文章可能就是一篇經典之作,如果這篇文章引用了其他的論文,那麼一定程度上這篇被引用的文章也是一篇很好的文章。應用到社交網路中,如果一個好友被更多的人關注,那麼說明該好友有很高的知名度和活躍度,那麼,我們可以將該好友推薦給用戶。
基於這兩個假設,我們可以總結出PageRank演算法的核心:
如下圖,可以更好的表達PageRank演算法的思想:
由上圖可知,每個頁面將自己的一部分rank傳遞給某個頁面,我們可悉嫌以通過計算傳遞給某個頁面的所有rank值的和來計算出它的rank值,當然,不可能是通過一次計算完成,我們剛開始可以給每個頁面賦予一個初始rank值,比如 1/N(N為頁面總數) ,通過迭代計算得到該頁面的rank值。
迭代計算停止的條件為:
使用有向圖表示:
這個例子中只有四個網頁,如果當前在A網頁,那麼悠閑的上網者將會各以1/3的概率跳轉到B、C、D,這里的3表示A有3條出鏈,如果一個網頁有k條出鏈,那麼跳轉任意一個出鏈上的概率是1/k,同理D到B、C的概率各為1/2,而B到C的概率為0。
我們在做計算的時候會將該圖表示成一個二維的矩陣,我們做一個轉換,就會變成下圖的矩陣形式。 M(i,j) 表示j節點指向i節點的概率 ,一般來說每列和為1。
生成的 轉移矩陣 非常簡單, 矩陣的每一列代表該頂點所代表的頁面除以對應頁面的出鏈數得到的 。
有了轉移矩陣,我們可以來定義行向量 V , V 的第i個分量記錄 對應的Rank值,因此一次Rank的更新可以表示為:
在演算法的第一輪計算中,我們假設上網者在每一個網頁的概率都是相等的,即1/n,於是初試的概率分布就是一個所有值都為1/n的n維列向量 ,用 去右乘轉移矩陣M,就得到了第一步之後上網者的概率分布向量 ,得到一個nX1的矩陣 , 這個 一輪迭代計算出來的PageRank值 。下面是 的計算過程:
得到了 後,再用 去右乘M得到 ,一直下去,即 , 最終V會收斂 .
不斷的迭代,最終得到結果.
但是在迭代計算中,我們需要考慮如下兩大阻力: Dead End 和 Spider Trap :
Dead End就是指一個頁面只有入鏈但是沒有出鏈,這時轉移矩陣M的一列為零,導致最後結果為零。這時web不是強連通的,即存在某一類節點不指向別人,如下圖的D。這個時候我們的演算法就會出問題了,它不滿足收斂性了。
為什麼不滿足收斂性了?
Spider Trap指頁面的所有出鏈都指向自己,這樣會使迭代結果中只有自己的頁面的Rank值很高。其他頁面的Rank值為零。
要克服上面兩個問題,我們需要將迭代計算公式做如下轉變。我們可以加入一個 隨機跳轉 機制.
即假設每個頁面有很小概率擁有一個指向其他頁面的鏈接。
表現出來就是:其他頁面本來傳遞給一個頁面的Rank值需要做一個折扣,作為補償,可能需要一個頁面指向該頁面並且傳遞Rank值給該頁面,該跳轉的概率為β,因此表達式變為:
其中,N為頁面總數; e 為一個N維且各個分量都是1的向量;β通過經驗得知一般設為0.15.
此時的計算結果過程為:
有機會再寫,先空著
Ⅳ 如何檢測社交網路中兩個人是否是朋友關系(union-find演算法)
春節放假會了老家,停更了很多天,這是年後連夜肝出來的第一篇文章,先來聊聊春節放假期間發生的事,這次回家遇到了我學生時代的女神,當年她在我心目中那是
沒想到這次遇到了她,身體發福,心目中女神的形象瞬間碎了,就像達芬奇再次遇到了蒙娜麗莎
好了,言歸正傳。
有時候我們可以需要判斷在大型網路中兩台計算機是否相連,是否需要建立一條新的連接才能通信;或者是在社交網路中判斷兩個人是否是朋友關系(相連表示是朋友關系)。在這種應用中,通常我們可能需要處理數百萬的對象和數億的連接,如何能夠快速的判斷出是否相連呢?這就需要使用到union-find演算法
假如輸入一對整數,其中每個數字表示的是某種對象(人、地址或者計算機等等),整數對p,q理解為「p與q相連」,相連具有以下特性:
假設相連是一個種等價關系,那麼等價關系能夠將對象劃分為多個等價類,在該演算法中,當且僅當兩個對象相連時他們才屬於同一個等價類
整個網路中的某種對象稱為觸點
將整數對稱為連接,將等價類稱作連通分量或者簡稱分量
union-find演算法的目標是當程序從輸入中讀取了整數對p q時,如果已知的所有整數對都不能說明p q是相連的,那麼將這一對整數輸出,否則忽略掉這對整數;我們需要設計數據結構來保存已知的所有整數對的信息,判斷出輸入的整數對是否是相連的,這種問題叫做動態連通性問題。
如果兩個觸點在不同的分量中,union操作會使兩個分量歸並。一開始我們有N個分量(每個觸點表示一個分量),將兩個分量歸並之後數量減一。
抽象實現如下:
接下來我們就主要來討論如何實現union方法和find方法
這種演算法的實現思路是在同一個連通分量中所有觸點在id[]中的值都是相同的,判斷是否連通的connected的方法就是判斷id[p]是否等於id[q]。
為了提高union方法的速度,我們需要考慮另外一種演算法;使用同樣的數據結構,只是重新定義id[]表示的意義,每個觸點所對應的id[]值都是在同一分量中的另一個觸點的名稱
在數組初始化之後,每個節點的鏈接都指向自己;id[]數組用 父鏈接 的形式表示了 森林 ,每一次union操作都會找出每個分量的 根節點 進行模猛歸並。
find方法需要訪問數組n-1次,那麼union方法的時間復雜度是O(n²)
為了保證quick-union演算法最糟糕的情況不在出現,我需要記錄每一個樹的大小,在進行分量歸並操作時總是把小的樹連接到稿消大的樹上,這種演算法構造出來樹的高度會遠遠小於未加權版本所構造的樹高度。
union-find演算法只能判斷出給定的兩個整旦敬橋數是否是相連的,無法給出具體達到的路徑;後期我們聊到圖演算法可以給出具體的路徑
文中或許會存在或多或少的不足、錯誤之處,有建議或者意見也非常歡迎大家在評論交流。
最後, 寫作不易,請不要白嫖我喲 ,希望朋友們可以 點贊評論關注 三連,因為這些就是我分享的全部動力來源🙏
Ⅵ Neo4j中使用Louvain演算法和標簽傳播演算法(LPA)對漫威英雄進行社群分析
在本系列第一篇 在Neo4j中構建漫威世界的社交網路 中我們從英雄到漫畫的二分圖推導出英雄到英雄的一分圖。接著在第二篇 在Neo4j中對漫威社交網路進行初步分析 中得到一些基本的網路信息以幫助我們了解正在處理的網路情況。
在本篇中我將會在漫威英雄的網路上使用Louvain演算法和標簽傳播演算法(LPA),發現一些有趣的社群。
本文中的可視化是使用Gephi來進行呈現,關於Gephi的更多信息可以看我之前的文章《Neo4j to Gephi》(https://tbgraph.wordpress.com/2017/04/01/neo4j-to-gephi/)。關於社群可視化還可以使用neovis.js(https://github.com/johnymontana/neovis.js)。
Neo4j圖演算法一般是在圖的子集上進行,而這個子集通常是一個虛擬圖,Neo4j圖演算法載入這種圖有兩種辦法。第一種簡單的辦法是通過指定結點的標簽和關系的類型將其載入到圖演算法中。
但是,如果我們要運行的邏輯是在一個特定的子圖上,而僅使用結點標簽和關系類型無法描述出這個子圖,同時也不想去修改實體圖,這時要怎麼辦呢?
不用擔心,我們還可以使用Cypher語句來指定要載入的子圖。使用查詢結點的Cypher語句代替結點標簽參數,使用查詢關系的Cypher語句來代替關系類型參數。
但是注意,在參數中一定要指明 graph:'cypher' 。
如下示例:
CALL algo.unionFind(
//第一個Cypher語句指定了要載入的結點。
'MATCH (p:User)
WHERE p.property = 'import'
RETURN id(p) as id',
//第二個Cpyher語句指定要載入的關系
'MATCH (p1:User)-[f:FRIEND]->(p2:User)
RETURN id(p1) as source, id(p2) as target,f.weight as weight',
{graph:'cypher',write:true})
通過Cypher語句映射和載入子圖,可以非常好的描述要運行演算法的子圖。不僅如此,我們還可以剔除一些關系,間接的映射一個虛擬圖用於運行演算法,而那些剔除的關系又並不會從實際圖中刪除。
Cpyher映射使用場景:
* 過濾結點和關系
* 載入間接關系
* 映射雙向圖
* 相似性閾值(後面詳情介紹)
在對各種網路的研究過程中,如計算機網路、社交網路以及生物網路,我們發現了許多不同的特徵,包括小世界特性,重尾分布以及聚類等等。另外,網路都有一個共同的特徵即社群結構,也就是連通和分組。而現實網路世界的連通並不是隨機或同質的,而是存在著某種自然的聯系。
社群識別演算法在一個全連通的圖上運行,效果並不會很好。因為大多數據結點都是緊密連接的,他們是屬於一個社群的。在這些的圖上運行演算法,最終結果就是:得到一個覆蓋圖大部分區域的大社群和一些邊邊角角小社群。
這時我們可以使用相似性閾值來進行調控,將大於某個值的關系保留,而小於此值的關系將會剔除。而這個虛擬圖就可以通過Cypher語句輕松的映射出來了。
在本文中,我會將漫威社交網路中KNOWS的weight作為閾值,將其設置到100,大於100的關系將會保留,小於100的關於將會剔除,這樣,得到的社群將會非常緊密。
連通分量或並查集演算法都是找到相互連接的結點集,或者稱之為島,而在這個集合中的所有點都是可以相互連通的。
在圖論中,無向圖的連通分量(或者僅分量)是一個子圖,其中此子圖任何兩個頂點通過路徑相互連接。
當我遇到一個新的網路時,我第一時間想知道是:這個網路有多少個連通分量,以及他們每個都包含多少結點。在漫威英雄的網路中,當前我們已經把KNOWS的weight閾值設置到100了,而前一篇文章的閾值是10,因此,本文得到的連接肯定要比前一篇文章()中的連接要少。
在下面的示例中,我們直接使用結點標簽和關系類型,所有標簽為Hero的結點和所有類型為KNOWS的關系都將被載入到演算法中。由於我們將閾值設置到100,所以,當前演算法只考慮weight大於100的關系。
CALL algo.unionFind.stream('Hero', 'KNOWS',
{weightProperty:'weight', defaultValue:0.0, threshold:100.0,concurrency:1})
YIELD nodeId,setId
RETURN setId as component,count(*) as componentSize
ORDER BY componentSize DESC LIMIT 10;
正如我所料,漫威英雄網路是一個稀疏圖,有1個大社群和6小社群組成,大社群有101個英雄,而小社群基本也就2~4個英雄。這表示,在6439個英雄中,有116個英雄至少一個KNOWS關系的weight值是大於100的。
如果想在瀏覽器中仔細瀏覽那個包含101英雄的大社群,會很容易發現隱藏在這裡面的一些直觀的東西以及社群之間的橋梁結點。接下來我們將嘗試使用Louvain演算法和標簽傳播演算法來看看這個116個英雄的子圖的社群結構。
社群就是網路中結點集合,它們彼此之間的連接比其他節點更緊密。Molarity是一種度量刻度,被用於衡量社群發現演算法結果的質量,它能夠刻畫社區的緊密程度。在一個隨機的網路中,將一個結點歸類到某一個社群,Molarity值就是會生變化,進而給出這種分配後社區的質量。Molarity即量化了此結點與社群中其他結點的連接緊密程度。社群識別的Louvain方法,是一種基於啟發式Molarity最大化的網路社群檢測演算法。
如前所述,我們將通過Cypher查詢來僅映射weight大於110的關繫到演算法中。
CALL algo.louvain.stream(
// load nodes
'MATCH (u:Hero) RETURN id(u) as id',
// load relationships
'MATCH (u1:Hero)-[rel:KNOWS]-(u2:Hero)
// similarity threshold
WHERE rel.weight > 100
RETURN id(u1) as source,id(u2) as target',
{graph:"cypher"})
YIELD nodeId,community
MATCH (n:Hero) WHERE id(n)=nodeId
RETURN community,
count(*) as communitySize,
collect(n.name) as members
order by communitySize desc limit 5
我使用Gephi進行社群結果可視化,因為Gephi的表現力比表格更好,更有洞察力。
我並不是漫威漫畫的專家,所以我只能根據數據來做一個簡單的解釋。我們總共劃分出8個社群。最大的社群是紫色的社群,它由以美國隊長為首的神盾局和復仇者聯盟組成。在左邊我們能看到神奇先生和神奇四俠也在紫色社群里。亮蘭色是蜘蛛俠團隊,蜘蛛俠帕克是他們與外界聯系的唯一橋梁,其他人都是內部交流,與外界並無聯系。深蘭色是阿斯加德人,他們也是比較封閉,他們僅僅和雷神托爾有聯系。哦?難以置信,綠巨人也是自己的社群(粉紅色),而綠巨人是這個社群唯一與外界有聯系的英雄。我們還看到野獸亨利是紫色社群與綠色社群的橋梁,位置特殊,而綠色是X-Men社群。
標簽傳播演算法是由Raghavan等人於2007年首次提出,(譯者言:網路顯示此演算法於2002年由Zhu等人提出)此演算法是由每個結點使用其唯一標識作為標簽,然後根據大多數鄰居結點的標簽為基礎進行標簽傳播,每個結點再從他的鄰居結點身上取出現次數最多的標簽加到自己身上。LPA演算法的具體步驟是這樣:結點X有一些鄰居結點,且每個鄰居結點都有一個標簽,標明他們所屬的社群。然後網路中的每個結點都選擇加入其大多數鄰居所屬的那個社群,同時再隨機的斷開一些連接。在開始時,每個節點都用唯一標簽進行初始化,然後這些標簽開始在網路中進行傳播,傳播的每一步,每個結點都會根據鄰居標簽的情況更新自己的標簽,隨著標簽的傳播,最終連接緊密的結點集合將會達成一個共識,而他們身上的標簽也將不再發生變化。
與Louvaint演算法類似,我們也採用Cypher語句進行圖映射,在映射時僅載入weight值大於KNOWS關系。同時會將對結點進行回寫,導出結果到Gephi中進行可視化展示。
CALL algo.labelPropagation(
// supports node-weights and defining
// initial communities using parameter value
'MATCH (u:Hero) RETURN id(u) as id, 1 as weight,id(u) as value',
// load relationships
'MATCH (u1:Hero)-[rel:KNOWS]-(u2:Hero)
// Similarity threshold
WHERE rel.weight > 100
RETURN id(u1) as source,id(u2) as target, rel.weight as weight',
'OUT',{graph:"cypher",partitionProperty:"lpa" })
YIELD computeMillis
最終我們得到21個社群,包括單點社群。復仇者聯盟(紫色)和神奇四俠(亮蘭色)被分為兩個社群了。蜘蛛俠(綠色),綠巨人(青綠色)和阿斯加德人(紅色)三個社群的結果與Louvain演算法一致。我們還發現X-Man被劃分成兩個社群,加農炮小組比Louvain的結果要稍微大點,同時也顯的不那麼孤立。
你發現沒有?Neo4j圖演算法庫真的很神奇,用起來也簡單。通過與Cypher查詢語句結合進行虛擬圖映射,可以簡單有效的對圖進行分析和理解。
本來,我打算在本文中介紹中心性演算法的使用,但那樣本文將會非常長,不便於閱讀,所以, 我後續將會再寫文章來介紹使用Cypher映射進行中心性演算法的示例。敬請期待吧。
Ⅶ 加入黑名單的好友可以看到可能認識的人嗎
加入黑名單的好友不能看到可能認識的人,因為黑名單的作用是將某個人從自己的社交網路中屏蔽掉,即使被屏蔽的人與其他人存在關聯,也不會在自己的社交網路中顯示出來。因此,黑名單的好友無法在自己的社交網路中看到與被屏蔽的人有關聯的可能認識的人。
同時,值得注意的是,社交網碧皮閉絡平台可能會提供「可能認識的人」等功能,這些推薦可能認識的人的演算法不悔裂僅僅基於你的好友列表,還會基於你的搜索歷史記錄、瀏覽行為等信息,因此,即使把某個人加入黑名單,社交網路平台仍然可能推薦與被屏蔽的人有關聯的可能認識的人握做。
Ⅷ 社交網路數據分析與應用
社交網路數據分析與應用
根據最近的一份調查數據顯示,美國互聯網媒體的市值已達10890億美元,是傳統媒體的3倍,類似的在中國,根據艾瑞咨詢發布的2014年第二季度網路經濟核心數據顯示,截止2014年6月30日,中國主要上市互聯網公司市值前五的為騰訊(1405.6億美元)、網路(654.5億美元)、京東(389.7億美元)、奇虎360(120.9億美備敬唯元)、唯品會(111.9億美元)。與此同時,以Facebook,Twitter,微博,微信等為代表的社交網路應用正蓬勃發展,開啟了互聯網時代的社交概念。據全球最大的社會化媒體傳播咨詢公司We Are Very Social Limited分析指出,目前社交類軟體使用的人數已達25億——佔世界總人數約的35%,另據艾瑞咨詢發布的2014年第二季度社區交友數據顯示,2014年5月,社區交友類服務月度覆蓋人數達到4.7億,在總體網民中滲透率為92.5%;2014年5月社交服務在移動App端月度覆蓋人數為1.9億人,其中微博服務在移動端優勢較為明顯,月度覆蓋人數達到1.1億人;互聯網媒體和社交網路是Web2.0時代兩個非常重要的應用,那麼一個自然的問題是這兩個領域將會如何互動發展?本報告主要從數據分析(非財務、非戰略)的角度嘗試探討網路結構會給互聯網媒體帶來什麼樣的機遇和挑戰。具體而言,我們根據自己的研究經驗只關注以下幾個方面:新聞、影音和搜索,根據艾瑞咨詢發布的2013網路經濟核心數據顯示,這三部分的收入佔到中國市值TOP20互聯網企業總市值的32.16%,其重要性不可忽視。我們通過具體的案例並結合理論前沿做探索性的研討。
一、音樂推薦
根據《2013中國網路音樂市場年度報告》顯示,2013年底,我國網路音樂用戶規模達到4.5億。其中,手機音樂用戶人數由2012年的0.96億增長到2013年的2.91億,年增長率達203%。從網路音樂用戶規模的飛躍式增長可以看到音樂流媒體服務蘊含著巨大的商機。在國外,科技巨頭爭奪音樂市場的野心也初露端倪,今年年初,蘋果斥資30億美元買下Beats Electronics,而谷歌也隨後收購了流媒體音樂服務提供商Songza。
音樂產業在新媒體時代占據重要地位。本報告主要關注移動互聯網環境下在線音樂服務商(酷狗音樂、QQ音樂、天天動聽等)的發展現狀並且對當前的音樂個性化推薦提出我們的一些見解。
1.1 音樂推薦與社交網路
根據國內知名研究機構CNIT-Research 8月份發布的《2014年第二季度中國手機音樂APP市場報告》的數據顯示,排名前三的手機音樂App為酷狗音樂、QQ音樂、天天動聽。他們所佔的市場份額分別為:20.1%,17.0%以及15.8%。
酷狗音樂 QQ音樂 天天動聽
其中,酷狗音樂和天天動聽憑借在在線音樂領域長期積累的用戶資源、高品質音質、卓越的UI界面以及完美的下載體驗取勝。而QQ音樂主要依附強大的社交工具QQ應運而生,可謂是「社交音樂」領域的先驅者。從2014年第二季度手機音樂數據來看,稿猛QQ音樂增勢迅猛,連續三個月用戶下載量增速均超過行業增速水平,而酷狗音樂、天天動聽均增速低於市場行業增速,用戶市場份額有所下降。
根據速途研究院對手機音樂用戶願景的調查顯示,有58%的用戶希望增強個性化音樂推薦的功能,這說明有很多用戶在收聽音樂時其實並不清楚自己喜歡什麼類型的歌曲,如果音樂電台能根據用戶的個人喜好「猜出」用戶喜歡什麼歌曲並為其進行推薦,那將會給用戶帶來意想不到的完美體驗。目前的很多音樂軟體都支持推薦這一功能。以下是音樂App市場中常見的音樂產品的個性化推薦以及定製方式:
酷狗音樂 QQ音樂 天天動聽
根據研究,推薦模式主要分為以下幾種:(1)仿培 熱點推薦,可以根據大眾的搜索記錄,通過排行榜的形式得到,也可以根據近期發生的音樂娛樂事件推薦,如中國好聲音、我是歌手等;(2)根據用戶的聽歌記錄推薦,包括用戶對每首歌的喜惡記錄;(3)根據地理位置信息結合用戶興趣進行推薦;(4)根據用戶喜歡的歌手信息進行推薦。但是,以上這些推薦模式都沒有能夠充分利用社交網路的信息。在社交網路風靡全球的時代,有越來越多的音樂服務商發現,社交網路可以幫助商家留住更多的用戶,同時,充分利用社交網路信息將帶來更加卓越完美的用戶體驗。可以看到,酷狗音樂和天天動聽都允許用戶使用第三方賬戶(微博、QQ)進行綁定登錄,並提供分享到微博、微信等選項;QQ音樂特設了「動態」專欄,用於顯示好友分享的音樂。另外,酷狗和QQ音樂都可以通過定位的方式推薦附近的志趣相投的好友。
酷狗音樂 QQ音樂 天天動聽
上述事實說明,社交音樂存在巨大的潛力和價值。那麼,這一方面有無突出的企業呢?其中英國的Last.fm和中國的QQ音樂可以算得上是這方面的一個代表。
Last.fm QQ音樂
Last.fm是 Audioscrobbler 音樂引擎設計團隊的旗艦產品,有遍布232個國家超過1500萬的活躍聽眾。2007年被CBS Interactive以2.8億美元價格收購,目前,Last.fm是全球最大的社交音樂平台。QQ音樂是中國互聯網領域領先的網路音樂平台及正版數字音樂服務提供商,在中國手機音樂市場所佔份額躋身四大巨頭(其他三個分別是酷狗、天天動聽、酷我),月活躍用戶已達到3億,是中國社交音樂領域的領軍人物。
以QQ音樂為例,我們詳細分析它在利用社交網路信息進行個性化推薦的優勢與可能存在的不足。QQ音樂依附強大的社交工具QQ而生,長期以來受到廣大用戶的喜愛,這與QQ背後的億萬級用戶是無法割離的,可以說,QQ音樂是有先天的社交優勢的。用戶登錄QQ音樂後,可以看到動態欄中顯示的好友音樂動態,同時,它還允許用戶綁定自己的微博賬號,把音樂分享給微博好友。不僅如此,QQ音樂允許用戶自己編輯生成歌單,並分享給好友,這起到了一定的自媒體的作用。在「明星部落」這一功能中,QQ音樂允許粉絲之間交流互動,並形成一定的社交規模。從上述總結中,我們已經可以看到,QQ音樂已經有意識的把社交信息融合到產品設計和運營中,以增加客戶粘性。但是從數據分析的基礎和推薦演算法的構建上,是否真正做到有效利用社交網路信息了呢?為此,使用QQ音樂於2012年全面更新升級的「猜你喜歡」功能,並發現了如下問題:當筆者沒有任何聽歌記錄時,這一模塊並不能為筆者推薦歌曲。根據提示內容,目前該功能可能主要依靠用戶的歷史聽歌記錄進行推薦。同樣的問題出現在QQ音樂館的推薦欄中:大部分初始推薦音樂來源於當下熱門音樂歌曲,缺少個性化成分。
QQ音樂:猜你喜歡 QQ音樂館
以上事實說明音樂服務商在推薦演算法上沒有充分利用社交網路的信息。事實上,在獲得用戶個人綁定社交網路賬號的基礎上,可以得到用戶的朋友關系,進一步可以獲得用戶好友的聽歌記錄,這些歌曲可以成為初始推薦曲目的備選項,將這些備選項通過一定規則(熱度、好友相似度)排序,可以用於音樂推薦;另外,眾所周知,社交網路(如微博)是明星與粉絲互動的一個重要渠道,因此,可以重點提取用戶對於社交網路中歌手以及音樂人的關注關系,以獲得對用戶偏好的推測。以上這些過程可以用下圖表示。
可以看到,在以社交網路綁定的音樂社區中,每個人並不是孤立的個體,而是通過好友關系,以及粉絲與明星的關注關系聯系起來。音樂活動的多元化為QQ音樂的推薦場景帶來了新的挑戰。我們認為存在以下幾個需要處理的問題:(1)如何高效利用好友的音樂信息對用戶進行推薦?用戶的好友眾多,每個好友會留下很多音樂記錄,這些信息綜合起來的話數量極其龐大,如何迅速整合朋友及其收聽記錄並按照優先程度排序對用戶進行推薦是提高用戶體驗的前提條件。(2)如何整合多種信息渠道進行推薦?隨著時間的推進,一個音樂賬戶留下的信息是多元化的。例如,用戶主動搜索的音樂記錄、用戶對歷史收聽音樂記錄的反饋,用戶選擇的電台種類、用戶自己總結生成的歌單、用戶對朋友分享音樂的反饋信息等。因此,如何對這些異質的信息來源進行有效整合,或者,在資源有限的情況下,如何判斷和篩選出對於提高推薦精度最有效的指標是提高音樂推薦效果的關鍵法寶。(3)如何整合當前音樂潮流趨勢與用戶個人興趣基因?音樂是充滿了潮流和娛樂性的產業,因此,用戶的音樂興趣不僅受其自身興趣基因驅使,也受到當前音樂流驅使的影響。因此,如何結合用戶個人興趣以及音樂潮流趨勢對用戶進行有效推薦,是對於音樂這一特殊娛樂行業的特別要求。綜上我們認為QQ音樂雖然是利用社交關系進行音樂推薦的先驅者,但是在利用網路數據的層面上仍有很大的改進和提升空間。
1.2 基於社交網路的音樂推薦
在此我們給出如何利用網路數據對用戶進行推薦的技術思想。由於音樂推薦場景實體的多元化,我們將常見的推薦場景列舉如下:推薦歌曲、推薦歌單、推薦電台、推薦歌手、推薦用戶。接下來,我們將從音樂分類與結構化、用戶信息整合、網路結構應用三個步驟詳細闡述我們的觀點。
音樂結構化與歸一化
1.歌曲標簽化
首先,基於音樂的不同風格,我們需要對系統中存在的海量歌曲進行分類,通過打標簽的方式,使音頻信息通過文本的方式結構化。分類的方法多種多樣,標准各異,從幾個音樂主流網站的標簽組織形式看來,主要從客觀、主觀兩個角度進行分析。從客觀的角度講,音樂可以按照流派、地域、年代、演奏樂器等方式分類,如「流行」、「搖滾」、「鄉村音樂」、「90後」、「鋼琴曲」等等,且大類下面可以設小類,如「流行」下可以設置「華語流行」、「歐美流行」等小類;從主觀的角度講,音樂風格與聽歌時的心情、場景高度相關,如分為「甜蜜」、「安靜」、「治癒」、「酒吧」、「咖啡館」等等,這種標簽使得用戶在聽音樂時彷彿有一種身臨其境的感覺,帶來更高的視聽享受。除此之外,標簽也可以由用戶自己生成,如用戶的熱搜關鍵詞記錄、用戶自行備注標簽等。這在一定程度上正是利用自媒體的形式擴充標簽庫,使之更能反應用戶興趣。
2.歌手信息提取
除了可以將歌曲標簽化,我們還可以進一步的對歌手信息進行提取。比如根據地域我們可以把歌手分為大陸、港台、歐美等,根據年代可以分為60後、70後、80後歌手,根據他們的曲風可以分為搖滾、抒情、朋克等。通過打標簽的形式把歌手進行分類,從而形成結構化的數據格式,方便以後快速清晰的定位用戶喜歡哪一類型的歌手。同樣的我們也可以對歌單、作詞者、作曲者進行標簽化處理,例如歌單的標簽可以模仿歌曲的形式,因為歌單是由歌曲組成,所以可以用歌曲的標簽來代表歌單的標簽。作詞者和作曲者的標簽可以參考歌手打標簽的方法,另外值得注意的是,由於音樂人之間形成合作、作曲、寫詞等合作關系,可以認為是一個社交網路關系,常常可以見到的現象是某些歌手與詞作者存在密切的合作關系,而這部分信息也可用於音樂的個性化推薦。例如,對於一些有特定合作的歌手和詞(曲)作者,我們應該特別留意,比如周傑倫和方文山這對組合。
3.歌詞的語義分析
歌曲的重要組成部分就是歌詞,由於歌詞屬於文本,我們不可能直接對其打標簽,所以首先要進行的是語義分析,通過語義分析我們可以大概知道歌詞的內容,比如我們可以把歌詞切分成短語,然後對每一個短語進行歸納總結,可以判斷短語的情感極性(如積極還是消極),對短語進行主題分類,由於歌詞數目龐大,可以利用自然語言處理的方式,如主題模型等預先提取主題,再通過人工加以校正。這樣就可以對歌詞進行標簽化處理了。下面我們以歌曲為例,簡要的說明具體標簽化過程。
通過標簽的形式我們可以對每個歌曲的主題予以分類和描述。用於描述一支單曲的標簽數目越多,對於音樂主題的描述就更加清晰、明朗;但同時,冗餘和重復的信息也可能越多,處理的難度就越大。因此,我們要對標簽進行排序和篩選,一個比較簡單高效的辦法是選擇最熱門的N個標簽作為我們的目標詞庫,並且對該詞庫定期進行更新。具體來說,我們將所有標簽按照重要程度由高到低進行排序,選擇前p個標簽作為我們的標簽集合。給定一首歌曲t,我們用一個超高維向量Xt=(Xt1,…,Xtp)∈?p表示它的標簽信息,其中Xtj=1表示該歌曲含有第j個標簽,否則,該歌曲不含有第j個標簽。例如對於一首鋼琴曲演奏的純音樂,對其打的標簽可能是:鋼琴曲、安靜、咖啡館等。設鋼琴曲、安靜、咖啡館分別對應於標號為1、3、5的標簽,那麼向量Xt可以表示為Xt=(1,0,1,0,1,0,…0) 。通過以上步驟,我們就可以把看似雜亂的音樂風格通過打標簽的形式進行結構化,用一個只含0、1元素的超高維向量對每首歌曲進行分類。
對於歌單、電台這些由歌曲集合而成的實體,我們也可以通過標簽的方式對其進行刻畫。例如,對於給定的一個歌單m,我們同樣用一個超高維向量
Ⅸ 如何用python實現《多社交網路的影響力最大化問題分析》中的演算法
經過一周,現已初步完成,其中多出代碼不夠美觀以及效率不高,還請指點
# _*_ coding:utf-8 _*_
# ==================================================================================
#
# Description: Influence Maximization on Multiple Social Networks
#
# ==================================================================================
import matplotlib.pyplot as plt
import networkx as nx
import heapq
#總圖
G = nx.DiGraph()
def load_graph(file):
'''
載入文件為列表格式,並得到G,畫出圖結構
'''
#將總列表設成全局格式
global gllist
#迭代文件中每個元素
with open(file) as f:
lines = f.readlines()
mylist = [line.strip().split() for line in lines]
gllist = []
#將字元串型轉換為整型
for i in mylist:
gllist.append(i[:-2]+map(lambda x: float(x), i[-2:]))
print '初始全局列表:'
print gllist
drawlist=[]
#提取二維列表mylist每行前三個元素,賦給新的列表drawlist
for i in range(len(mylist)):
drawlist.append([])
for j in range(3):
drawlist[i].append(mylist[i][j])
#將列表drawlist載入為有向加權圖
G.add_weighted_edges_from(drawlist)
nx.draw(G, with_labels=True, width=1, node_color='y', edge_color='b')
plt.show()
print 'G圖中所有節點:',G.nodes()
print 'G圖中所有邊:',G.edges()
print '\n'
def get_self_node(gllist, target=None):
'''
獲取目標節點的自傳播節點,返回selflist並包含含晌目標節點
'''
#初始化自傳播節點列表
selflist = [target]
#存放已傳播節點列表
haslist = []
flag = 0
while (flag != 0):
flag = 0
for target in selflist:
if target not in haslist:
for i in range(len(gllist)):
#判斷二維列表中,每行第三個元素是否為1,若為1,則為自傳播節點
if ((gllist[i][0] == target)or(gllist[i][1]==target))and(gllist[i][3]==1.0):
if gllist[i][0] == target:
if gllist[i][1] not in haslist:
selflist.append(gllist[i][1])
haslist.append(gllist[i][1])
flag += 1
else:
if gllist[i][0] not in haslist:
selflist.append(gllist[i][0])
haslist.append(gllist[i][0])
flag += 1
#去除重復元素
haslist = set(haslist)
selflist = set(selflist)
#去除重復元素
selflist = set(selflist)
return selflist
def longest_path(gllist,source=None,target=None):
'''
獲取起始點到實體的最大談配鋒路徑集合,返回賣悉為longestpath列表
'''
longestpath = []
newlist = []
for i in range(len(gllist)):
newlist.append([])
for j in range(3):
newlist[i].append(gllist[i][j])
#構建圖結構
G1 = nx.DiGraph()
#添加帶權有向邊
G1.add_weighted_edges_from(newlist)
#獲取目標節點的所有自傳播街邊,並存入selflist中
selflist = get_self_node(gllist, target)
max_path = 0
val_path = 1
#獲取初始節點到目標節點及目標節點的自傳播節點的最大路徑
for v in selflist:
if v != source:
#遍歷兩點之間所有路徑,並進行比對
for path in nx.all_simple_paths(G1,source=source,target=v):
#判斷路徑後兩個元素是否為相同實體(如:b1->b2)
if is_self_transmit_node(path[-2], v) == 0:
for i in range(0, len(path)-1):
val_path *= G1.get_edge_data(path[i], path[i+1])['weight']
if max_path < val_path:
max_path = val_path
val_path = 1
#若目標節點為起始節點則直接跳出
else: continue ############ 有待商榷 ##############
longestpath.append(max_path)
#返回初始節點到實體的最大路徑
return longestpath
def is_self_transmit_node(u, v):
'''
判斷目標節點不為起始節點的自傳播點
'''
flag = 0
#獲得起始節點的所有自傳播點
selflist = get_self_node(gllist, v)
for x in selflist:
if u == x:
flag = 1
return flag
def single_strong_infl(longestpath):
'''
計算起始點到實體的傳播概率(影響強度),返回影響強度stronginfl
'''
temp = 1
for x in longestpath:
temp *= 1-x
stronginfl = 1-temp
return stronginfl
def all_strong_infl(G):
'''
獲得每個節點對實體的影響概率
'''
allstrong = [] #初始化所有節點的加權影響范圍列表
gnodes = [] #初始化節點列表
tempnodes = [] #初始化臨時節點列表
gnodes = G.nodes()
for u in gnodes:
strong = 0 #存儲初始節點對每個實體的影響范圍加權,初始化為0
#重置臨時節點列表
tempnodes = G.nodes()
for v in tempnodes:
#非自身節點
if u != v:
#判斷目標節點不為起始節點的自傳播點
if is_self_transmit_node(v, u) == 0:
#獲取起始節點到實體間最大加權路徑,並存入longestpath
longestpath = longest_path(gllist, u, v)
#去除已遍歷目標節點的所有自傳播節點
renode = get_self_node(gllist, v)
for x in renode:
if x != v:
tempnodes.remove(x)
#計算起始節點到實體間傳播概率(影響強度)
stronginfl = single_strong_infl(longestpath)
strong += stronginfl
#添加單個節點到所有實體的加權影響范圍
allstrong.append([u, round(strong, 2)])
#返回每個節點到所有實體的加權影響范圍
return allstrong
#output allstrong : [['a1', 2.48], ['a2', 1.6880000000000002], ['b1', 0.7], ['b2', 0], ['c1', 0], ['d2', 0.6]]
def uS_e_uppergain(u, ev, S):
'''
獲取節點u在集合S的基礎上對實體ev的影響增益, 傳入候選節點,上界gain(u|S, ev)
'''
#獲取目前實體的所有自傳播節點
selflist = get_self_node(gllist, ev)
stronglist = []
#遍歷自傳遍節點
for v in selflist:
'''
判斷節點v是否存在種子集合S中
其中v為單個節點,如v(ev, Gi)
S為種子節點集合,如['a1','a2','b1','b2','c1','d2']
'''
if v in S:
ppSv = 1
else:
longestpath = []
#遍歷種子集合
for s in S:
#初始化路徑權值與最大路徑權值
val_path = 1
max_path = 0
#遍歷兩點之間所有路徑,並進行比對
for path in nx.all_simple_paths(G,source=s,target=v):
#判斷路徑後兩個元素是否為相同實體(如:b1->b2)
if is_self_transmit_node(path[-2], v) == 0:
for i in range(0, len(path)-1):
val_path *= G.get_edge_data(path[i], path[i+1])['weight']
if max_path < val_path:
max_path = val_path
#重置路徑權值為1
val_path = 1
#將最大加權路徑存入longestpath列表
longestpath.append(max_path)
#得到上界pp(S,v)的影響概率,上界pp(S,v)
ppSv = single_strong_infl(longestpath)
stronglist.append(ppSv)
#得到上界pp(S,ev)的影響概率,上界pp(S,ev)
ppSev = single_strong_infl(stronglist)
#獲取pp(u,ev)
ppuev = single_strong_infl(longest_path(gllist, u, ev))
#計算上界gain(u|S,ev)
uSevgain = (1 - ppSev) * ppuev
return uSevgain
def uppergain(u, emu, ems, S):
'''
在已有種子集合S的基礎上,求得節點u的影響增益上界,
其中傳進參數ems為二維列表,如[['a1',2.48],['a2',1.688]],S則為['a1','a2']
'''
uSgain = 0.0
#遍歷emu得到列表形式,得到如['a1',2.48]形式
for ev in emu:
#判斷節點是否存在種子集合中
if ev[0] in S:
uSgain += uS_e_uppergain(u, ev[0], S)
else:
uSgain += ev[1]
#返回上界gain(u|S)
return uSgain
def bound_base_imms(G, k):
'''
完全使用影響增益上界的方式選擇top-k個種子節點的過程
'''
#初始化emu,H,初始化ems=空集,S=空集
Htemp = []
Htemp = all_strong_infl(G)
H = []
#遍歷Htemp=[['a1',2.48],['a2',1.688]],得到如['a1',2.48]形式
for x in Htemp:
#逐個獲取二維列表中每一行,形式為['a1',2.48,0]
H.append([x[0],x[1],0])
emu = []
emu = all_strong_infl(G)
ems = []
S = []
for i in range(k):
#提取堆頂元素,tnode的形式為['a1',2.48,0]
tnode = heapq.nlargest(1, H, key=lambda x: x[1])
#將[['b2', 3.1, 0]]格式改為['b2', 3.1, 0]格式
tnode = sum(tnode, [])
while (tnode[2] != i):
gain = 0.0
#獲取節點u的影響增益上界
gain = uppergain(tnode, emu, ems, S)
#賦值影響范圍
tnode[1] = gain
#修改status
tnode[2] = i
#對堆進行排序
H = heapq.nlargest(len(H), H, key=lambda x: x[1])
#獲取堆頂元素
tnode = heapq.nlargest(1, H, key=lambda x: x[1])
tnode = sum(tnode, [])
#添加node到種子集合
S.append([tnode[0]])
#更新ems,添加新節點及節點對每個實體的影響范圍加權
ems.append([tnode[0], tnode[1]])
#刪除堆頂元素
H.remove(tnode)
print ems
return sum(S, [])
if __name__=='__main__':
#大小為k的種子集合S
k = 60
#載入文件數據,得到圖G和初始列表gllist
load_graph('test.txt')
#完全使用影響增益上界值的計算過程函數,列印種子集合S
print '種子集合:',bound_base_imms(G, k)
test.txt
a1 b1 0.2 0
a1 c1 0.8 0
a2 b2 0.4 0
a2 d2 1 0
b1 c1 0.7 0
c2 a2 0.8 0
d2 b2 0.6 0
a1 a2 1 1
a2 a1 0.1 1
....
a1 l1 0.5 0
a1 m1 0.5 0
a1 q1 0.5 0
a1 v1 0.5 0
a1 z1 0.5 0
a1 s1 0.5 0
a1 w1 0.5 0
a1 u1 0.5 0
其中前兩列為傳播實體,第三列為實體間傳播概率,最後一列為0代表同一網路傳播,為1代表網路間自傳播。
下來要進行優化:
1.採用獨立級聯模型,設置閾值
2.將最大路徑改為最短路徑,利用log
Ⅹ web3是什麼
Web3.0,又稱Web3(下文我們都用Web3來代替Web3.0),是以太坊聯合創始人、Polkadot創建者Gavin Wood在2014年提出的。