先介紹下金融借貸業務流程:使用者前來申請借貸,會先經過欺詐識別,把欺詐團伙和主觀欺詐的個人拒絕掉,然後對通過的人做信用評估,最後根據額度模型,算出利潤最大化時放款金額。
剛才提到了團隊欺詐,舉個真實的例子。xx貸在他們的財報中公佈的,他們被一個團伙成功擼走了2000多單,當時xx貸的件均4w, 一下損失了8000w!!
那麼如何防範這種風險呢。這就是今天要分享的圖演算法。圖可以將這些一個個有良好記錄的個體關聯起來,一網打盡。
再舉一些團伙欺詐的行為。比如一個團伙,註冊真實的淘寶商家,然後刷出良好的淘寶購物記錄。或者來回轉賬,刷出良好的銀行流水。
剛才前兩位老師都沒有提到額度模型,簡單介紹下,如果只給使用者放款5000,可能壞賬風險很小,但是利息也少,如果放款10000,利息雖然收到利息多了,但是壞賬風險高嶺,所以需要做個權衡
Graph簡介
G=(V,E)G=(V,E)
V:vertex set
E:edge set (有向,無向,有權重和沒有權重)
舉例,兩個人之間的聯絡, A給B買了東西,A和B之間的通話次數時長多於A和C之間。
度中心性(Degree Centrality) - 表示連線到某節點的邊數。在有向圖中,我們可以有2個度中心性度量:流入和流出。一個節點的節點度越大就意味著該節點在網路中就越重要。
接近中心性(Closeness Centrality) - 從某節點到所有其他節點的最短路徑的平均長度。反映在網路中某一節點與其他節點之間的接近程度。
介中心性(Betweenness Centrality) - 某節點在多少對節點的最短路徑上。介數中心性是比較能體現節點在圖中橋樑作用的中心性度量方法。介數反映了相應的節點或者邊在整個網路中的作用和影響力,具有很強的現實意義。例如,在交通網路中,介數較高的道路擁擠的概率很大;在電力網路中,介數較高的輸電線路和節點容易發生危險。
社團發現演算法一般有:
最小割, 正則化割:通過計算圖的最小割,即將網路劃分為預定的分組數,並使連線各分組的邊的條數最少。
非負矩陣分解:基本原理是將原始矩陣分解得到社群指示矩陣和基矩陣
基於模組度的社群劃分
基於節點相似性的社群劃分
最小割演算法廣泛應用在分散式計算的負載均衡中,對叢集節點的分組有利於減少不相關節點之間的通訊。然而由於該演算法限定了網路最終分組的個數,而不能通過演算法“發現”節點間的內在聯絡並自然地構成若干個社群,因此最小割演算法應用較為侷限。
本文主要分享這兩類的主要演算法,基於模組度的 louvain和基於資訊熵infomap,基於相似度的node2vec
模組度(Modularity)公式及簡化
優化目標:一般認為社團內部的點之間的連線相對稠密,而不同社團的點之間的連線相對稀疏。
所以模組度也可以理解是社群內部邊的權重減去所有與社群節點相連的邊的權重和,對無向圖更好理解,即社群內部邊的度數(內部的連線數)減去社群內節點的總度數。
模組度公式的解釋
節點i和節點j之間邊的權重,網路不是帶權圖時,所有邊的權重可以看做是1;
表示所有與節點i相連的邊的權重之和(度數);
表示節點i所屬的社群;
表示所有邊的權重之和(邊的數目)。
其中表示社群c內的邊的權重之和,表示與社群c內的節點相連的邊的權重之和,即社群c節點的度之和(包含與其他社群相連邊的度)。
從概率的角度去看:
表示實際情況下,c社群內產生邊的概率。
表示在一種理想情況下,給定任意節點i的的度ki,對節點i和節點j進行隨機連邊,邊屬於社群c的概率期望。
於是上式就表示了社群內連邊數與隨機期望的一個差值。連邊數比隨機期望值越高,表明社群劃分的越好。
一般使用後面簡化的公式,簡化後的公式刪除了判斷兩個節點是否劃為同一個社群的函式,所以在一定程度上大大減少了Q值計算量。
Louvain
Louvain演算法的思想很簡單:
將圖中的每個節點看成一個獨立的社群,此時社群的數目與節點個數相同;
對每個節點i,依次嘗試把節點i分配到其每個鄰居節點所在的社群,計算分配前與分配後的模組度變化,並記錄最大的那個鄰居節點,如果,則把節點i分配最大的那個鄰居節點所在的社群,否則保持不變;
重複2,直到所有節點的所屬社群不再變化;
對圖進行壓縮,將所有在同一個社群的節點壓縮成一個新節點,社群內節點之間的邊的權重轉化為新節點的環的權重,社群間的邊權重轉化為新節點間的邊權重,然後重複2,3;
重複2~4,直到整個圖的模組度不再發生變化。
第一階段稱為Modularity Optimization,主要是將每個節點劃分到與其鄰接的節點所在的社群中,以使得模組度的值不斷變大;
第二階段稱為Community Aggregation,主要是將第一步劃分出來的社群聚合成為一個點,即根據上一步生成的社群結構重新構造網路。重複以上的過程,直到網路中的結構不再改變為止。
移動
是社群c內節點與節點i的邊權重之和,再乘以2
前面部分表示把節點i加入到社群c後的模組度,後一部分是節點i作為一個獨立社群和社群c的模組度
1. 模組度與Louvain社群發現演算法
http://www.cnblogs.com/fengfenggirl/p/louvain.html
infomap
從資訊理論的角度出發,假設一個random worker 在圖上進行隨機遊走,那麼怎麼用最少的編碼長度來表示其路徑呢?
如果節點存在社群結構,那麼社群內的節點就可以共享社群的bit位碼,可以得到更小的平均位元, 所以社群劃分的越好,那麼表示任意一條隨機遊走的路徑所需的平均位元就越小。
如果我們能夠計算出每個節點的到達概率,就可以依據資訊熵的公式來量化平均位元了:
怎麼計算每個點的到達概率呢?
一個暴力的辦法是在圖上進行長時間的隨機遊走,最後統計每個節點的出現概率。太暴力了。
利用pagerank思路,初始化了每個節點的到達概率之後,就可以不斷地迭代更新每個節點的到達概率,這個結果會很快趨於收斂。
其實這過程就是一個馬爾科夫隨機過程,隨機初始化起始值,然後隨機遊走就相當於不停地用概率轉移矩陣相乘,最後就可以達到馬爾科夫穩態。
把隨機遊走事件歸為三類:進入某個社團,離開某個社團,再社團內部遊走。
定義清楚各類事件的發生概率,依據資訊熵公式,就可以得到此時編碼所需的平均位元了,其本質就是從資訊理論的角度出發。
Infomap演算法的迭代過程
初始化,對每個節點都視作獨立的社群;
while 平均位元的值不再下降;
對圖裡的節點隨機取樣出一個序列,按順序依次嘗試將每個節點賦給鄰居節點所在的社群,取平均位元下降最大時的社群賦給該節點,如果沒有下降,該節點的社群不變。
參考連結
1. The map equation
http://www.mapequation.org/apps/MapDemo.html
2. https://mp.weixin.qq.com/s/qUxMesQA-edSyHeudQRRGA
3. DEEP GRAPH INFOMAX 閱讀筆記
https://zhuanlan.zhihu.com/p/58682802
Graph embeddings
Deepwalk
使用隨機遊走(RandomWalk)的方式在圖中進行節點取樣獲得節點共關係,
使用skip-gram,根據步驟1中生成的節點序列學習每個節點的向量表示。skip-gram就是根據給定輸入的節點,預測上下文節點。
Deepwalk有多不足,比如泛化能力,有新節點加入時,它必須重新訓練模型以表示該節點。
其中一個就是取樣,從其鄰居中隨機取樣節點作為下一個訪問節點,是一種可重複訪問已訪問節點的深度優先遍歷演算法。
node2vec是一種綜合考慮DFS鄰域和BFS鄰域的graph embedding方法
node2vec
優化目標:
條件獨立假設:
特徵空間的對稱性:
優化目標:
計算量非常大,所以論文采用負取樣(negative sample)進行近似計算。
這個node2vec優化目標函式,因為它跟大名鼎鼎的word2vec是一樣。
我們最初是用一個Python寫的包,跑一遍演算法需要一週。後來想,既然優化目標是一樣的,那能不能用word2vec包,因為word2vec用c寫的,而且還採用了 Hierarchical Softmax,negative sampling加速。
然後在網上找到了一個套用word2vec實現的node2vec包,速度快很多。
隨機遊走的方式
複雜網路處理的任務其實離不開兩種特性,前面也提到過:一種是同質性,就是之前所說的社群。一種就是結構相似性,值得注意的是,結構相似的兩個點未必相連,可以是相距很遠的兩個節點。
能不能改進DeepWalk中隨機遊走的方式,使它綜合DFS和BFS的特性呢?所以本文引入了兩個引數用來控制隨機遊走產生的方式。
Z是分子的歸一化常數
如果已經取樣了 (t,v) ,也就是說現在停留在節點v上,那麼下一個要取樣的節點x是哪個?作者定義了一個概率分佈,也就是一個節點到它的不同鄰居的轉移概率:
直觀的解釋一下這個分佈:
如果t與x相等,那麼取樣x的概率為;
如果t與x相連,那麼取樣x的概率1;
如果t與x不相連,那麼取樣x概率為
引數p、q的意義分別如下:
返回概率p:
如果 p>max(q,1) ,那麼取樣會盡量不往回走,對應上圖的情況,就是下一個節點不太可能是上一個訪問的節點t。
如果 p<min(q,1) ,那麼取樣會更傾向於返回上一個節點,這樣就會一直在起始點周圍某些節點來回轉來轉去。
出入引數q:
如果 q>1 ,那麼遊走會傾向於在起始點周圍的節點之間跑,可以反映出一個節點的BFS特性。
如果 q<1 ,那麼遊走會傾向於往遠處跑,反映出DFS特性。
當p=1,q=1時,遊走方式就等同於DeepWalk中的隨機遊走。
簡而言之:
引數p控制重複訪問剛剛訪問過的頂點的概率,
引數q控制著遊走是向外還是向內,若q>1,隨機遊走傾向於訪問和t接近的頂點(偏向BFS)。若q<1,傾向於訪問遠離t的頂點(偏向DFS)。
缺點
慢
先embedding再聚類,感覺這兩個過程很割裂!!融合一下
comE
Graphembedding得到向量後,可以做很多事情,在我們這個主題可以簡單的通過聚類來講節點分組。
但是這個過程比較割裂,先優化node2vec,然後再優化聚類。能不能整體上一次性優化完呢。
comE這個演算法優化目標中加入了社群的檢測和嵌入。通過一個混合高斯模型將節點劃分開。
優化目標中前面兩項跟LINE定義的相似度相似:
1. https://blog.csdn.net/u012151283/article/details/87013915
2. Learning Community Embedding with Community Detection and Node Embedding on Graphs
https://zhuanlan.zhihu.com/p/36924789
3. Learning Community Embedding with Community Detection and Node Embedding on Graphs
https://github.com/vwz/ComE
4. http://sentic.net/community-embedding.pdf
評價指標
Modularity
標準化互資訊 NMI ( Normalized Mutual Information )
假設對於N個樣本點的兩種標籤劃分為U 和 V. 熵為劃分集的不準確性