python實現計算頂點聚類系數頂點聚集系數clustering coefficient


計算每個結點的局部聚類系數

 

 對於節點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數據格式:

 


免責聲明!

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



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