实验要求:
import pandas as pd
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
# 设置随机种子以便结果可复现
np.random.seed(0)
# 为1000个情报源生成模拟数据
sources = [f"source_{i}" for i in range(1, 1001)]
num_relations = 10000
source_col = np.random.choice(sources, size=num_relations)
target_col = np.random.choice(sources, size=num_relations)
relations = pd.DataFrame({'source': source_col, 'target': target_col}).drop_duplicates()
relations = relations[relations['source'] != relations['target']]
# 从关系中创建有向图
G = nx.from_pandas_edgelist(relations, 'source', 'target', create_using=nx.DiGraph())
# 为每个边简化处理,设置权重为1
for edge in G.edges():
G[edge[0]][edge[1]]['weight'] = 1
# 使用HITS算法计算每个节点的hub值和authority值
hubs, authorities = nx.hits(G, max_iter=100, tol=1e-08, nstart=None, normalized=True)
# 将hub和authority数据转换为DataFrame
df_hubs = pd.DataFrame(list(hubs.items()), columns=['source', 'hub_value'])
df_authorities = pd.DataFrame(list(authorities.items()), columns=['source', 'authority_value'])
# 对authorities DataFrame进行排序,以识别最具权威性的情报源
top_authorities = df_authorities.sort_values(by='authority_value', ascending=False).head(20)
# 可视化
fig, ax = plt.subplots(figsize=(12, 8))
ax.barh(top_authorities['source'], top_authorities['authority_value'], color='skyblue')
ax.set_xlabel('Authority Value')
ax.set_ylabel('Source')
ax.set_title('权威值最高的20个威胁情报源')
plt.gca().invert_yaxis() # 最高值在顶部
plt.show()
这段代码展示了从生成模拟数据集开始,计算每个源的hub值和authority值,最后基于它们的authority值可视化前20个源的整个过程。它为评估和可视化给定数据集内威胁情报源的质量提供了一个全面的方法。请记住,对于实际应用,你需要调整数据生成部分以加载和预处理你的实际威胁情报数据。