复杂网络建模的反问题是网络重构,获得节点之间的关系对于分析网络特性有着至关重要的作用。常用的网络重构方法有: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)

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

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

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

  1. 论文学习——基于循环神经网络的电信行业容量数据预测方法

    文章目录 0 封面 1 标题 title 2 摘要 abstract 3 关键字 keywords 4 总结 conclusion 5 引言 introduction 6 介绍 LSTM 6.1 LS ...

  2. 深度学习代码实战演示_Tensorflow_卷积神经网络CNN_循环神经网络RNN_长短时记忆网络LSTM_对抗生成网络GAN

    前言 经过大半年断断续续的学习和实践,终于将深度学习的基础知识看完了,虽然还有很多比较深入的内容没有涉及到,但也是感觉收获满满.因为是断断续续的学习做笔记写代码跑实验,所以笔记也零零散散的散落在每个角 ...

  3. 情感分析:基于循环神经网络

    情感分析:基于循环神经网络 Sentiment Analysis: Using Recurrent Neural Networks 与搜索同义词和类比词类似,文本分类也是单词嵌入的一个下游应用.在本文 ...

  4. Chemistry.AI | 基于循环神经网络(RNN)预测分子性质

    Chemistry.AI | 基于卷积神经网络(CNN)预测分子特性 环境准备 Python版本:Python 3.6.8 PyTorch版本:PyTorch1.1.0 RDKit版本:RDKit 2 ...

  5. 双向循环神经网络_情感分析:基于循环神经网络

    情感分析:基于循环神经网络 Sentiment Analysis: Using Recurrent Neural Networks 与搜索同义词和类比词类似,文本分类也是单词嵌入的一个下游应用.在本文 ...

  6. python输出一首诗_基于循环神经网络(RNN)的古诗生成器

    基于循环神经网络(RNN)的古诗生成器,具体内容如下 之前在手机百度上看到有个"为你写诗"功能,能够随机生成古诗,当时感觉很酷炫= = 在学习了深度学习后,了解了一下原理,打算自己 ...

  7. TensorFlow练手项目二:基于循环神经网络(RNN)的古诗生成器

    基于循环神经网络(RNN)的古诗生成器 2019.01.02更新: 代码比较老了,当时的开发环境为Python 2.7 + TensorFlow 1.4,现在可能无法直接运行了.如果有兴趣,可以移步我 ...

  8. 【自然语言处理(NLP)】基于循环神经网络实现情感分类

    [自然语言处理(NLP)]基于循环神经网络实现情感分类 活动地址:[CSDN21天学习挑战赛](https://marketing.csdn.net/p/bdabfb52c5d56532133df2a ...

  9. 自然语言处理入门实战——基于循环神经网络RNN、LSTM、GRU的文本分类(超级详细,学不会找我!!!)

    1  一.实验过程 1.1  实验目的 通过这个课程项目大,期望达到以下目的: 1.了解如何对 自然语言处理 的数据集进行预处理操作. 2.初识自然语言数据集处理操作的步骤流程. 3.进一步学习RNN ...

最新文章

  1. 湘潭2020计算机考试,湖南省湘潭市2020年3月计算机等级考试注意事项
  2. golang 日志分析_容器日志采集利器:Filebeat深度剖析与实践
  3. 绕过图片防盗链的方法
  4. 矫情的C++——不明确行为(undefined behavior)
  5. 图像视频处理中Win7 32位+VS2010+OpenCV2.3.1的配置过程
  6. Mongo 常用操作
  7. python导入第三方库dlib报错解决
  8. alexnet- tensorflow
  9. VB.NET视频打开方式
  10. FastStone Capture无法录制系统声音解决方法(win10)
  11. 计算机网络拨号,个人拨号上网宽带连接设置图文方法
  12. 网站运营的十二条盈利模式
  13. Gerrit触发jenkins构建job后,不能给review的代码Verified+1
  14. 瑞吉外卖项目重难点及易错点知识点总结
  15. Hdu 4503 湫湫系列故事——植树节
  16. Java与C语言链表的不同
  17. getAttribute 和setAttribute 的使用方法
  18. 前端优化——前端面试
  19. web 前台页面内弹出框(一)
  20. ubuntu 15.10运行Xware-desktop失败问题

热门文章

  1. groovy基本语法及在项目中使用
  2. Image Caption Generation原理简介
  3. CST结果导入MATLAB,请教大家可以将CST结果调入到MATLAB中进行计算吗
  4. 关于烛光斧影——赵光义是否谋杀赵匡胤,是否合法继位
  5. 计算机 英语职称免试条件,职称计算机免试条件
  6. 【学习笔记】山东大学生物信息学-01 生物数据库
  7. windows11 git 安装SSH密钥
  8. TOM企业邮箱注册流程是什么,如何开通邮箱
  9. 三线制Pt100隔离器在掘进机电机保护系统中的应用
  10. 自建局域网 OTA 服务器