文章目录

  • 洛伦兹系统
  • 回声状态网络
    • 动力学模型
  • python 实现
    • 所需的包
    • 配置文件
    • Reservoir 类
  • 运行结果
    • 默认的测试样例
    • lorentz 系统

洛伦兹系统

数据生成见博文:混沌系统数值模拟

回声状态网络

动力学模型

  • 状态更新函数
  • 输出函数

    结构下图所示,虚线连接不是必要的

python 实现

所需的包

import networkx as nx
import json
from decimal import Decimal
from collections import OrderedDict

配置文件

# if config file not exists, use this default config
default_config = """{"input": {"nodes": 2,"functions": ["lambda x: np.cos(32 * np.pi * x)","lambda x: np.sin(32 * np.pi * x) + np.cos(128 * np.pi * x)"],"length": 5000},"reservoir": {"start_node": 202,"end_node": 203,"step": 1,"degree_function": "lambda x: np.sqrt(x)","sigma": 0.5,"bias": 1, "leakage_rate": 0.3,"regression_parameter": 1e-8},"output": {"nodes": 2},"training": {"init": 1000,"train": 3000,"test": 2000,"error": 1999}
}
"""

Reservoir 类

  • 默认读取配置文件 ‘reservoir.config’,如果找不到配置文件就用上面的默认配置
class Reservoir:def __init__(self):config_file_name = 'reservoir.config'global configconfig = json.loads(default_config, object_pairs_hook=OrderedDict)# Input layerself.M = config["input"]["nodes"]self.input_len = config["input"]["length"]self.input_func = []dataset = []for i in range(self.M):self.input_func.append(eval(config["input"]["functions"][i]))dataset.append(self.input_func[i](np.arange(self.input_len) / self.input_len))self.dataset = np.array(list(zip(*dataset))).T # shape = (M, length)# Reservoir layerself.start_node = config["reservoir"]["start_node"]self.N = self.start_nodeself.step = config["reservoir"]["step"]self.end_node = config["reservoir"]["end_node"]self.degree_func = eval(config["reservoir"]["degree_function"])self.D = self.degree_func(self.start_node)self.sigma = config["reservoir"]["sigma"]self.bias = config["reservoir"]["bias"]self.alpha = config["reservoir"]["leakage_rate"]self.beta = config["reservoir"]["regression_parameter"]# Output layerself.P = config["output"]["nodes"]# Training relevantself.init_len = config["training"]["init"]self.train_len = config["training"]["train"]self.test_len = config["training"]["test"]self.error_len = config["training"]["error"]
  • 参数解释
参数 解释
M 输入节点数
N 隐层节点数,储备池中的单元数
P 输出节点数
D 网络平均度
start_node,step,end_node 搜索最佳隐层节点数时的起始节点数、步长、终止
beta、regression_parameter 岭回归的参数
sigma 随机初始化权重的分布范围[−σ,σ][-\sigma,\sigma][−σ,σ]
bias 加权求和再加偏置
alpha LIF的渗漏系数
  • 默认配置文件中定义了数据集,如需使用自己的数据集,使用如下代码
   def set_dataset(self, data):self.M = self.P = data.shape[0]self.dataset = data
  • 训练
变量 含义
r 每一时刻的隐层状态
S 预测目标
R 记录训练时间段的输入和状态
A 隐层网络的邻接矩阵
rho 原始 A 的谱半径

状态更新:
r(t+1)=(1−α)r(t)+α∗tanh⁡(A∗r(t)+Win∗u(t)+b)r(t +1) = (1 - \alpha)r(t) + \alpha * \tanh(A * r(t) + W_{in} * u(t) + b)r(t+1)=(1−α)r(t)+α∗tanh(A∗r(t)+Win​∗u(t)+b)输出 vvv 不止取决与状态,还直接和输入有关:
v=Wout1⋅r(t+1)+Wout2⋅u+Wout3⋅bv=W_{out}^1 \cdot r(t+1)+W_{out}^2 \cdot u + W_{out}^3 \cdot bv=Wout1​⋅r(t+1)+Wout2​⋅u+Wout3​⋅b

    def train(self):# collection of reservoir state vectorsself.R = np.zeros((1 + self.N + self.M, self.train_len - self.init_len))# collection of input signalsself.S = np.vstack([x[self.init_len + 1: self.train_len + 1] for x in self.dataset])self.r = np.zeros((self.N, 1))np.random.seed(43) #42self.Win = np.random.uniform(-self.sigma,self.sigma, (self.N, self.M + 1))# TODO: the values of non-zero elements are randomly drawn from uniform dist [-1, 1]g = nx.erdos_renyi_graph(self.N, self.D / self.N, 42, True)# nx.draw(g, node_size=self.N)self.A = nx.adjacency_matrix(g).todense()# spectral radius: rhoself.rho = max(abs(np.linalg.eig(self.A)[0]))self.A *= 1.25 / self.rho# run the reservoir with the data and collect rfor t in range(self.train_len):u = np.vstack([x[t] for x in self.dataset])# r(t + \Delta t) = (1 - alpha)r(t) + alpha * tanh(A * r(t) + W_in * u(t) + bias)self.r = (1 - self.alpha) * self.r + self.alpha * np.tanh(np.dot(self.A,self.r) + np.dot(self.Win, np.vstack((self.bias, u))))if t >= self.init_len:self.R[:, [t - self.init_len]] = np.vstack((self.bias, u, self.r))[:, 0]# train the outputR_T = self.R.T  # Transpose# W_out*r = s# W_out = (s * r^T) * ((r * r^T) + beta * I)self.Wout = np.dot(np.dot(self.S, R_T), np.linalg.inv(np.dot(self.R, R_T) + self.beta * np.eye(self.M + self.N + 1)))
  • 训练完后,以输出作为下一时刻输入,无限运行下去
def _run(self):# run the trained ESN in alpha generative mode. no need to initialize here,# because r is initialized with training data and we continue from there.self.S = np.zeros((self.P, self.test_len))u = np.vstack([x[self.train_len] for x in self.dataset])for t in range(self.test_len):# r(t + \Delta t) = (1 - alpha)r(t) + alpha * tanh(A * r(t) + Win * u(t) + bias)self.r = (1 - self.alpha) * self.r + self.alpha * np.tanh(np.dot(self.A,self.r) + np.dot(self.Win, np.vstack((self.bias, u))))s = np.dot(self.Wout, np.vstack((self.bias, u, self.r)))self.S[:, t] = np.squeeze(np.asarray(s))# use output as inputu = s# compute Root Mean Square (RMS) error for the first self.error_len time stepsself.RMS = []for i in range(self.P):self.RMS.append(sum(np.square(self.dataset[i, self.train_len+1: self.train_len+self.error_len+1] - self.S[i, 0: self.error_len])) / self.error_len)
  • 画图
    def draw(self):f, plots = plt.subplots(1, self.M, figsize=(self.M * 5, 5))plt.suptitle('N = ' + str(self.N) + ', Degree = %.5f' % (self.D))for i in range(self.M):p = plots[i]p.text(0.5, -0.1, 'RMS = %.15e' % self.RMS[i], size=10, ha="center", transform=p.transAxes)p.plot(self.S[i], label = 'prediction')p.plot(self.dataset[i][self.train_len + 1 : self.train_len + self.test_len + 1], label = 'input signal')p.legend(loc = 'upper right')plt.show()
  • 完整运行:训练+预测
    def run(self):with open('reservoir.output', 'a') as output:for i in range(self.start_node, self.end_node + 1, self.step):self.N = i self.D = self.degree_func(self.N)self.train()self._run()self.summary()self.draw()def summary(self):res = 'N= ' + str(self.N) + ', D= ' + '%.15f' % self.D + ', 'for j in range(self.P): res += 'RMS_{}= {:.5e}, '.format(j, Decimal(self.RMS[j]))res += '\n'print(res)

运行结果

默认的测试样例

r = Reservoir()
# r.set_dataset(x)
r.run()

lorentz 系统

r = Reservoir()
r.set_dataset(x)
r.run()


看起来好像乱七八糟,但实际上ESN已经重建了洛伦兹系统的动态行为,看如下 3D 图:

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax = fig.add_subplot()
plt.plot(*r.dataset, 'r')
plt.plot(*r.S, 'g')

回声状态网络(Echo State Network)相关推荐

  1. 第二十九课.回声状态网络ESN

    目录 Echo State Network ESN的训练与预测 关于ESN工作原理的理解 基于Numpy的ESN Echo State Network ESN的训练与预测 回声状态网络(Echo St ...

  2. Deep Learning之带你详细了解回声状态网络(ESN)

                                                                Abstract 首先呢写本篇博客的灵感来源于我在学习RNN(循环神经网络)时对 ...

  3. matlab最小二乘 弹性网络,基于弹性SCAD罚函数的回声状态网络时间序列预测方法与流程...

    本发明涉及信息技术领域,具体地说是一种基于弹性SCAD罚函数的回声状态网络时间序列预测方法. 背景技术: 回声状态神经网络是一种新型的递归神经网络学习方法.其通过引入一个随机生成.且保持不变的,称作为 ...

  4. python回声程序echo 一行代码_回声状态网络法echo state network代码(简单)

    [实例简介] esn作者在官网的简单版代码,给英文不好的同学拿过来,免得再去找地方下载 [实例截图] [核心代码] ESN_Toolbox └── ESN_Toolbox ├── analogToUn ...

  5. Linux网络虚拟化基石 network namespace

    1 网络虚拟化基石 network namespace Linux的namespace的作用就是"隔离内核资源". 在Linux的世界里,文件系统挂载点.主机名.POSIX进程间通 ...

  6. linux 的ip 设置lo_linux网络虚拟化: network namespace 简介及实验

    namespace(命名空间)和cgroup是软件容器化(想想Docker)趋势中的两个主要内核技术.简单来说,cgroup是一种对进程进行统一的资源监控和限制,它控制着你可以使用多少系统资源(CPU ...

  7. 与众不同 windows phone (23) - Device(设备)之硬件状态, 系统状态, 网络状态

    原文:与众不同 windows phone (23) - Device(设备)之硬件状态, 系统状态, 网络状态 [索引页] [源码下载] 与众不同 windows phone (23) - Devi ...

  8. 闪电网络简介Lightning Network

    区块链很慢,而且昂贵.闪电网络(Lightning Network)就是解决这个问题的.如果我不得不发送给你一些比特币,你会在几个小时内收到它们,而且我也支付了很高的交易费.凭这样的声誉,Blockc ...

  9. 【论文阅读记录】孪生网络(Siamese network)

    前言: { 之前深度学习不流行的时候,一般像指纹鉴别这种任务都需要很复杂的特征工程(比如寻找角点[1])来完成.我在谷歌搜索了深度学习的指纹识别解决方案,之后搜到了[2],便因此了解到了孪生网络(Si ...

最新文章

  1. 云知声CEO黄伟:AI对产业的驱动不仅是创新更是颠覆
  2. OpenStack安装部署实战——问题集锦
  3. C语言 链表的创建--打印--逆置--新增--删除--排序--释放
  4. 语音保存 ,与下载,
  5. 滴滴自研分布式 NoSQL 数据库 Fusion 的演进之路
  6. ajax异步查询demo,ASP.NET中AJAX的异步加载(Demo演示)
  7. ai钢笔工具怎么描线_骨灰级的AI钢笔工具运用技巧
  8. mysql optimizer_mysql 参数optimizer_switch
  9. 4邻接、8邻接、m邻接
  10. 都是程序员,凭什么他工资比我高,下班比我早?
  11. 电容充放电原理图_别找了,去耦电容全攻略就在这!
  12. echarts地图展示
  13. BP算法简单推导过程
  14. MapABC地图API
  15. Pixel 3 的最佳照片功能
  16. xxx(telnet, netstat): command not found
  17. 利用python在网上接单赚钱,兼职也能月入过万,还不赶紧学起来...
  18. Bootstrap字体图标
  19. 从零在FPG上实现OFDM(一)
  20. 为TreeView正色

热门文章

  1. 标自然段的序号格式_标自然段和数句子的方法
  2. 智能投顾原理与主流产品分析
  3. 释放你的C盘 别让win7 C盘空间越来越小
  4. 【PCIe】PCIe Multicast组播功能实现
  5. geotrellis框架sbt转投maven构建
  6. ActiveMQ的安装和启动 安装JAVA配置JAVA环境 下载ActiveMQ 解压压缩包 tar zxvf activemq-x.x.x-bin.tar.gz 至此,linux下Activ
  7. Freemark 常用代码总结
  8. 神船 K650D-i5 显卡驱动问题的一个记录
  9. ORB—点局部特征原理
  10. 当下互联网环境下物理主机和云主机到底哪个好?