前言
- 知识图谱是一种用图模型来描述知识和建模世界万物之间的关联关系的技术方法。在贸易关系的分析中,知识图谱可以将各个国家、地区、商品、贸易政策等作为节点,而它们之间的贸易关系、依赖程度、政策影响等作为边,从而形成一个复杂的网络结构。本文主要分析企业之间的贸易关系来往。
- 基于收集和处理后的数据,构建知识图谱。每个企业用一个节点表示,而企业之间的关系用边表示。利用可视化技术,将知识图谱以图形化的方式展示出来,便于直观地观察和分析贸易关系的走向。
- 通过分析企业之间的贸易依存度,可以了解它们之间的贸易紧密程度,从而预测贸易关系的走向。通过基于知识图谱的贸易关系分析,我们可以更深入地了解各个企业之间的贸易关系,预测其未来的走向,为政策制定和商业决策提供有力的支持。此外,通过可视化展示,我们还可以更直观地观察和分析贸易关系的动态变化,提高分析的效率和准确性。
一、基础数据
本博文利用random生成一些随机关系数据,生成关系数据中有两个参数,具体的含义解释如下。
参数 | 含义 |
---|---|
n n n | 最多有 n n n 个节点出发生成关系数据 |
n e i g h b o r neighbor neighbor | 每个节点的关系最多走向 n e i g h b o r neighbor neighbor个节点,在数学上成为出度 |
详细构造数据的函数代码如下:
import random
#构造一个有向图
def build_graph(n, neighbor):
#n最大起始节点个数
#neighbor最大出度
#存储图结构
node_name = [i for i in range(2*n)]
graph = dict()
#存储起始节点
start = set()
for i in range(n):
node = random.choice(node_name)
if node in start:
continue
else:
start.add(node)
graph[node] = list()
for j in range(neighbor):
target = random.choice(node_name)
if target != node and target not in graph[node]:
graph[node].append(target)
nodes = []
rela = 0
for i in graph.keys():
nodes.extend(graph[i])
rela += len(graph[i])
nodes.extend(list(graph.keys()))
nodes = list(set(nodes))
print("Build graph success: %d nodes, %d edges." % (len(nodes), rela))
return graph
二、贸易规则
序号 | 规则内容 |
---|---|
1 | 企业优先与大企业发生贸易 |
2 | 企业暂停与小企业发生贸易 |
3 | 大企业为与之发生贸易较多的企业 |
4 | 小企业为与之发生贸易较少的企业 |
- 企业优先与大企业发生贸易
演进过程中,企业选择与其非关联的企业发生关系时,选择那入度最大的企业。 - 企业暂停与小企业发生贸易
演进过程中,企业删除与邻居企业中入度最小的关系,如果邻居企业是知识图谱中入度最大的企业则不删除。 - 大企业为与之发生贸易较多的企业
大企业假设为入度比较大的企业。 - 小企业为与之发生贸易较少的企业
小企业假设为入度比较小的企业。
def iter(G):
#代表贸易收入
in_degree = pd.DataFrame(G.in_degree(), columns = ['node', 'in_degree'])
add_relas = []
delete_relas = []
for node in nodes:
#找到贸易收入最大的客群
max_degree = max(G.in_degree(), key=lambda x:x[1])[1]
max_nodes = in_degree.loc[in_degree['in_degree']==max_degree]['node']
neighbors = list(G.successors(node))
#增加贸易关系
add_nodes = list(set(max_nodes) - {node} -set(neighbors))[:]
add_rela = [(node, j) for j in add_nodes]
add_relas.extend(add_rela)
#减少邻居中贸易较低的客户
delete_rela = []
if len(neighbors)>1:
min_v = min([G.in_degree()[neighbor] for neighbor in neighbors])
for neighbor in neighbors:
if G.in_degree()[neighbor] == min_v and min_v != max_degree:
delete_rela.append((node, neighbor))
delete_relas.extend(delete_rela[:])
G.add_edges_from(add_relas)
G.remove_edges_from(delete_relas)
G = graph_plot(G.nodes(), G.edges())
三、知识图谱可视化
- 为了能够看清楚知识图谱演进过程,利用nx.draw_networkx中,固定位置pos作图。
- 因为graph_plot函数不仅是作图可视化,同时也要返回更新后的G,方便下一步迭代。
#利用字典构造一张图
import networkx as nx
import matplotlib.pyplot as plt
def graph_plot(nodes, relas):
num = int(len(nodes)**(0.5)) + 1
earth = []
for i in range(num):
for j in range(num):
earth.append((i,j))
G = nx.DiGraph()
# 添加对应的边和点
for node in nodes:
# 结点名称不能为str,desc为标签即结点名称
G.add_node(node, desc=str(node))
# 添加边,参数name为边权值
G.add_edges_from(relas)
pos = earth[:]
# 按pos所定位置画出节点,无标签无权值
nx.draw_networkx(G, pos, with_labels=None, node_color="tab:blue", edge_color="tab:green", node_size = 800)
# 画出标签
node_labels = nx.get_node_attributes(G, 'desc')
nx.draw_networkx_labels(G, pos, labels=node_labels)
plt.title('fixed graph', fontsize=10)
plt.show()
return G
四、完整代码
贸易关系最终流向大贸易企业,当然这与我们假设条件的设定有很大的关系。
from build_graph import build_graph
from graph_plot import graph_plot
import networkx as nx
import pandas as pd
graph = build_graph(12, 3)
nodes = []
relas = []
for i in graph.keys():
nodes.extend(graph[i])
nodes.extend(list(graph.keys()))
relas.extend([(i, j) for j in graph[i]])
nodes = list(set(nodes))
print("Get the data graph success: %d nodes, %d edges." % (len(nodes), len(relas)))
G = graph_plot(nodes, relas)
def iter(G):
tmp = G.copy()
#代表贸易收入
in_degree = pd.DataFrame(G.in_degree(), columns = ['node', 'in_degree'])
add_relas = []
delete_relas = []
for node in nodes:
#找到贸易收入最大的客群
max_degree = max(G.in_degree(), key=lambda x:x[1])[1]
max_nodes = in_degree.loc[in_degree['in_degree']==max_degree]['node']
neighbors = list(G.successors(node))
#增加贸易关系
add_nodes = list(set(max_nodes) - {node} -set(neighbors))[:]
add_rela = [(node, j) for j in add_nodes]
add_relas.extend(add_rela)
#减少邻居中贸易收入较低的客户
delete_rela = []
if len(neighbors)>1:
min_v = min([G.in_degree()[neighbor] for neighbor in neighbors])
for neighbor in neighbors:
if G.in_degree()[neighbor] == min_v and min_v != max_degree:
delete_rela.append((node, neighbor))
delete_relas.extend(delete_rela[:])
G.add_edges_from(add_relas)
G.remove_edges_from(delete_relas)
G = graph_plot(G.nodes(), G.edges())
v_index = 0
count = 0
for i in range(100):
print('=>'*20, i)
if max(G.in_degree(), key=lambda x:x[1])[1] > v_index:
v_index = max(G.in_degree(), key=lambda x:x[1])[1]
else:
count = count + 1
if count > 5:
break
iter(G)
初始图
演进图