基于循环神经网络的格兰杰因果网络重构

article/2025/6/29 12:30:08

复杂网络建模的反问题是网络重构,获得节点之间的关系对于分析网络特性有着至关重要的作用。常用的网络重构方法有:1 相关性分析,2 压缩感知,3 动力学方程,4 因果分析,5 深度学习,6 概率图模型,7 微分方程。本文主要分析因果关系,格兰杰因果(granger casuality)是因果分析的常用方法。具体定义为:对于两个时间序列(一般为向量自回归时间序列(VAR))X,Y如果加入Y能够使得预测X的误差减小,则说明Y对X有因果关系:GCy-x。具体定义如下:

 

实际操作简单来说就是,如果我想检测X是不是Y的格兰杰因果,首先确定时滞P,因为时是VAR模型,下一时刻Xt由前面Xt-1......Xt-p 影响(也可以理解为用过于的P阶滞后去预测(回归))下一时刻的值,P确定好后,首先让X和Y的P阶延迟都参与预测Xt,接着再把Y的P阶延迟拿掉再进行预测,如果前者预测的误差比后者预测的少,则说明Y有助于X的预测,即Y是X的因。

实战:数学模型(或者叫N个时间序列之间的关系):

本身的因果关系:

用格兰杰因果矩阵表示即:

 根据上面的模型,我们生成了大小为4096*5的时间序列数据,5条时间序列,每个时间序列包含4096个点的数值,我们需要用自己的方法将这些数据里的因果关系还原出来。

本文提出了基于循环神经网络,更具体的,是LSTM,LSTM是RNN的变种,有着比RNN好很多的记忆能力,十分适合用来做预测问题(回归),对于大小为4096*5的数据集,我们首先要进行预处理,得到想要的inputs和targets。P我取的是10,即用过去10个数据去预测第11个数据,所以我们要用一个10*5的窗口去遍历数据集,得到inputs:

 那么显然标签集是啥呢?第11个数据第12个数据对吧:

这样遍历完整个4096*5的数据集后我们得到了想要的inputs(shape:4085*10*5) ,targets(shape:4085*1*5)

程序如下:

def load_sequence_data():simulation_name = 'realization_' + 'linear' + '_' + '4096' + '.mat'simulation_dir = 'simulation_difflen'simulation_name = os.path.join(simulation_dir, simulation_name)simulation_data = sio.loadmat(simulation_name)#5,4096simulation_data = np.array(simulation_data["data"]).transpose()#4096,5num_channel = simulation_data.shape[1]#5scaler = preprocessing.StandardScaler().fit(simulation_data)simulation_data = scaler.transform(simulation_data)min_max_scaler = preprocessing.MinMaxScaler()# scale data to [0. 1]data = min_max_scaler.fit_transform(simulation_data)#data.shape(4096,5)x, y = batch_sequence(data, num_shift=1,sequence_length=20)return x, y
def batch_sequence(x, sequence_length=20, num_shift=1):#x.shape(4096,5)num_points = x.shape[0]#4096inputs = []targets = []# for p in np.arange(0, num_points, max(num_shift, sequence_length // 5)):for p in np.arange(0, num_points, num_shift):# prepare inputs (we're sweeping from left to right in steps sequence_length long)if p + sequence_length + num_shift >= num_points:breakinputs.append(x[p: p + sequence_length, :])targets.append(x[p + sequence_length, :])inputs = np.array(inputs)targets = np.array(targets)idx = np.random.permutation(np.arange(inputs.shape[0]))#4085inputs = inputs[idx]#4085,10,5targets = targets[idx]#4085,5
x,y=load_sequence_data()

这样返回的X和Y就是数据集和标签集啦

下面需要将数据集和标签集喂入神经网络进行训练,由于我们使用的是LSTM进行预测,而LSTM的输出是根据你输入的隐藏层的units决定的,因此需要在LSTM层后再加一层Dense(1),才能和Y的shape对上。损失函数由于是预测问题,其实也就是回归问题,因此选择了常用的均方误差(MSE),优化器选择的是RMSprop,也可以选择SGD或者adam,adagrad这类的。具体以tensorflow框架为基础的代码如下:

from __future__ import print_function, divisionimport numpy as npfrom keras.models import Sequential
from tensorflow.keras.optimizers import Adagrad
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.optimizers import RMSprop
from keras.layers import Dense, Dropout, Activation, Embedding
from keras.layers import LSTM, SimpleRNN, GRU
from keras.regularizers import l1, l2
from keras.callbacks import EarlyStopping
class CustomLSTM(object):def __init__(self, num_hidden=10, num_channel=5, weight_decay=0.0):if num_hidden is None:num_hidden = num_channelself.model = Sequential()self.model.add(LSTM(units=num_hidden, input_dim=num_channel, kernel_regularizer=l1(weight_decay),recurrent_regularizer=l1(weight_decay)))#units=30,input_dim=5self.model.add(Dense(1))self.model.summary()rms_prop = RMSprop(lr=0.001, rho=0.9, epsilon=1e-6)# adam = Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=1e-8)# adagrad = Adagrad(lr=0.1, epsilon=1e-5)self.model.compile(loss='mean_squared_error', optimizer=rms_prop)def fit(self, x, y, batch_size=10, epochs=100):#x:4085*10*1  y:4085*1early_stopping = EarlyStopping(monitor='val_loss', patience=5)hist = self.model.fit(x, y,batch_size=batch_size,epochs=epochs,verbose=2,validation_split=0.2,callbacks=[early_stopping])return histdef predict(self, x):return self.model.predict(x)

训练完后需要检测其因果关系了,如若检测时间序列0和1有没有因果关系,则首先将5条时间序列全部放进去进行预测:

var_denominator[0][k] = np.var(lstm.predict(x1[:, :, input_set]) - tmp_y, axis=0)

接着,再将0拿掉,用剩下的4条时间序列放入LSTM.predict()进行预测:

tmp_x = x1[:, :, input_set]
channel_del_idx = input_set.index(j)
tmp_x[:, :, channel_del_idx] = 0
granger_matrix[j][k] = np.var(lstm.predict(tmp_x) - tmp_y, axis=0)

以此类推,得到整个格兰杰因果矩阵。

代码如下:

import numpy as np
def GC():all_candidate = [[0,1,2,3,4],[0,1,2,3,4],[0,1,2,3,4],[0,1,2,3,4],[0,1,2,3,4]]granger_matrix = np.zeros([5, 5])#5*5var_denominator = np.zeros([1, 5])#1*5for k in range(5):tmp_y = np.reshape(y1[:, k], [y1.shape[0], 1])    input_set=all_candidate[k]hist_result = []lstm = CustomLSTM(num_hidden=30, num_channel=len(input_set))hist_res = lstm.fit(x1[:, :, input_set], tmp_y, batch_size=64, epochs=100)hist_result.append(hist_res)var_denominator[0][k] = np.var(lstm.predict(x1[:, :, input_set]) - tmp_y, axis=0)for j in range(5):if j not in input_set:granger_matrix[j][k] = var_denominator[0][k]elif len(input_set) == 1:tmp_x = x1[:, :, k]tmp_x = tmp_x[:, :, np.newaxis]granger_matrix[j][k] = np.var(lstm.predict(tmp_x) - tmp_y, axis=0)else:tmp_x = x1[:, :, input_set]channel_del_idx = input_set.index(j)tmp_x[:, :, channel_del_idx] = 0granger_matrix[j][k] = np.var(lstm.predict(tmp_x) - tmp_y, axis=0)granger_matrix = granger_matrix / var_denominatorfor i in range(5):granger_matrix[i][i] = 1granger_matrix[granger_matrix < 1] = 1granger_matrix = np.log(granger_matrix)return granger_matrixgranger_matrix=np.zeros((5,5))
for i in range(10):granger_matrix +=GC()
granger_matrix=granger_matrix/10
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.matshow(granger_matrix)

最后得到的格兰杰因果矩阵如下:

 可以看到,绝大部分连边已经重构完成,多次实验即可获得最优值。


http://chatgpt.dhexx.cn/article/Rotqvjdo.shtml

相关文章

时序分析28 - 时序预测 格兰杰因果关系(中) python实践1

时序分析28 - 时序预测 - 格兰杰因果关系(中) Python 实践 1 上一篇文章我们介绍了格兰杰因果关系的基本概念、背景以及相关统计检验法。本篇文章我们使用Python编程实践一下。 实践1&#xff1a;股票价格数据之间的格兰杰因果关系 问题&#xff1a;苹果公司今天的股价是否…

格兰杰因果 / EEG脑电数据分析

&#xff08;因为处理数据的时候需要用到格兰杰因果关系检验&#xff0c;相关的文献里又没有详细解释&#xff0c;但看格兰杰因果又有一些一知半解&#xff0c;于是自己学了一些相关的东西&#xff0c;整理了一下。&#xff09; 格兰杰因果关系检验为2003年诺贝尔经济学奖得主…

ZincSearch轻量级全文搜索引擎入门到

ZincSearch轻量级全文搜索引擎入门到 Zinc是一个用于对文档进行全文搜索的搜索引擎。它是开源的&#xff0c;内置在 Go 中。Zinc不是从头开始构建索引引擎&#xff0c;而是构建在 bluge 之上&#xff0c;这是一个出色的索引库。ZincSearch特点&#xff1a; 无模式索引资源利用…

轻量级神经网络MobileNet全家桶详解

本文是转载文章&#xff0c;转载自从MobileNet看轻量级神经网络的发展&#xff0c;删除了文中冗余的部分&#xff0c;加入许多自己的理解&#xff0c;有些部分也通过pytorch进行了实现&#xff0c;并通过引入具体的计算更清晰的反映出轻量级神经网络的本质。 文章目录 一、前言…

mysql轻量级的管理工具

mysql轻量级的管理工具 最近用mysql老是发愁&#xff0c;为什么呢&#xff1f;&#xff1f; 因为很多调用mysql的工具都很大型&#xff0c;我想要个轻量级的。 在进过百度谷歌的各种搜索&#xff0c;发现一个在windows平台下非常好的mysql工具&#xff1a;HeidiSQL 官网&am…

轻量级git服务gogs平台

1. gogs安装 1. 官网地址下载 https://dl.gogs.io/ 选择需要的版本 本文下载最新版本 2. 解压安装 # 下载 wget https://dl.gogs.io/0.12.6/gogs_0.12.6_linux_amd64.tar.gz# 解压到指定目录 tar -zxvf gogs_0.12.6_linux_amd64.tar.gz -C /usr/local/ 3. 启动 /usr/loca…

轻量级网络之CondenseNet

轻量级网络之CondenseNet CondenseNet: An Efficient DenseNet using Learned Group Convolutions 2018CVPR的网络&#xff0c;文章的贡献从名字就能清晰明了的Get。利用可学习分组卷积&#xff0c;对DenseNet的进行轻量化改造。 首先看一下是如何替换网络中的普通卷积&#xf…

轻量级大数据计算引擎esProc SPL,Hadoop Spark太重

​强烈推荐一个大神的人工智能的教程&#xff1a;http://www.captainai.net/zhanghan 前言 背景:随着大数据时代的来临&#xff0c;数据量不断增长&#xff0c;传统小机上跑数据库的模式扩容困难且成本高昂&#xff0c;难以支撑业务发展。应对之法:很多用户开始转向分布式计算…

轻量级神经网络架构综述

轻量级神经网络架构综述 深度神经网络已经被证明可以有效的解决图像、自然语言等不同领域的问题.同时伴随着移动互联网技术的不断发展,便携式设备得到了迅速的普及,用户提出了越来越多的需求.因此,如何设计高效、高性能的轻量级神经网络是解决问题的关键.本文详细阐述了三种构…

轻量级锁的原理与实战

文章目录 1. 轻量级锁的核心原理2. 代码演示3. 轻量级锁的分类4. 轻量级锁的膨胀 1. 轻量级锁的核心原理 轻量级锁的执行过程&#xff1a;在抢锁线程进入临界区之前&#xff0c;如果内置锁&#xff08;临界区的同步对象&#xff09;没有被锁定&#xff0c;JVM首先将在抢锁线程的…

轻量级深度学习网络概览

调研了一下最近的一些轻量级网络&#xff0c;列举并简单介绍各个网络的设计思路 PVANET 2016年1月在arxiv网站第一次提交 文章地址&#xff1a;https://arxiv.org/abs/1608.08021 代码链接&#xff1a;https://github.com/sanghoon/pva-faster-rcnn 文章目的是减少网络计算量…

详细且通俗讲解轻量级神经网络——MobileNets【V1、V2、V3】

文章目录 轻量级神经网络——MobileNetsMobileNetV1深度可分离卷积1、**深度卷积**✨✨✨2、**逐点卷积**✨✨✨ 参数量和计算量1、**标准卷积**2、**深度可分离卷积**✨✨✨ MobileNetV1的网络结构及效果 MobileNetV2Linear Bottlenecks✨✨✨Inverted Residuals✨✨✨MobileN…

目标检测--轻量级网络(截至2022-04-21)

目标检测领域&#xff0c;基于深度学习模型的方案 截至目前的轻量级网络&#xff0c;比较有名的有这些 轻量级目标检测算法整理_牧羊女说的博客-CSDN博客_轻量级目标检测随着目标检测算法的快速发展&#xff0c;以及终端应用的日渐广泛&#xff0c;工业界对深度学习网络在终端…

linux的轻量级桌面,适用于Linux的轻量级桌面是最适合您的 | MOS86

当谈到Linux时&#xff0c;似乎大多数人都以最多的眼睛糖果来谈论桌面环境。虽然这些桌面是以自己的方式伟大的&#xff0c;但他们不是每个人都在寻找图形密集和漂亮的东西。 一些Linux用户喜欢在Linux计算体验方面采用更精简和简化的方法。正是因为这个原因 Note:这个列表中的…

轻量级锁与重量级锁

目录 一、轻量级锁 1、使用场景 2.使用过程 2.1每次指向到synchronized代码块时&#xff0c;都会创建锁记录&#xff08;Lock Record&#xff09;对象&#xff0c;每个线程都会包括一个锁记录的结构&#xff0c;锁记录内部可以储存对象的Mark Word和对象引用reference 2.2让锁…

轻量级卷积神经网络

目录 SqueezeNet(2016.11) SqueezeNet(2016.11) 作者认为模型的参数量是影响模型大小以及训练速度的主要因素&#xff0c;因此本篇文章的设计思想就在于如何减少模型的参数量。本篇文章共有6节&#xff0c;其中第1、2节为介绍及相关工作部分&#xff1b;第3节描述了SqueezeNet…

轻量级linux桌面环境,Linux发行版最为轻量级的桌面环境之一Xfce 桌面

开源多样性应该是 Linux 最好的特性之一,用户可以不断尝试各种自己喜欢的新鲜玩法与花样,并从中选择最适合自己的应用。无论你是 Linux 新人还是老鸟,层出不穷的应用和桌面环境可能都会让我们应接不暇,特别是尝试不同的 Linux 桌面环境,可以说是一件非常有趣但也耗时的事情…

鸿蒙轻量级数据存储Preferences

1&#xff0c;概述 鸿蒙轻量级偏好数据库-Preferences。 轻量级偏好数据库主要提供轻量级Key-Value键值对形式操作&#xff0c;支持少量数据&#xff0c;数据存在在本地文件中&#xff0c;同时也加载在内存中&#xff0c;所以速度快&#xff0c;效率高&#xff0c;属于非关系型…

轻量级目标检测算法整理

随着目标检测算法的快速发展&#xff0c;以及终端应用的日渐广泛&#xff0c;工业界对深度学习网络在终端应用的关注度越来越高&#xff0c;尤其是对于如何保持速度和精度上的平衡&#xff0c;也形成了不小的研究热度。本篇整理了一些较新的轻量级目标检测网络&#xff0c;结合…

轻量级网络总结

文章目录 1. SqueezeNet2. ShuffleNet2.1 v12.2 v2 3. MobileNet3.1 v13.2 v23.3 v3 4. GhostNet4.1 v14.2 v2 1. SqueezeNet SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and< 0.5 MB model size 考虑到卷积层的参数量为 C i n ∗ C o u t ∗ K ∗ K …