計算每個結點的局部聚類系數
對於節點vi,找出其直接鄰居結點集合Ni,計算Ni構成的圖中的邊數K,除以Ni集合可能的邊數|Ni|*(|Ni|-1)/2(無向圖)或|Ni|*(|Ni|-1)(有向圖)
代碼下載地址:https://github.com/caotingting123/Clustering_Coefficient
代碼:
# encoding=utf-8 #求圖結點的聚類系數以及平均聚類系數 ce_list = [] node_set = set() edge_set = set() node_list = [] edge_list2 = [] #求每個結點的平均聚類系數 def getCE(node,edgeList): #找當前node的直接鄰接點,存入node_set的集合中 for edge in edgeList: if edge[0] == node: node_set.add(edge[1]) elif edge[1] == node: node_set.add(edge[0]) #找鄰接點集合中的點所構成的邊的數目 for edge in edgeList: if edge[0] in node_set and edge[1] in node_set: s = edge[0]+edge[1] edge_set.add(s) neighbourNodeNum = len(node_set) #鄰接點結點個數 neighbouredgeNum = len(edge_set) #鄰接點構成的邊的條數 print("neighbour node Num:", neighbourNodeNum) print("neighbour edge Num:", neighbouredgeNum) ceNum = 0 #求聚類系數的公式 if neighbourNodeNum > 1: ceNum = 2*neighbouredgeNum/((neighbourNodeNum-1)*neighbourNodeNum) #無向圖要乘2,有向圖不需要乘2 ce_list.append(ceNum) node_set.clear() edge_set.clear() def getAverageCE(ce_list): total = 0 for ce in ce_list: total += ce return total/len(ce_list) def main(): #從文件中讀取邊信息 with open('facebook_combined.txt',encoding='utf-8') as f1: edge_list = f1.readlines() #格式化邊信息,去掉其末尾的\n for i in range(len(edge_list)): spiltList = edge_list[i].replace('\n',"").split(" ", 1) edge_list2.append(spiltList) #讀取結點信息,應該從文件中讀取,但鑒於結點名稱為0-4038,簡便起見直接遍歷 for i in range(4039): node_list.append(str(i)) #對每個結點計算聚類系數 for node in node_list: print(node) getCE(node, edge_list2) #輸出每個結點的聚類系數 print(ce_list) #輸出平均聚類系數 print(getAverageCE(ce_list)) if __name__ == "__main__": main()
facebook_combined.txt數據格式: