基于知识图谱分析贸易关系走向

news2025/4/19 9:45:49

基于知识图谱分析贸易关系走向

  • 前言
  • 一、基础数据
  • 二、贸易规则
  • 三、知识图谱可视化
  • 四、完整代码

前言

  • 知识图谱是一种用图模型来描述知识和建模世界万物之间的关联关系的技术方法。在贸易关系的分析中,知识图谱可以将各个国家、地区、商品、贸易政策等作为节点,而它们之间的贸易关系、依赖程度、政策影响等作为边,从而形成一个复杂的网络结构。本文主要分析企业之间的贸易关系来往。
  • 基于收集和处理后的数据,构建知识图谱。每个企业用一个节点表示,而企业之间的关系用边表示。利用可视化技术,将知识图谱以图形化的方式展示出来,便于直观地观察和分析贸易关系的走向。
  • 通过分析企业之间的贸易依存度,可以了解它们之间的贸易紧密程度,从而预测贸易关系的走向。通过基于知识图谱的贸易关系分析,我们可以更深入地了解各个企业之间的贸易关系,预测其未来的走向,为政策制定和商业决策提供有力的支持。此外,通过可视化展示,我们还可以更直观地观察和分析贸易关系的动态变化,提高分析的效率和准确性。

一、基础数据

本博文利用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)

初始图
在这里插入图片描述

演进图
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1719085.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【文件fd】回顾C语言文件操作 | 详细解析C语言文件操作写w追加a | 重定向和“w““a“

目录 前言 回顾C语言的操作 Q1 Q2 Q3 C语言文件操作 w方式 a方式 重定向和"w""a"方式 前言 前面进程虚拟地址空间让我们对进程的理解更加深入。在基础IO我们会详细介绍文件和文件系统。本专题的核心内容是文件。 深刻理解文件(站在…

力扣Hot100-有效的括号(栈stack)

给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括…

⌈ 传知代码 ⌋ 基于BERT的语义分析实现

💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

江苏大信环境科技有限公司:环保领域的开拓者与引领者

2009 年,江苏大信环境科技有限公司在宜兴环保科技工业园成立。自创立之始,该公司便笃定坚守“诚信为本、以质量求生存、以创新谋发展”这一经营理念,全力以赴为客户构建专业的工业有机废气治理整体解决方案,进而成为国家高新技术企…

Java基础语法规范

语法规范 public class HelloWorld{ //类名: 1. 首字母要大写 2. 源文件名与类名相同// 单行注释/* 多行注释除这两个之外还有文档注释。不重要* /public static void main (String[] args){ /* 1. main()⽅法是类体中的主⽅法,该⽅法从{开始到}结束…

基于 Apache Doris 的实时/离线一体化架构,赋能中国联通 5G 全连接工厂解决方案

作者:田向阳,联通西部创新研究院 大数据专家 共创:SelectDB 技术团队 导读: 数据是 5G 全连接工厂的核心要素,为支持全方位的数据收集、存储、分析等工作的高效进行,联通 5G 全连接工厂从典型的 Lambda 架…

华为SSH实验

华为SSH实验 实验拓扑: 实验要求:从SSH客户端AR1采用stelnet方式登录到SSH 服务器端。 实验步骤: 1.完成基本配置(略) sys Enter system view, return user view with CtrlZ. [AR1]sys CLIENT [CLIENT]INT g0/0/0 [C…

【IB Protocal Serial--WQE】

IB Protocal Serial--WQE 1 Intro1.1 What1.2 IBA WQE 本系列文章介绍RDMA技术的具体实现–InfiniBand Protocal; Introduce the features, capalities,components, and elements of IBA. the principles of operation. 1 Intro 1.1 What 理解IB协议下面这三句话对…

思迈特受邀参加工信部等权威机构行业盛会,探讨AI领域前沿技术

近日,思迈特软件作为国产BI领域知名厂商,多次受邀出席行业盛会,与众多业内专家学者、行业精英及知名企业代表等汇聚一堂共襄盛会,探讨行业前沿热点研究及最新趋势,分享企业数字化建设创新成果与成功实践,共…

一文学懂Base64编码原理

前言 Base64编码与ASCII编码一样,也是一种编码方式。不同的是ASCII码采用7位二进制数表示(包括大小写字母、数字、标点符号和一些不可见字符),而Base64采用6位二进制数表示(包括大小写字母、0~9数字、和/)…

【考试100】安全员B证《建设工程安全生产技术》单选题

​ 题库来源:考试100 【考试100】安全员B证《建设工程安全生产技术》单选题 1.在悬空部位作业时,操作人员应( ) A.遵守操作规定 B.进行安全技术交底 C.戴好安全帽 D.系好安全带 【考试100答案】:D…

Nginx企业级负载均衡:技术详解系列(14)—— 账户认证功能

你好,我是赵兴晨,97年文科程序员。 你有没有听说过Nginx的账户认证功能?这可不只是一个技术问题,它关系到我们上网时的安全和便利。就像家里需要一把钥匙才能进们一样,Nginx的账户认证功能就是确保有只有授权的人才能…

C# 写一个简单的Windows Service的服务程序

项目创建及设定部分 使用VS2019创建项目,选择C# Service的选项 按照你喜欢的方式命名,我这边就默认了 添加安装服务,在Service1.cs[Design]中 在设计界面右击,选择如下的"Add Installer" 在出现的"ProjectInstall…

python爬取每日天气情况

python爬取每日天气情况 一、项目简介二、完整代码一、项目简介 本次爬取的目标数据来源于天气网,数据所在的页面如下图所示,本次任务较为简单,按照正常操作流程操作即可,即抓包分析数据接口,发送请求获取数据,解析数据并持久化存储。发送请求使用requests库,解析数据使…

jenkins 用户权限(Manage-Roles)

本次需求将DEV环境和SIT环境分开,SIT用户登录上来只能看他的SIT项目和视图 安装roles插件 进入 manage role 项目授权 用户 正则匹配你需要的项目 dev .*-dev*或者.*-dev$ sit .*-sit最后细分assign role 测试使用sit账号登录 ,视图和项目都是SIT账号的

PG 窗口函数

一,简介 窗口函数也叫分析函数,也叫OLAP函数,通过partition by分组,这里的窗口表示范围,,可以不指定PARATITION BY,会将这个表当成一个大窗口。 二,应用场景 (1)用于分…

LeeCode热题100(1)

本文纯干货,看不懂来打我! 自己先去看一下第一题的题目两数之和:. - 力扣(LeetCode) 简单来说就是让你在一个数组里面找两个数,这两个数的和必须满足等于目标值target才行。 我认为你要是没有思路的话&a…

【R语言基础】如何更新R版本

文章目录 概要流程细节具体步骤 概要 提示:由于软件包的更新,所以需要更新R至新版本 流程细节 查看当前R版本 R.version下载更新包:installr install.packages("installr")library(installr)跟着向导一步步执行安装 具体步骤 …

输入3个字符串,要求将字母按由小到大顺序输出

对于将3个整数按由小到大顺序输出,是很容易处理的。可以按照同样的算法来处理将3个字符串按大小顺序输出。可以直接写出程序。 编写程序: 运行结果: 这个程序是很好理解的。在程序中对字符串变量用关系运算符进行比较,如同对数值…

树形结构-CRUD接口

先看一下效果:整体的效果 新增效果 --默认值是 default 修改效果 - 大致效果如上 --------------------------------------------------------------------------------------------------------------------------------- 下面讲解代码如何实现的 根据你使用…