8.2.py 知識圖譜


該章節涉及到知識圖譜的知識,我們先說幾個概念

1.節點和邊

節點就是現實世界存在的實體,邊就是實體和實體之間的關系

 

 2.權重

權重通常用與衡量關系的強弱,權重越大,比如說用戶A給用戶B打了15個電話,則權重為15

3.有向圖無向圖

根據邊是否有方向,分為有向圖和無向圖,比如說用戶A給用戶B打了15個電話就是有向圖,但是A和B是同事就是無向圖了。

4.中心度和相似性

中心度來衡量網絡中每一個節點的活躍程度,其中衡量中心度有多重方式,下面介紹幾種表示方法

(1)度:節點的度是指與該節點相連的邊的個數,節點的度越大,說明該節點在該網絡中越活躍,使groupby和count或者nunique()結合使用可以計算度,也可以使用networkx.degree()計算

(2)Eigenvector中心度:只是使用度就是中心度,乜有考慮到鄰接節點的信息,Eigenvector的設計思想是一個節點的活躍並不只體現他有非常大的度,還體現與他相連的節點也有非常多的度。

(3)Pagerank

(4)Bbtweennss

Jaccard相似度

5.節點分類

要對節點進行分類預測,首先要找到從網絡中抽取特征的方法,即通過特殊的表達手段,將網絡中的節點空間關系抽象為一個向量

(1)朴素節點分類

朴素節點分類思想非常簡單,只需要根據節點與其他節點是否相連,進行one-hot編碼后,排列成列向量,和標簽一起帶人分類器進行訓練

節點A的向量 表示為[0,1,0,0,1]

因為A和B、E向量,因此[A,B,C,D,E]只有B和E的位置是1,其余都是0

 

(2)鄰節點加權投票

在知識圖譜中,通常認為,用戶 的信息會由邊進行傳播並不斷衰減,而朴素節點分類中,沒有考慮到節點之間的相互作用,一般來說相連的用戶可能具有相同的標簽,比如一個用戶被打上欺詐標簽,那么他的一度聯系人會轉變成欺詐用戶的概率會大大提高,這種情況下,可以使用一種叫共生節點分類的半監督學習方法對節點進行分類。

鄰節點加權投票(WVRN)是一種典型的共生節點分類法,每一個無標簽節點 i 的標簽由其鄰居 N(i)進行加權投票得到,公式到時再補上

權重就體現在節點 i 的鄰居節點標簽的概率上,也就是說,鄰居中對自己標簽最有信息的節點,對應節點 i 的貢獻也會越大,從而可以根據網絡中部分有標簽樣本的標簽,迭代得到其余無標簽樣本的標簽,最終,網絡中的每個節點的標簽概率會收斂到一個穩定的值。

(3)一致性標簽傳播 

根據鄰居節點概率加權投票的方式,雖然考慮到了節點信息的流轉,但是每一次更新的時候都沒有將自身的信息考慮進去,簡單來說,一個節點在經歷一次更新時,相比自身原來的標簽不應該有太大的改變。如果想把每個節點自身的信息考慮進去,可以使用另一種共生節點分類的算法,一致性標簽傳播(CLPM),一致性標簽傳播也是一種半監督的學習方法,可以根據網絡中有部分標簽樣本的標簽,迭代得到其余無標簽的樣本的標簽。

 

6.社區發現算法

對於團伙欺詐檢測,主要有2類發現算法:

(1)社區檢測:通過對固定的網絡社區進行划分,從而得到一個個團簇結構;

(2)社區搜索:首先給定一個網絡社區和其中的某個節點A,然后從節點A出發尋找與A有關的社區;

GN算法:Girvan-Newman算法是最經典的社區發現算法之一,基本思想是,如果去除社群之間連接的邊,留下的就是社群。該算法認為,2個社群之間的點的最短路徑總是要通過社群間的連接邊,因此中心度越大的邊,越可能是不同社群的連接邊,所以只需要不斷將中心度大的邊去掉,就可以得到獨立的社群。

算法步驟如下:

(1)計算所有邊的邊中心度;

(2)將邊中心度最高的邊去掉;

(3)重新計算被去掉的邊影響的邊的邊中心度;

(4)重新第2和第3步,直至不連通的社群個數達到預想值;

import networkx as nx  
from networkx.algorithms import community  
import itertools  
  
G = nx.karate_club_graph()  
nx.draw(G,with_labels=True,  
        edge_color='grey',  
        node_color='pink',  
        node_size = 500,  
        font_size = 40,  
        pos=nx.spring_layout(G,k=0.2))  
comp = community.girvan_newman(G)     
# 令社區個數為4,這樣會依次得到K=2,K=3,K=4時候的划分結果
k = 4  
limited = itertools.takewhile(lambda c: len(c) <= k, comp)  
for communities in limited:  
    print(tuple(sorted(c) for c in communities)) 

Louvain算法

在實際使用中,GN算法雖然准確率很高,但是計算量很大,時間復雜度也高,因此再推出Louvain算法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM