社交网络分析与反欺诈
一、總體概述
? ? 目前針對圖網絡結構,比較熱門的一個部分就是知識圖譜,知識圖譜是基于二元關系知識庫,構成網絡結構,基本組成單位是”實體-關系-實體“的三元組,實體之間通過關系相互聯結。
主要可以應用的場景有:風險預測、反欺詐、精準營銷、智能搜索等
常用的是采用個人信息進行一個場景構建,構建知識圖譜的流程例子如下所示:
1、通過對數據進行清理,抽取,構建知識圖譜的節點,比如:姓名、ip、聯系方式、手機號、工作地點、GPS等
2、構建基礎信息表,然后不斷更新,可以保證數據的一致性
3、基于清洗后的信息,進入圖數據庫,構建整個知識圖譜
4、基于圖算法進行相關的特征抽取或者通過網絡結構進行負樣本挖掘
說到節點的信息,例如一個人為節點,那這個人其它的屬性也可以稱為這個人的特征,通常某個節點還會提及設備指紋。
設備指紋:可以把手機設備理解成一個人,像人一樣有身份證號和名字(設備序列號),適用于唯一標識出該設備的設備特征或者獨特的設備標識。一般都是某些設備信息,通過一些設備指紋算法將這些信息組合起來,通過特定的hash算法得到一個最后的ID值,作為該設備的唯一標識碼。常見的元素有:Wifi信息;瀏覽器本身信息,包括UA、版本、操作系統;操作系統的特征,是否越獄等
主動式的設備指紋:一般是指需要在客戶端上植入自己的SDK代碼,主動的收集設備相關的特征,用以表示設備和用戶。一般理想的特征應該是一段時間內不會隨著外界的條件變化或者用戶的不同操作行為而發生變化,同時在不同的設備上具有顯著的差異。現在這種主動式的設備指紋比較常見,例如很多toB的公式,在toC的公司獲取數據就是通過SDK的方式或者可以說很多公司有一些事情需要外部的第三方公司的服務,那么這些公司上報自己的數據就是通過第三方的SDK代碼的方式上報。
目前比較基礎的反欺詐手段做法就是通過經驗定義一些規則,制定規則通常會漏掉一些用戶、導致一些誤判也可能會導致用戶流失。
二、圖的基本概念
1、節點和邊
? ? ? ?社交網絡,就是表現人與人之間關系的網絡。社交網絡分析算法,就是為了研究節點(可以理解為人)和節點關系(邊,可以理解為人和人之間的關系)的算法。通過對關系的研究,可以對節點關系做梳理,從而聚成團。
2、有向圖和無向圖
? ? ? ?無向圖僅表示節點和節點之間是否有關系,例如:在P2P行業反欺詐建模中,通過申請者通訊錄獲取其社會關系,例如:如果王五和張三的通訊錄都有問題用戶李四,那么王五和張三問題的風險比較高。
? ? ? ?有向圖會攜帶方向信息,最簡單的例子就是傳銷圖。傳銷有比較成熟的上下線制度,是發展團隊十分迅速有效的手法,也被互聯網公司比較多的用戶發展用戶-好友邀請制度。如果產生危害的話,對互聯網公司,產生的后果就是大規模虛假注冊。
3、節點和度數
? ? ? ?度就是從這個節點發散出去了多少條邊,或者可以理解為你又多少個朋友。
? ? 缺點:沒有考慮鄰接節點的重要性
4、社區(Community):非重疊社區、重疊社區
? ? ? ?社區可以理解成無監督學習中的群組,也就是同一社區中節點和節點關系緊密,而社區和社區之間關系稀疏。
? ? ? ?如果任意兩個社區的節點集合的交集為空則被稱為非重疊社區,否則稱為重疊社區。
5、派系(Clique),完全子圖
? ? ? 派系是指任意兩個點都相連的節點的集合,又稱為完全子圖。
6、度中心性
? ? ? 每個節點都標注上其度的值大小,如下所示:
接下來做標準化處理,用度除以最大連接可能(N-1),則得到:
? ? ? ?可以說明的是中心性越高,表示與你有聯系的人越多,或者說你的社交任務影響力越大,這是一個社交網站分析用戶行為時一個常用的指標。
7、集中度(Centrality)
? ? ? ? 集中度表示一個群體的緊密程度或者可以理解成密度。集中度又可以分為度集中度、緊密集中度和介數集中度,還有圖集中度、特征向量集中度。
? ?度集中度(Degree centrality)
? ? ? ? ? ? 度集中度的方式有很多,例如:基尼系數、標準差以及Freeman集中度公式。以Freeman集中度公式為例:
其中,V*表示度最大的節點,根據上述公式計算如下兩圖的度集中度:
? ? ?緊密集中度(Closeness centrality)
? ? ? ? ? ? ? 直觀理解依賴于從一個節點出發到其它所有節點的最短路徑長度,并定義為總長度的倒數。節點i的緊密中心如下所示:
而通常我們講緊密中心度,是指其標準化形式,也即總距離長除以(N-1)
??
介數集中度(betweenness centrality)
直觀理解,介數就是多少個節點對必須經過本節點實現最小跳數互達到。定義如下:
其中,gjk表示節點jk最短路徑的個數,gjk(i)表示i位于最短路徑的個數。將其標準化,除以除本節點外其它節點對個數,得到:
以下面兩個圖作為示例來計算介數集中度:
?A在 (B,C),(B,D),(B,E),(B,F),(C,D),(C,E),(C,F),(D,E),(D,F),(E,F)十個節點對的最短路徑上,非標準化值為10
BCDEF不在任何節點對的最短路徑上,所以非標準化值為0
? ? ? ?對于節點A和E,都不在任何節點對的最短路徑上,所以為0;對于節點B,在(A,C),(A,D),(A,E)三個節點對最短路徑上,非標準化值為3。類似節點D和B情況也為3;對于節點C,在(A,D),(A,E),(B,D),(B,E)四個節點對最短路徑上,非標準化值為4.
特征向量集中度(Eigenvector)
? ? ? 主要思想:影響作用比較大的人不僅僅朋友多,而且他的朋友也是重要的
? ? 上述的方法在無向圖上表現較好,但是在有向圖上,可能存在某些節點eigenvector centrality變為0
為此,一個大佬Katz提出一個改進的辦法,即每個節點初始就有一個centrality值,如下所示:
8、Pagerank
PageRank算法是針對上述算法”每條出邊都會帶上起始完整的中心值,不太合理“基礎上,進行改進,假設一個節點的出度是n,每條出邊附上1/n的起始節點的中心度量值。如下所示:
?
9、傳遞性 Transitivity
10、結構平衡理論
11、網絡相似性
12、結構等價性
13、歸一化
14、Regular Equivalence
?
三、社區發現算法
?
? ? ? 社區發現算法的思路就是在復雜網絡中發現連接緊密的節點簇(社區結構),與聚類的思路如出一轍。發現這些社區結構的方式有很多,常見的算法有GN算法、Louvain算法、LPA算法和SLPA算法。
1、GN(Girvan-Newman)算法
? ? ? ? GN算法是一個最經典的社區發現算法,屬于分裂的層次聚類算法(自上而下)。GN算法的基本思想是不斷刪除網絡中具有相對于所有源節點的最大邊介數的邊,然后,再重新計算網絡中剩余的邊的相對于所有源節點的邊介數。重復這個過程,直到網絡中所有的邊都被刪除。簡單理解通過介數的定義我們知道,介數是多少個節點對必須經過本節點實現最小跳數互達的值,而介數高的邊必然要比介數低的邊更可能是社區之間的邊(兩個社區中的節點之間的最短路徑都要經過那些社區之間的邊,所以他們的介數會很高)。方便理解,可以參看下圖,方塊節點和圓形節點的最短路徑,必然經過邊AB,因此邊AB的介數最大,拆除這條邊,就可以將其拆分成兩個團體或者稱之為兩個社區。
然而,雖然GN算法的準確率很高,但是計算量大,時間復雜度也很高。
2、Louvain算法
? ? ? ?Louvain可以理解為GN的逆過程,GN的思路是不斷拆邊,類似于自上而下的層次聚類。而Louvain則是不斷凝聚,類似于自下而上的層次聚類。理解Louvain算法的過程,需要了解一個社區評價指標-模塊度。
? ? ? ?模塊度(Modularity)用來衡量一個社區的劃分是不是相對比較好的結果。一個相對好的結果在社區內部的節點相似度較高,而在社區外部節點的相似度較低。
? ? ? 設Avw為網絡的鄰接矩陣的一個元素,定義為:
? ? ?假設cv和cw分別表示點v和點w所在的兩個社區,社區內部的邊數和網絡中總邊數的比例:
函數sigmod(cv,cw)的取值定義為:如果v和w在一個社區,即cv=cw,則為1,否則為0,m為網絡中邊的總數。
? ? ? ?模塊度的大小定義為社區內部的總邊數和網絡中總邊數的比例減去一個期望值,該期望值是將網絡設定為隨機網絡時同樣的社區分配所形成的社區內部的總邊數和網絡中總邊數的比例的大小,于是模塊度Q為:
其中kv表示點v的度。
在進行每次劃分的時候計算Q值,Q取值最大的時候則是此網絡較理想的劃分。Q值的范圍在0-1之間,Q值越大網絡劃分的社區結構準確度越高,在實際的網絡中,Q值的最高點一般出現在0.3-0.7之間。
? ? ? ?Louvain算法,首先是把每一個節點當做獨立的社區,假如我們把v1和v2加入i都會使其模塊度增加,比較兩者的數值,選擇增量比較大的一個加入到i社區中。如此這般反復迭代,直到模塊度Q的值不再增加為止。
3、LPA(Label Propagation Algorithm)
? ? ?LPA算法的穩定性不是很好,但是可擴展性強,時間復雜度接近線性,且可以控制迭代次數來劃分節點類別,不需要預先給定社區數量,適合處理大規模復雜網絡。LPA的計算步驟如下所示:
1). 為所有節點指定一個唯一標簽
2). 刷新標簽:對于某一個節點,考察其所有鄰居節點的標簽,并進行統計,將出現個數最多的那個標簽賦給當前節點(如果最多的標簽不唯一,隨機選擇一個)
3). 重復步驟二,直到收斂為止。
4、SLPA(Speaker-listener Label Propagation Algorithm)
? ? ? SLPA是一種改進的LPA,是一種重疊社區發現算法,其中涉及一個重要的閾值參數r。通過對r的適當選取,可將其退化為非重疊型。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ?SLPA中引入了listerner和speaker兩個比較形象的概念。可以理解為:在刷新節點的過程中,我們將要被刷新的節點定義為listener,其臨近節點就是它的speaker,speaker通常不止一個,在眾多speaker時,listener應該聽那個speaker時,需要制定一個規則。
? ? ? 在LPA中,我們以出現次數最多的標簽來做決斷,這是一種規則,通常在SLPA框架里,規則的選取方式多由用戶指定(通常結合業務邏輯和場景決定)。
? ? ? 與LPA相比,SLPA最大的特點在于他不是僅僅的刷新替代原標簽,而是記錄每一個節點在刷新迭代過程中的歷史標簽序列(例如迭代T時,則每一個節點將保留一個長度為T的序列)。當迭代停止時,對每一個節點歷史標簽序列中各標簽出現的頻率做統計,按照某一個給定的閾值過濾掉那些出現概率小的標簽,剩下的標簽為該節點的標簽。
? ? ?不同社區發現算法以及復雜度如下所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
四、社區網絡算法一些應用
特征抽取:不一致性檢驗、靜態分析、動態分析、關聯特征提取
? ? ? ?不一致性檢驗:? 在團簇中,如果用戶的信息與我們的正常理解有嚴重偏差,那么這種團簇很可疑;如兩個用戶擁有同個家庭wifi,但所填家庭地址相差甚遠,顯然與現實不符。這里需要大量的人工干預,因為我們不能通過欺詐標簽做相關的統計分析,更多的要靠經驗判斷。當然如果標簽得當,我們其實可以通過做相似性度量來進行篩選重要的關聯特征,作為規則。
? ? ? ?關聯特征提取: 對網絡特征的直接提取,提取出中心度或一度二度關聯特征可供上層規則系統或風險評估模型使用。基本思想仍然是在網絡中社交越廣泛,越有可能是一個壞人。
? ? ? ?靜態分析:給定時間節點,去嘗試發現圖形結構的異常子圖。
? ? ? ?動態分析:分析結構圖網絡隨著時間變化的趨勢。
? ? ? ?失聯模型:挖掘更多的潛在的可觸達聯系人。? ?
網絡信息挖掘 : 社區發現
? ? ? ?反欺詐對于實時決策的需求很高,這些指標都需要實時提取。其中一些指標,比如二度關聯度, 在一般的情況下計算復雜度是很高的。在動態圖的情形下,一般會采取一些近似的算法并進行預計算。
負樣本生成:染色
? ? ? ?染色本質就是一種基于關聯圖譜的半監督學習方法,我們知道在反欺詐的場景下,一個典型的困境就是欺詐標注非常少,獲得的代價非常高,而我們要做一些監督式的機器學習,卻又非常依賴于標注。因此如果能用少量的欺詐標注樣本產生出更多的標注,就能最大程度利用欺詐樣本。這就是染色的初衷,欺詐標注會沿著網絡里的邊從一個節點傳播到另一個節點。
? ? ? ?染色從直覺上比較容易理解,我們經常說近朱者赤,近墨者黑。一個用戶和壞用戶有關聯,其實很有可能他本身就是有問題的。這里放一個數據,根據分析得到,一個客戶一旦出現在某個壞客戶的通訊錄中,就有70%的概率會變壞。
五、相關部分代碼
import networkx as nx import pandas as pd import matplotlib.pyplot as pltedge_list=pd.read_csv('./data/stack_network_links.csv')edge_list.head()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
G=nx.from_pandas_edgelist(edge_list,edge_attr='value' )plt.figure(figsize=(30,15))nx.draw(G,with_labels=True,edge_color='blue',node_color='grey',node_size=10,pos=nx.spring_layout(G,k=0.1,iterations=40))標簽傳播的兩種實現方法:sklearn和networkx
/********基于sklearn的標簽算法********/import numpy as np import matplotlib.pyplot as plt from sklearn.semi_supervised import label_propagation from sklearn.datasets import make_circlesn_samples = 200 X, y = make_circles(n_samples=n_samples, shuffle=False)# 定義標簽第一個位置為0,最后一個位置為1,其它位置為無標簽-1 outer, inner = 0, 1 labels = np.full(n_samples, -1.) labels[0] = outer labels[-1] = inner# 調用標簽傳播算法,構建模型 label_spread = label_propagation.LabelSpreading(kernel='rbf', alpha=0.8) label_spread.fit(X, labels)# 標簽傳播,可視化表示 output_labels = label_spread.transduction_ plt.figure(figsize=(8.5, 4)) plt.subplot(1, 2, 1) plt.scatter(X[labels == outer, 0], X[labels == outer, 1], color='navy',marker='s', lw=0, label="outer labeled", s=10) plt.scatter(X[labels == inner, 0], X[labels == inner, 1], color='c',marker='s', lw=0, label='inner labeled', s=10) plt.scatter(X[labels == -1, 0], X[labels == -1, 1], color='darkorange',marker='.', label='unlabeled') plt.legend(scatterpoints=1, shadow=False, loc='upper right') plt.title("Raw data (2 classes=outer and inner)")? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
# 標簽完的可視化表示plt.subplot(1, 2, 2) output_label_array = np.asarray(output_labels) outer_numbers = np.where(output_label_array == outer)[0] inner_numbers = np.where(output_label_array == inner)[0]plt.scatter(X[outer_numbers, 0], X[outer_numbers, 1], color='navy',marker='s', lw=0, s=10, label="outer learned") plt.scatter(X[inner_numbers, 0], X[inner_numbers, 1], color='c',marker='s', lw=0, s=10, label="inner learned") plt.legend(scatterpoints=1, shadow=False, loc='upper right') plt.title("Labels learned with Label Spreading (KNN)") plt.subplots_adjust(left=0.07, bottom=0.07, right=0.93, top=0.92) plt.show()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
/********基于圖譜的標簽傳播算法********/# 生成一個5個節點的連續連通圖G = nx.path_graph(5) G.node[0]['label'] = 'A' G.node[3]['label'] = 'B' G.nodes(data=True)plt.figure(figsize=(20,10))nx.draw(G,with_labels=True,edge_color='blue',node_color='grey',node_size=10,pos=nx.spring_layout(G,k=0.1,iterations=40))? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
import networkx as nx from networkx.algorithms import node_classificationpredicted = node_classification.local_and_global_consistency(G) predicted['A', 'B', 'B', 'B', 'B'] # 關鍵特征提取# 度print(nx.degree(G))DegreeView({'azure': 5, '.net': 8, 'sql-server': 9, 'asp.net': 13, 'entity-framework': 8, 'wpf': 6, 'linq': 7, 'wcf': 8, 'c#': 14, 'tdd': 1, 'agile': 1, 'codeigniter': 6, 'ajax': 7, 'jquery': 16, 'mysql': 11, 'css': 14, 'php': 10, 'javascript': 12, 'json': 4, 'cloud': 1, 'amazon-web-services': 4, 'devops': 3, 'docker': 4, 'ios': 6, 'android': 3, 'android-studio': 1, 'java': 8, 'typescript': 2, 'angular': 1, 'angular2': 2, 'angularjs': 13, 'ionic-framework': 1, 'reactjs': 8, 'mongodb': 8, 'sass': 9, 'twitter-bootstrap': 6, 'express': 5, 'node.js': 7, 'asp.net-web-api': 7, 'html5': 10, 'nginx': 3, 'apache': 3, 'linux': 10, 'scala': 3, 'apache-spark': 2, 'hadoop': 2, 'rest': 5, 'api': 1, 'sql': 5, 'mvc': 1, 'vb.net': 3, 'bash': 3, 'shell': 2, 'git': 4, 'bootstrap': 2, 'c++': 4, 'c': 4, 'python': 7, 'embedded': 1, 'xamarin': 1, 'unity3d': 1, 'visual-studio': 1, 'qt': 1, 'laravel': 4, 'wordpress': 6, 'photoshop': 1, 'html': 6, 'less': 3, 'jenkins': 4, 'django': 3, 'flask': 2, 'postgresql': 6, 'go': 1, 'drupal': 1, 'maven': 5, 'eclipse': 1, 'redis': 4, 'elasticsearch': 2, 'vba': 2, 'excel': 2, 'excel-vba': 2, 'redux': 4, 'github': 1, 'haskell': 1, 'jsp': 4, 'hibernate': 9, 'spring-boot': 3, 'web-services': 3, 'spring-mvc': 7, 'java-ee': 4, 'spring': 9, 'twitter-bootstrap-3': 2, 'swift': 4, 'osx': 4, 'objective-c': 5, 'iphone': 4, 'xcode': 4, 'xml': 1, 'vue.js': 1, 'unix': 1, 'ubuntu': 1, 'windows': 3, 'machine-learning': 2, 'r': 3, 'matlab': 1, 'react-native': 3, 'oracle': 2, 'plsql': 2, 'regex': 1, 'perl': 1, 'ruby-on-rails': 2, 'ruby': 2, 'powershell': 1, 'testing': 1, 'selenium': 1})# 度中心性 m/(n-1)print(nx.degree_centrality(G)){'azure': 0.043859649122807015,'.net': 0.07017543859649122,'sql-server': 0.07894736842105263,'asp.net': 0.11403508771929824,'entity-framework': 0.07017543859649122,'wpf': 0.05263157894736842,'linq': 0.06140350877192982,'wcf': 0.07017543859649122,'c#': 0.12280701754385964,'tdd': 0.008771929824561403,'agile': 0.008771929824561403,'codeigniter': 0.05263157894736842,'ajax': 0.06140350877192982,'jquery': 0.14035087719298245,'mysql': 0.09649122807017543,'css': 0.12280701754385964,'php': 0.08771929824561403,'javascript': 0.10526315789473684,'json': 0.03508771929824561,'cloud': 0.008771929824561403,'amazon-web-services': 0.03508771929824561,'devops': 0.02631578947368421,'docker': 0.03508771929824561,'ios': 0.05263157894736842,'android': 0.02631578947368421,'android-studio': 0.008771929824561403,'java': 0.07017543859649122,'typescript': 0.017543859649122806,'angular': 0.008771929824561403,'angular2': 0.017543859649122806,................print(nx.betweenness_centrality(G)){'azure': 0.054000196569856024,'.net': 0.002291495700904178,'sql-server': 0.0035624458060689187,'asp.net': 0.17406690608353656,'entity-framework': 0.0010466285487518948,'wpf': 0.0,'linq': 2.5875899187496765e-05,'wcf': 0.0010466285487518948,'c#': 0.05575657988189837,'tdd': 0.0,'agile': 0.0,'codeigniter': 0.007164044704799249,'ajax': 0.018884826898334116,'jquery': 0.25553997534572337,'mysql': 0.19769314773273786,'css': 0.04133537048548419,'php': 0.011546520113878122,'javascript': 0.023657465051749836,'json': 0.12319763505138448,'cloud': 0.0,'amazon-web-services': 0.05643737397347083,'devops': 0.015288500162743298,'docker': 0.03081403967524134,'ios': 0.03848717309360066,'android': 0.03133053873622108,'android-studio': 0.0,'java': 0.07601405167311086,'typescript': 0.01552553951249806,'angular': 0.0,'angular2': 0.030740568234746156,'angularjs': 0.12286762799187793,'ionic-framework': 0.0,'reactjs': 0.01540985613288964,'mongodb': 0.06737252741910404,'sass': 0.0062847124280314215,'twitter-bootstrap': 0.0,....................print(nx.closeness_centrality(G)){'azure': 0.2120437349297414,'.net': 0.20199200031681913,'sql-server': 0.2047653458589265,'asp.net': 0.24650814363733023,'entity-framework': 0.20336921850079745,'wpf': 0.1966647387700019,'linq': 0.1970979210139887,'wcf': 0.20336921850079745,'c#': 0.2120437349297414,'tdd': 0.008771929824561403,'agile': 0.008771929824561403,'codeigniter': 0.24448758508292587,'ajax': 0.2586198154345401,'jquery': 0.2895872367001647,'mysql': 0.2778958265228288,'css': 0.25787451337276907,'php': 0.2513552138773901,'javascript': 0.2571334946561807,'json': 0.2458309234625024,'cloud': 0.1654019522002789,'amazon-web-services': 0.20290806381031945,'devops': 0.1970979210139887,'docker': 0.19753301576236396,'ios': 0.17896491228070177,'android': 0.1737523420200988,'android-studio': 0.14549992868349734,'java': 0.20018446563836884,'typescript': 0.16509678254677285,'angular': 0.13938077280428485,.............print(nx.katz_centrality(G)){'azure': 0.086000597404453,'.net': 0.12752395048659432,'sql-server': 0.13490800430383726,'asp.net': 0.1838839825412127,'entity-framework': 0.1313654632872137,'wpf': 0.1074413543796159,'linq': 0.11970571584751195,'wcf': 0.1313654632872137,'c#': 0.16287279019149037,'tdd': 0.024188487461603535,'agile': 0.024188487461603535,'codeigniter': 0.13405042234441555,'ajax': 0.17009541155997618,'jquery': 0.30513597783897295,'mysql': 0.20736972742053683,'css': 0.2753226815308488,'php': 0.2187064376319827,'javascript': 0.2654431371952479,'json': 0.0772301825655986,'cloud': 0.025746815297941216,'amazon-web-services': 0.039771768002536595,'devops': 0.032987025719495855,'docker': 0.03528687353843744,'ios': 0.04480929107470212,'android': 0.03501405935072478,'android-studio': 0.025271044646416534,'java': 0.06236387099104653,'typescript': 0.029049352694621024,'angular': 0.024674573815228796,'angular2': 0.0481225808512019,'angularjs': 0.23448019736451475,..............# 連通子圖print(list(nx.connected_components(G))[0]){'.net','ajax','amazon-web-services','android','android-studio','angular','angular2','angularjs','apache','api','asp.net','asp.net-web-api','azure','bash','bootstrap','c','c#','c++','cloud','codeigniter','css','devops','django','docker','drupal','eclipse','elasticsearch','embedded','entity-framework','express','flask','git','github','go','hibernate','html','html5',......# 取出網絡的最大子圖Sub_G=G.subgraph(list(nx.connected_components(G))[0])#計算節點的聚類系數print(nx.clustering(Sub_G)){'azure': 0.5,'.net': 0.7857142857142857,'sql-server': 0.6388888888888888,'asp.net': 0.3974358974358974,'entity-framework': 0.8571428571428571,'wpf': 1.0,'linq': 0.9523809523809523,'wcf': 0.8571428571428571,'c#': 0.34065934065934067,'codeigniter': 0.6666666666666666,'ajax': 0.6666666666666666,'jquery': 0.3333333333333333,'mysql': 0.36363636363636365,'css': 0.3956043956043956,'php': 0.5777777777777777,'javascript': 0.5151515151515151,'json': 0.16666666666666666,'cloud': 0,'amazon-web-services': 0.16666666666666666,'devops': 0.6666666666666666,'docker': 0.3333333333333333,'ios': 0.4666666666666667,'android': 0,'android-studio': 0,'java': 0.35714285714285715,'typescript': 0,'angular': 0,'angular2': 0,'angularjs': 0.3076923076923077,'ionic-framework': 0,'reactjs': 0.5,'mongodb': 0.32142857142857145,'sass': 0.6111111111111112,'twitter-bootstrap': 1.0,'express': 0.8,'node.js': 0.5714285714285714,'asp.net-web-api': 0.5714285714285714,'html5': 0.5333333333333333,'nginx': 0.3333333333333333,'apache': 0.3333333333333333,'linux': 0.08888888888888889,...............#計算網絡的聚類系數print(nx.average_clustering(Sub_G))#計算網絡的平均路徑 #只能在連通子圖中求解print(nx.average_shortest_path_length(Sub_G))networkx官方文檔參考:https://networkx.github.io/documentation/stable/reference/algorithms/node_classification.html
總結
以上是生活随笔為你收集整理的社交网络分析与反欺诈的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 更改hive列名
- 下一篇: 无监督算法与异常检测