python社会网络度与聚类系数的计算(network+原理法)
生活随笔
收集整理的這篇文章主要介紹了
python社会网络度与聚类系数的计算(network+原理法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、借助包完成網絡度與聚類系數的計算與可視化
python為我們提供了networkx包,可以幫助進行網絡關鍵指標的實現。networkx是Python的一個包,用于構建和操作復雜的圖結構,提供分析圖的算法。本實驗重點講解在networkx包基礎上與實驗1不同之處。這個不難,直接上代碼。
# -*- coding: utf-8 -*- import networkx as nx import matplotlib.pyplot as plt import numpy as np # 解決中文顯示問題 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 生成網絡 def readnetwork(network_filename):network = open(network_filename) # 讀取txt文件network = network.readlines() # 將txt文件寫入列表G = nx.Graph() # 創建網絡圖# 處理邊for edge in network:edge = edge.strip('\n').split('\t')G.add_edge(edge[0], edge[1])nx.draw(G,node_size = 10,with_labels=True) # 可視化plt.show()print("網絡的全部節點依次為:", G.nodes())print("網絡的全部邊依次為:", G.edges())print("網絡邊的數量:", G.number_of_edges())return G # 根據一個列表求每個值的個數及所占比例,繪制折線圖 def percent(list, x_label, y_label, title):list.sort(reverse=False)list_new = []sum = 0# 處理成(列表元素,出現次數)格式,計算出出現次數sumfor i in list:if (i, list.count(i)) in list_new:continueelse:list_new.append((i, list.count(i)))sum = sum + list.count(i)print("列表元素及對應出現次數為", list_new)print("列表元素出現次數的總和為", sum)element_list = []element_percent = []for i in list_new:element_list.append(i[0])element_percent.append(i[1] / sum)plt.xlabel(x_label)plt.ylabel(y_label)plt.plot(element_list, element_percent, linewidth=1)plt.title(title)plt.show()print('-------------------------------------------------')print('本程序運行結果為借助networkx包完成的節點度和節點聚類系數的計算')# 讀取網絡 G = readnetwork('us 500.txt') # 計算網絡的節點度數 degree = nx.degree(G) print("網絡的節點度數", degree) print('排序后為',sorted(degree,reverse=False)) print('-------------------------------------------------') # 計算節點度數出現次數及分布概率 degree_num = [] for degree_edge in degree:degree_num.append(degree_edge[1]) percent(degree_num, '度數', '度數概率', '度分布概率') # 計算網絡節點聚類系數 cluster = nx.clustering(G) print("網絡節點聚類系數為:", cluster) print('-------------------------------------------------') # 計算節點聚類系數分布概率 clustering_coefficient = list(cluster.values()) percent(clustering_coefficient, '聚類系數', '聚類系數概率', '聚類系數分布概率') # 計算網絡聚類系數均值 print("網絡聚類系數的均值為", np.mean(list(cluster.values())))二、借助原理法完成網絡度和聚類系數的計算與可視化
import matplotlib.pyplot as plt import numpy as np # 解決中文顯示問題 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False def percent(list, x_label, y_label, title):list.sort(reverse=False)list_new = []sum = 0# 處理成(列表元素,出現次數)格式,計算出出現次數sumfor i in list:if (i, list.count(i)) in list_new:continueelse:list_new.append((i, list.count(i)))sum = sum + list.count(i)print("列表元素及對應出現次數為", list_new)print("列表元素出現次數的總和為", sum)element_list = []element_percent = []for i in list_new:element_list.append(i[0])element_percent.append(i[1] / sum)plt.xlabel(x_label)plt.ylabel(y_label)plt.plot(element_list, element_percent, linewidth=1)plt.title(title)plt.show()print('-------------------------------------------------') print('本程序運行結果為按照原理完成的節點度和節點聚類系數的計算') network = open('us 500.txt') # 讀取txt文件 network = network.readlines() # 將txt文件寫入列表 edge_left_list = [] edge_right_list = [] edge_list = [] # 獲取網絡的點、邊 for edge in network:# 去掉字符串的換行符,以空格作為字符串分割依據,得到起始終止點edge = edge.strip('\n').split('\t')edge_left_list.append(edge[0])edge_right_list.append(edge[1])edge_list.append(edge) # 去掉重復的點 node_list = list(set(edge_right_list + edge_left_list))degree = [] for i in node_list:k = 0for j in edge_list:if j[0] == i or j[1] == i:k = k + 1degree.append((i, k)) degree = sorted(list(set(degree)), reverse=False) print('經過排序的節點度數為', degree)# 計算節點度數出現次數及分布概率 degree_num = [] for degree_edge in degree:degree_num.append(degree_edge[1]) percent(degree_num, '度數', '度數概率', '度分布概率') # 計算聚類系數 cluster_dict = {} for node in node_list:node_neighbour_list = []# 獲得所有鄰居點for edge in edge_list:if edge[0] == node:node_neighbour_list.append(edge[1])if edge[1] == node:node_neighbour_list.append(edge[0])n = len(node_neighbour_list)sum_edge = (n * (n - 1)) / 2real_edge = 0for edge in edge_list:if edge[0] in node_neighbour_list and edge[1] in node_neighbour_list:real_edge = real_edge + 1try:cluster_dict.update({node: real_edge / sum_edge})except:cluster_dict.update({node: 0}) print('節點的聚類系數依次為', cluster_dict) # 計算節點聚類系數分布概率 clustering_coefficient = list(cluster_dict.values()) percent(clustering_coefficient, '聚類系數', '聚類系數概率', '聚類系數分布概率') # 計算網絡聚類系數均值 print("網絡聚類系數的均值為", np.mean(list(cluster_dict.values())))總結
以上是生活随笔為你收集整理的python社会网络度与聚类系数的计算(network+原理法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 今日份课堂笔记:GridView的使用和
- 下一篇: 如何用Python优雅的登录校园网?