我最近从几个人那里听说,回声状态网络非常适合时间序列建模。所以我觉得值得一试。
http://en.wikipedia.org/wiki/Echo_state_network
这是一种循环网络,其中仅学习输出层中的权重,而其他权重是随机的。
他们在 R 中的库/包在多大程度上可用于创建回声状态网络?
(注意:有这个问题:R 中的神经网络包,这可能是相关的,但它要求“递归”网络,而我正在寻找“循环”或“回声状态”网络)。
我最近从几个人那里听说,回声状态网络非常适合时间序列建模。所以我觉得值得一试。
http://en.wikipedia.org/wiki/Echo_state_network
这是一种循环网络,其中仅学习输出层中的权重,而其他权重是随机的。
他们在 R 中的库/包在多大程度上可用于创建回声状态网络?
(注意:有这个问题:R 中的神经网络包,这可能是相关的,但它要求“递归”网络,而我正在寻找“循环”或“回声状态”网络)。
我知道这个问题很老,但这可能仍然有用,也许对其他人有用。
在这里,您可以找到R 中简约 Echo State Network 的工作演示源代码。它不是一个成熟的库,但我希望它易于理解并适应您的应用程序。
# A minimalistic Echo State Networks demo with Mackey-Glass (delay 17) data
# in "plain" R.
# by Mantas Lukosevicius 2012
# http://minds.jacobs-university.de/mantas
# load the data
trainLen = 2000
testLen = 2000
initLen = 100
data = as.matrix(read.table('MackeyGlass_t17.txt'))
# plot some of it
while( dev.cur() != 1 ) dev.off() # close all previous plots
dev.new()
plot(data[1:1000],type='l')
title(main='A sample of data')
# generate the ESN reservoir
inSize = outSize = 1
resSize = 1000
a = 0.3 # leaking rate
set.seed(42)
Win = matrix(runif(resSize*(1+inSize),-0.5,0.5),resSize)
W = matrix(runif(resSize*resSize,-0.5,0.5),resSize)
# Option 1 - direct scaling (quick&dirty, reservoir-specific):
#W = W * 0.135
# Option 2 - normalizing and setting spectral radius (correct, slow):
cat('Computing spectral radius...')
rhoW = abs(eigen(W,only.values=TRUE)$values[1])
print('done.')
W = W * 1.25 / rhoW
# allocated memory for the design (collected states) matrix
X = matrix(0,1+inSize+resSize,trainLen-initLen)
# set the corresponding target matrix directly
Yt = matrix(data[(initLen+2):(trainLen+1)],1)
# run the reservoir with the data and collect X
x = rep(0,resSize)
for (t in 1:trainLen){
u = data[t]
x = (1-a)*x + a*tanh( Win %*% rbind(1,u) + W %*% x )
if (t > initLen)
X[,t-initLen] = rbind(1,u,x)
}
# train the output
reg = 1e-8 # regularization coefficient
X_T = t(X)
Wout = Yt %*% X_T %*% solve( X %*% X_T + reg*diag(1+inSize+resSize) )
# run the trained ESN in a generative mode. no need to initialize here,
# because x is initialized with training data and we continue from there.
Y = matrix(0,outSize,testLen)
u = data[trainLen+1]
for (t in 1:testLen){
x = (1-a)*x + a*tanh( Win %*% rbind(1,u) + W %*% x )
y = Wout %*% rbind(1,u,x)
Y[,t] = y
# generative mode:
u = y
## this would be a predictive mode:
#u = data[trainLen+t+1]
}
# compute MSE for the first errorLen time steps
errorLen = 500
mse = ( sum( (data[(trainLen+2):(trainLen+errorLen+1)] - Y[1,1:errorLen])^2 )
/ errorLen )
print( paste( 'MSE = ', mse ) )
# plot some signals
dev.new()
plot( data[(trainLen+1):(trainLen+testLen+1)], type='l', col='green' )
lines( c(Y), col='blue' )
title(main=expression(paste('Target and generated signals ', bold(y)(italic(n)),
' starting at ', italic(n)==0 )))
legend('bottomleft',legend=c('Target signal', 'Free-running predicted signal'),
col=c('green','blue'), lty=1, bty='n' )
dev.new()
matplot( t(X[(1:20),(1:200)]), type='l' )
title(main=expression(paste('Some reservoir activations ', bold(x)(italic(n)))))
dev.new()
barplot( Wout )
title(main=expression(paste('Output weights ', bold(W)^{out})))
诚然这不能回答您关于 R 的问题,我几乎可以肯定您可以自己轻松地实现 ESN(除非您需要更高级/深奥的功能)。
看看Jaeger 对 ESN 的定义:您只需要方程 (1) 和 (2) 用于内部状态和输出,加上方程 (3) 或 (4) 用于学习。实现非常简单,只需要矩阵乘法、范数和伪逆就可以了。
PS 实际上“递归”和“递归”神经网络并不是很不同的东西。术语“递归”通常(但并非总是)指处理图的那些神经网络,而“递归”网络处理序列/时间序列(这是图的一种特殊情况)。“递归”和“递归”网络在其隐藏层中都有循环,因此它们的内部状态是递归定义的。语言混乱的一部分,关键是您可以尝试使用现有的库并根据您的需要调整它们。