时间序列python复杂网络实例_机器学习案例二:缺失时间序列数据填补与ESN(回声状态网络)...
时间序列数据是一种与时间因素有关系的连续的数据,通常使用传感器等来获取,具有极高的应用价值,可以实时记录被监测设备或人的状态,同时可以用于预测建模,得到对某事件未来发展的一个期望。
在使用传感器进行数据采集的过程中,在没有备用传感器的情况下,会由于种种原因出现采集到的数据在某个时间段内数据缺失的现象。针对某个时间段内的部分数据缺失需要进行科学的验证,最重要的是要验证的是在数据缺失的前后传感器采集的数据是否发生了质的变化(如果发生则认为缺失数据前或后的数据是可用的,整体不可用)。
时间序列数据的填补不像单一缺失值的填补那么轻松,特别是在时间序列具有变化趋势和明显的周期波动现象。常用的时间学列填补方法的思路是从前到后填补、从后到前填补和两端同时开始填补。
本例中以某传感器采集的时间序列数据为基础,来使用具有递归性质的神经网络来对缺失的数据进行填补。(数据量在1500左右,数据量不是很大)
常用的具有递归性质的神经网络有Elman神经网络和ESN神经网络(由于本例数据较少,因此没有使用现在很流行的LSTM神经网络)。Elman神经网络的出现时间较早,原理较简单,这里介绍ESN神经网络。Jarger在2004年首先提出针对传统递归神经网络训练算法改进的新型递归神经网络,即回声状态网络(ESN)。对于BP神经网络中训练样本效率非常低的情况,回声状态网络凭借独特结构形态和训练方式有效避免了神经网络规模无法扩大以及局部最优情况。为了解决传统神经网络遇到的收敛慢和局部最小等问题,全新的ESN神经网络内部构造了储备池作为中心计算单元的重要结构,最大程度地模仿了生物神经元的构造和计算特征。由于没有使用梯度下降的学习算法,回声状态网络转而使用单次训练算法而非大量重复多次训练。另外模型中的复杂网络结构(储备池)由数量极大的神经元群相互连接,需要事先初始化储备池神经网络连接矩阵的权值,这使得ESN较之其他神经网络具有更好的稳定性。相对于其他神经网络而言,ESN能够更好的描述非线性混沌时间序列。
ESN的代码如下:
%% Prepare
clear all;
disp('Loading data......');
%% Data input
% Train data
traindata = '';
% Teach data
teachdata ='';
%% Data prepare
train = xlsread(traindata);
teach = xlsread(teachdata);
%% Exercise
tic
InputSequence = train;
OutputSequence = teach;
%% ESN
% 训练集和测试集
% [Am,An] = size(YA);
% tic
% InputSequence = YA(1:494,:);
% OutputSequence = input2;
% split the data into train and test
tic
train_fraction = 0.7 ; % use 50% in training and 50% in testing
[trainInputSequence, testInputSequence] = split_train_test(InputSequence,train_fraction);
[trainOutputSequence,testOutputSequence] = split_train_test(OutputSequence,train_fraction);
% generate an esn
nInputUnits = 9; nInternalUnits = 50; nOutputUnits = 1;
esn = generate_esn(nInputUnits, nInternalUnits, nOutputUnits, ...
'spectralRadius',0.2,'inputScaling',[0.1;0.1;0.1;0.1;0.1;0.1;0.1;0.1;0.1],'inputShift',[0;0;0;0;0;0;0;0;0], ...
'teacherScaling',[0.3],'teacherShift',[-0.2],'feedbackScaling', 0, ...
'type', 'plain_esn');
esn.internalWeights = esn.spectralRadius * esn.internalWeights_UnitSR;
% train the ESN
nForgetPoints = 50 ; % discard the first 100 points
[trainedEsn, stateMatrix] = train_esn(trainInputSequence, trainOutputSequence, esn, nForgetPoints) ;
nForgetPoints = 50 ;
predictedTrainOutput = test_esn(trainInputSequence, trainedEsn, nForgetPoints);
predictedTestOutput = test_esn(testInputSequence, trainedEsn, nForgetPoints) ;
% create input-output plots
nPlotPoints = 60 ;
nPlotPoints1 = 100 ;
plot_sequence(trainOutputSequence(nForgetPoints+1:end,:), predictedTrainOutput, nPlotPoints1,...
'training: teacher sequence (red) vs predicted sequence (blue)');
grid on;
plot_sequence(testOutputSequence(nForgetPoints+1:end,:), predictedTestOutput, nPlotPoints, ...
'testing: teacher sequence (red) vs predicted sequence (blue)') ;
grid on;
%compute NRMSE training error
trainError = compute_error(predictedTrainOutput, trainOutputSequence);
disp(sprintf('train NRMSE = %s', num2str(trainError)))
%compute NRMSE testing error
testError = compute_error(predictedTestOutput, testOutputSequence);
disp(sprintf('test NRMSE = %s', num2str(testError)))
disp('训练结束!');
toc
ESN神经网络的特殊结构需要调节的参数有隐含层神经元的个数、储备池的半径、输入信号的缩放比例、输入信号的偏移、输出信号的缩放比例和缩放信号的偏移。其中,隐含层的神经元个数对模型的预测精度影响最大,剩余的其他参数中,储备池的半径也对预测精度有较大的影响。在进行仿真的时候,神经元的传递函数选择ESN神经网络中的plain_esn。
因此在使用ESN神经网络的时候,主要需要调整的参数是隐含层的神经元个数和储备池的半径,一下是ESN的主函数:
nInputUnits = 9; nInternalUnits = 50; nOutputUnits = 1;
esn = generate_esn(nInputUnits, nInternalUnits, nOutputUnits, ...
'spectralRadius',0.2,'inputScaling',[0.1;0.1;0.1;0.1;0.1;0.1;0.1;0.1;0.1],'inputShift',[0;0;0;0;0;0;0;0;0], ...
'teacherScaling',[0.3],'teacherShift',[-0.2],'feedbackScaling', 0, ...
'type', 'plain_esn');
需要调节的是:1)nInternalUnits(隐含层的神经元个数)和 2)spectralRadius(储备池的半径)。
通过调节参数就可以进行数据的预测填补了。
plain_esn的源码:
function internalState = plain_esn(totalstate , esn , varargin)
% PLAIN_ESN computes the new internal states of the ESN by using the simple
% esn equations
%
% input arguments:
% totalstate: the previous totalstate, vector of size
% (esn.nInternalUnits + esn.nInputUnits + esn.nOutputUnits) x 1
% esn: the ESN structure
%
% output:
% internalState: the updated internal state, size esn.nInternalUnits x 1
%
% Created April 30, 2006, D. Popovici
% Copyright: Fraunhofer IAIS 2006 / Patent pending%
% Revision 1, June 6, 2006, H.Jaeger
% Revision 2, June 23, 2007, H. Jaeger (include esn.feedbackScaling)
internalState = feval( esn.reservoirActivationFunction , ...
[esn.internalWeights , esn.inputWeights , esn.feedbackWeights * diag(esn.feedbackScaling )] * totalstate) ;
%%%% add noise to the Esn
internalState = internalState + esn.noiseLevel * (rand(esn.nInternalUnits,1) - 0.5) ;
还有其他源码需要去下载资源包(http://bbs.06climate.com/forum.php?mod=viewthread&tid=35933)
时间序列python复杂网络实例_机器学习案例二:缺失时间序列数据填补与ESN(回声状态网络)...相关推荐
- matlab最小二乘 弹性网络,基于弹性SCAD罚函数的回声状态网络时间序列预测方法与流程...
本发明涉及信息技术领域,具体地说是一种基于弹性SCAD罚函数的回声状态网络时间序列预测方法. 背景技术: 回声状态神经网络是一种新型的递归神经网络学习方法.其通过引入一个随机生成.且保持不变的,称作为 ...
- 时间序列python复杂网络实例_基于时间序列数据的复杂网络重构
摘要:现实生活中,复杂系统俯首即是,和人们的生活息息相关,遍及的领域包括社会,经济,物理,生物和生态等.为了便于研究,复杂网络通常被看成是复杂系统的一种抽象描述,其中,网络中的单个节点对应于系统中的单 ...
- Deep Learning之带你详细了解回声状态网络(ESN)
Abstract 首先呢写本篇博客的灵感来源于我在学习RNN(循环神经网络)时对 ...
- 第二十九课.回声状态网络ESN
目录 Echo State Network ESN的训练与预测 关于ESN工作原理的理解 基于Numpy的ESN Echo State Network ESN的训练与预测 回声状态网络(Echo St ...
- 回声状态网络(Echo State Network)
文章目录 洛伦兹系统 回声状态网络 动力学模型 python 实现 所需的包 配置文件 Reservoir 类 运行结果 默认的测试样例 lorentz 系统 洛伦兹系统 数据生成见博文:混沌系统数值 ...
- python实现线性回归预测_机器学习实战笔记(Python实现)-08-线性回归
--------------------------------------------------------------------------------------- 本系列文章为<机器 ...
- Python 散点图线性拟合_机器学习之利用Python进行简单线性回归分析
前言:在利用机器学习方法进行数据分析时经常要了解变量的相关性,有时还需要对变量进行回归分析.本文首先对人工智能/机器学习/深度学习.相关分析/因果分析/回归分析等易混淆的概念进行区分,最后结合案例介绍 ...
- 聚类分析在用户行为中的实例_聚类分析案例之市场细分
聚类是将数据分类到不同的类或者簇这样的一个过程,所以同一个簇中的对象有很大的相似性,而不同簇间的对象有很大的相异性. 从统计学的观点看,聚类分析是通过数据建模简化数据的一种方法.传统的统计聚类分析方法 ...
- 聚类分析在用户行为中的实例_聚类分析案例
一.数据挖掘的常用方法 利用数据挖掘进行数据分析常用的方法主要有分类.回归分析.聚类.关联规则.特征.变化和偏差分析.Web页挖掘等,它们分别从不同的角度对数据进行挖掘. 分类.分类是找出数据库中一组 ...
- python 线性回归回归 缺失值 忽略_机器学习 第3篇:数据预处理(使用插补法处理缺失值)...
插补法可以在一定程度上减少偏差,常用的插补法是热卡插补.拟合插补和多重插补.拟合插补,要求变量间存在强的相关性:多重插补(MCMC法),是在高缺失率下的首选插补方法,优点是考虑了缺失值的不确定性. 一 ...
最新文章
- whereis php,Linux命令教程之比较搜索命令whereis与which的区别
- 团队项目第一次冲刺第三天
- Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP
- C 语言 链表的创建与打印
- 以Binder视角来看Service启动
- oracle job 事务提交,Oracle dbms_job.submit用法
- Swift 里集合类型协议的关系
- 人工计算机的相关信息,第三届计算机信息科学与人工智能国际学术会议(CISAI 2020)...
- 关于 Jason.NET 的质问
- Nodejs中获取get请求传过来的参数_note
- nginx nodejs环境配置_Linux基本开发环境配置git,c++,nodejs,nginx
- 鲸鲨阵列服务器怎么装系统,鲸鲨软件 | 自主可控IT基础架构产品及解决方案提供商...
- 树莓派3 + Android Things
- 系统学习机器学习之增强学习(五)--马尔可夫决策过程策略TD求解(SARSA)
- Python 打造最强表白程序(源码)
- Retinex网络模型学习笔记
- 百度云链接使用迅雷下载时提示有误的问题解决
- android 程序中设置默认输入法
- 3dsmax展UV,制作UV贴图,将物体的贴图放到一张图片上,贴图优化方式,UVW贴图制作全流程
- python如何切换windows窗口_selenium+python 切换窗口的几种方法
热门文章
- java并发编程第十二课 java内存模型
- 【C语言学习笔记】输出函数puts()
- 2016.8.6 学习总结
- 介绍dbt,ETL和ELT Disrupter
- dbt2 mysql_mysql压力测试工具-DBT2 Benchmark Tool下载0.37.50.14-西西软件下载
- 3dmax 使用babylon导出gltf模型异常问题
- centos 6 php mysql_Centos 6安装完美搭建mysql、php、apache之旅
- python:烤地瓜程序
- java数据离散化模板
- 【opencv 450 Image Processing】Creating Bounding boxes and circles for contours为轮廓创建边界框和圆