社交網絡需要用到igraph庫,所以需要安裝。可以在lfd的網站
http://www.lfd.uci.edu/~gohlke/pythonlibs/ 上下載python_igraph,具體的python對應版本和是32位還是64位的,比如我下載了 python_igraph‑0.7.1.post6‑cp35‑none‑win_amd64.whl
利用pip 安裝whl文件:pip install
文件名
.whl
為了避免出錯,打開cmd以后,要cd進入你存放的該whl文件的解壓后的目錄下在用pip進行安裝。
一、社交網絡算法介紹
應用場景:在社交網絡中社區圈子的識別;基於好友關系為用戶推薦商品或內容;社交網絡中人物影響力計算;信息在社交網絡上的傳播模型;虛假信息和機器人賬號的識別;互聯網金融行業中的反欺詐。
什么是圖:
節點代表人,邊代表人與人之間的關系。
無向圖(人人網)和有向圖(twitter或豆瓣這種單向關注的屬於有向圖)。
二分圖(兩類不同的節點,u和v里面的節點沒有連接)和多圖(兩個節點之間有多條邊)
社交網絡算法——分析指標:
一個具體的網絡可以抽象為由一個節點集合V和邊集合E組成的圖G=(V,E),節點數記為n=|V|,邊數記為m=|E|。衡量指標(社交網絡的分析性指標)包括
①度(結點直接關聯的屬性)
通俗點理解就是人有多少個朋友。無向圖的話只有度,有向圖的話有入度和出度。
②緊密中心性(closeness centrality)
某個結點到達其他結點的難易程度,也就是其他所有結點距離平均值的倒數。該數值越大,說明周圍聚集的點越多。
(路徑個數-1)/路徑長度
方法1:自己寫,Igraph中,有g.get_all_shortest_paths(‘7’) #獲得7的所有最短路徑
方法2:用igraph中的函數closeness
③介數中心性(betweenness centrality)
網絡中的交通樞紐性,拿掉后網絡會分裂開。
計算整個網絡中任意兩個節點的最短路徑,當然需要得到具體路徑,對各個節點判斷該節點是否在最短路徑上,最后將剛剛的判斷進行累加得到從i到j的最短路徑經過該節點的個數,比如數一下,經過7的最短路徑有幾條。
代碼實現:
#coding=utf8 from igraph import * from igraph import Graph as IGraph import os import time import pandas as pd import numpy as np edges = [] path = './data/' firstline=True for file in os.listdir(path): if file.endswith(".csv"): with open(path+file, 'rb') as f: for row in f.readlines(): if firstline == True: firstline = False continue parts = row.decode().replace(' ','').replace('\r\n','').strip().split(",") try: u, v, e, weight = [i for i in parts] edges.append((u, v, int(weight), e)) except ValueError: continue g = IGraph.TupleList(edges, directed=True, vertex_name_attr='name',edge_attrs=['weight','relationship']) #中心度計算、緊密中心性、介數中心性、pageRank等計算 print ('STARTING TIME : ', time.asctime((time.localtime(time.time())))) data = [] for p in zip(g.vs, g.degree(), g.indegree(), g.outdegree(),g.closeness(weights="weight"),g.betweenness(),g.pagerank(weights="weight",niter=100)): data.append({'name':p[0]['name'], 'degree':p[1], 'indegree':p[2], 'outdegree':p[3], 'closeness':p[4] ,'betweeness':p[5],'pageRank':p[6]}) #根據pagerank排個序 result = sorted(data, key=lambda x:x['pageRank'],reverse=True) result1 = pd.DataFrame.from_dict(result) result1.to_csv('./outData/graphIndex.csv',index=False,encoding='gb18030') print('ENDING TIME: ', time.asctime((time.localtime(time.time()))))
社交網絡算法——PageRank算法:
思想:被大量高質量網頁引用的網頁也是高質量網頁(質量高的網頁有很多鏈接指向它)。最初會設置一個初始值,假設所有網頁的一個權重是1/N(B0),然后用A*B0去得到Bi(新的權重),其中A還一個方正,比如有7個節點,就是7*7的矩陣,里面的值是每個節點之間邊的數量。第三個公式是對第一個的優化,設定α的值(阻尼因子,反應用戶停留當前頁面而不鏈走的概率),幫助更快的收斂。該算法其實是利用了馬爾科夫鏈,求得最終收斂的穩定概率,最終停留在一個頁面上概率越高,說明該頁面越吸引人,質量越好,求出的遍歷概率作為PageRank值)。A
Python中也有現成的包,其中參數damping就是α的值。
復雜網絡理論中網絡的三大特性:小世界、無標度(無尺度,網絡中的度服從冪律)、社區結構
社交網絡算法——社區發現算法:
什么是社區?同一社區內的節點與節點之間的連接很緊密,而社區與社區之間的連接比較稀疏。設圖G=G(V, E),所謂社區發現是指在圖G中確定nc(>=1)個社區C={C1, C2,….Cnc},使得各社區的頂點集合構成V的一個覆蓋。
若任意兩個社區的頂點集合的交集均為空則稱C為非重疊社區,否則為重疊社區。 更加貼近於真實的網絡情況,而聚類算法不允許一個點屬於多個類。
社交發現算法——GN算法:
邊介數(betweenness):網絡中經過每條邊的最短路徑的數目。
GN算法:計算網絡中所有邊的介數;找到介數最高的邊並將它從網絡中移除;重復,直到每個節點就是一個社團為止。GN算法的復雜度較高,做了一次全網遍歷,計算邊介數,時間消耗非常高。該算法是最經典的社區發現算法,利用分裂的思想來做的。其中不一定是要計算邊介數,你也可以計算度、緊密中心性等等,你可以自己優化該算法。
邊介數的計算:
社區評價指標——模塊度(評價整個社區划分結果):
模塊度,利用了社區結構的定義,社區內的節點聯系是比較緊密的,社區中兩個節點有邊的概率要高於隨機圖中兩個節點有邊的概率。Aij是鄰階矩陣(各節點之間相連的邊介數),KiKj/2m(所有節點間的邊隨機連接,兩點之間連接的概率)。為1,如果i和j屬於同一個社區,否則為0。
社區評價指標——阻斷率conductance(單個社區緊密性的評估):
連接到社區外的邊數/社區內的節點連接的邊個數。越小越好。
社區發現算法——Louvain算法(工業界中用的較多,並行化后速度更快):
該方法就是利用模塊度來優化的一種方法。首先把每一個節點作為一個獨立的社區,假設我們把J1加入到i會有一個模塊度的增量,把J2加入到i會有一個模塊度的增量..等等,從中選出模塊度最高的一個鄰居節點,加入i的社區中。這是一種啟發式的凝聚算法,直到detaQ不會是為正的為止。
社區發現算法——LPA算法label propagation agrithm(時間復雜度較低近似n,標簽傳播的思想):
但該算法在工業界並沒有很好的實踐,開源社區給出的代碼,穩定性並不是很好。優點:不需要預先知識,不用預先給定社區的數量,可以控制迭代的次數來划分節點類別。可擴展性強,時間復雜度近線性,適合處理大規模復雜網絡。
算法思想:初始化每個節點,給其唯一標簽;根據鄰居節點最常見的標簽更新每個節點的標簽;最終收斂后標簽一致的節點屬於一個社區。
同步更新:可能存在最后不能收斂的情況。
異步更新:使用到上一次我的節點更新的信息
spark中scala語言實現,graphx包中有該方法,如果不做優化調用該包,可能結果不是很穩定,效果不會很好
社區發現算法——SLPA算法(LPA算法的改進)speaker listener propagation agrithm
算法思想:之前LPA算法,每個節點只有一個標簽,SLPA給每個節點設置一個列表來存儲歷史標簽,每次迭代更新的標簽都存儲起來;
如下圖,每個Speaker節點帶概率選擇自己標簽列表中的標簽傳播給listener節點(Speaker節點為Listerner節點的鄰居節點);節點將最熱門的標簽更新到標簽列表中(如果迭代20次,則存儲20個標簽);使用閾值r去刪除低頻標簽,產出標簽一致的節點為社區。(支持非重疊社區)類比現實中,我們有很多朋友,這些朋友都在跟我說一些消息,如果有多個朋友跟我說同一個消息,我記住的可能性也會非常大。
社交網絡算法在金融反欺詐中應用
傳統反欺詐主要是評分卡,其實就是邏輯回歸,只是變量的選取會有一定的技巧。
應用社交網絡反欺詐:客戶一度、二度關系是否觸黑;客戶消費關聯商家是否異常;一機多人;識別組團欺詐(離線情況下,社區划分,可能有些社區的違約率很高,我們就把他貼上拒貸用戶的標簽,對於新來的用戶,就可以判斷他屬於哪個社區)
業界現在有構造知識圖譜