核心-外围结构(Core-Periphery Structure)是用于分析复杂网络的一种重要方法,它将网络中的节点划分为 核心(Core) 和 外围(Periphery),甚至进一步细分为 半核心(Semi-Core) 和 半外围(Semi-Periphery)。以下是基于 Rombach et al. (2014) 提出的分层核心-外围模型(Hierarchical Core-Periphery Model, HCPM)的构造步骤。
结合 E-I Index 和 中心性分析 来探测核心-外围结构,并最终赋值类别(核心=4,半核心=3,半外围=2,外围=1)。
步骤
-
计算 E-I Index(外部-内部指数):用于衡量节点的外部连接程度。
-
计算中心性指标(如度中心性、介数中心性、PageRank等):用于衡量节点的重要性。
-
层次聚类或K-Means:根据 E-I Index 和中心性划分核心-外围类别。
-
赋值类别(核心=4,半核心=3,半外围=2,外围=1)。
import pandas as pd
import networkx as nx
import numpy as np
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
# 读取CSV文件
df = pd.read_csv("C:/Users/15203/Desktop/研究方向/论文相关/老年食谱带用户 zhuyong/food_recipes.csv", engine='python')
# 处理NaN值,去掉包含NaN的行
df = df.dropna(subset=['头实体', '关系', '尾实体'])
# 创建无向图
G = nx.Graph()
# 添加节点和边
for index, row in df.iterrows():
head = row['头实体']
relation = row['关系']
tail = row['尾实体']
G.add_node(head)
G.add_node(tail)
G.add_edge(head, tail, relation=relation)
# 计算 E-I Index(外部-内部指数)
def calculate_ei_index(G):
ei_index = {}
for node in G.nodes():
internal_edges = sum(1 for neighbor in G.neighbors(node) if neighbor in G.nodes())
external_edges = sum(1 for neighbor in G.neighbors(node) if neighbor not in G.nodes())
total_edges = internal_edges + external_edges
ei_index[node] = (external_edges - internal_edges) / total_edges if total_edges > 0 else 0
return ei_index
ei_index = calculate_ei_index(G)
# 计算中心性指标
degree_centrality = nx.degree_centrality(G) # 度中心性
betweenness_centrality = nx.betweenness_centrality(G) # 介数中心性
pagerank = nx.pagerank(G) # PageRank
# 组合特征
df_features = pd.DataFrame({
'node': list(G.nodes()),
'EI_Index': [ei_index[node] for node in G.nodes()],
'Degree_Centrality': [degree_centrality[node] for node in G.nodes()],
'Betweenness_Centrality': [betweenness_centrality[node] for node in G.nodes()],
'PageRank': [pagerank[node] for node in G.nodes()]
})
# 标准化数据
scaler = StandardScaler()
df_features_scaled = scaler.fit_transform(df_features[['EI_Index', 'Degree_Centrality', 'Betweenness_Centrality', 'PageRank']])
# 使用K-Means聚类(分为4类)
kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
df_features['Cluster'] = kmeans.fit_predict(df_features_scaled)
# 赋值类别(核心=4,半核心=3,半外围=2,外围=1)
cluster_mapping = {0: 4, 1: 3, 2: 2, 3: 1} # 可根据聚类结果调整
df_features['Core_Periphery'] = df_features['Cluster'].map(cluster_mapping)
# 显示部分结果
print(df_features[['node', 'EI_Index', 'Degree_Centrality', 'Betweenness_Centrality', 'PageRank', 'Core_Periphery']].head(20))
# 保存结果
df_features.to_csv("core_periphery_results.csv", index=False)
赋值规则
分类 | E-I 指数 | 度中心性 | 赋值 |
---|---|---|---|
核心 | 高 | 高 | 4 |
半核心 | 高 | 低 | 3 |
半外围 | 低 | 高 | 2 |
外围 | 低 | 低 | 1 |