ReservoirComputing.jl
ReservoirComputing.jl 提供了高效、模块化且易于使用的回声状态网络(ESN)等水库计算模型实现。有关使用本包的信息,请参阅稳定版文档。使用开发中文档可以了解尚未发布的功能。
快速示例
为了说明该库的工作流程,我们将展示如何训练一个 ESN 来学习 Lorenz 系统的动态。首先,我们需要收集数据。对于"生成式"预测,我们需要目标数据比训练数据提前一步:
using ReservoirComputing, OrdinaryDiffEq
# Lorenz 系统参数
u0 = [1.0, 0.0, 0.0]
tspan = (0.0, 200.0)
p = [10.0, 28.0, 8 / 3]
#定义洛伦兹系统
function lorenz(du, u, p, t)
du[1] = p[1] * (u[2] - u[1])
du[2] = u[1] * (p[2] - u[3]) - u[2]
du[3] = u[1] * u[2] - p[3] * u[3]
end
#求解并获取数据
prob = ODEProblem(lorenz, u0, tspan, p)
data = solve(prob, ABM54(), dt = 0.02)
shift = 300
train_len = 5000
predict_len = 1250
#用于生成预测的一步前进
input_data = data[:, shift:(shift + train_len - 1)]
target_data = data[:, (shift + 1):(shift + train_len)]
test = data[:, (shift + train_len):(shift + train_len + predict_len - 1)]
现在我们有了数据,可以用选定的参数初始化ESN。由于这是一个快速示例,我们将尽可能少地更改参数。有关函数的更详细示例和解释,请参阅文档。
input_size = 3
res_size = 300
esn = ESN(input_data, input_size, res_size;
reservoir = rand_sparse(; radius = 1.2, sparsity = 6 / res_size),
input_layer = weighted_init,
nla_type = NLAT2())
现在可以训练和测试回声状态网络了。如果未指定,训练将始终使用普通最小二乘回归。完整的训练方法详见文档。
output_layer = train(esn, target_data)
output = esn(Generative(predict_len), output_layer)
返回的数据是一个包含预测轨迹的矩阵,在上面的代码中为output。现在可以轻松绘制结果(有关获得此图的实际脚本,请参阅文档):
using Plots
plot(transpose(output), layout = (3, 1), label = "预测")
plot!(transpose(test), layout = (3, 1), label = "实际")
还可以可视化吸引子的相空间并与实际对比:
plot(transpose(output)[:, 1],
transpose(output)[:, 2],
transpose(output)[:, 3],
label = "预测")
plot!(transpose(test)[:, 1], transpose(test)[:, 2], transpose(test)[:, 3], label = "实际")
## 引用
如果您在工作中使用此库,请引用:
@article{JMLR:v23:22-0611,
author = {Francesco Martinuzzi and Chris Rackauckas and Anas Abdelrehim and Miguel D. Mahecha and Karin Mora},
title = {ReservoirComputing.jl: An Efficient and Modular Library for Reservoir Computing Models},
journal = {Journal of Machine Learning Research},
year = {2022},
volume = {23},
number = {288},
pages = {1--8},
url = {http://jmlr.org/papers/v23/22-0611.html}
}
## 致谢
这个项目得以实现要归功于2020年[谷歌编程之夏](https://summerofcode.withgoogle.com/)项目的初始资金支持。Francesco M. 还要感谢[ScaDS.AI](https://scads.ai/)和[RSC4Earth](https://rsc4earth.de/)对该库当前进展的支持。