【发布时间】:2020-06-02 13:52:28
【问题描述】:
我正在尝试在 Keras 中创建一个 LSTM,但我无法重塑输入数据。
让我们考虑 3 个特征的 25 个观察结果:
x <- 1:25
y <- seq(100, 2500, by = 100)
z <- seq(1000, 25000, by = 1000)
my.matrix <- data.matrix(data.frame(x, y, z))
str(my.matrix)
这给出了:
> str(my.matrix)
num [1:25, 1:3] 1 2 3 4 5 6 7 8 9 10 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:3] "x" "y" "z"
还有:
> my.matrix
x y z
[1,] 1 100 1000
[2,] 2 200 2000
[3,] 3 300 3000
[4,] 4 400 4000
[5,] 5 500 5000
[6,] 6 600 6000
[7,] 7 700 7000
[8,] 8 800 8000
[9,] 9 900 9000
[10,] 10 1000 10000
[11,] 11 1100 11000
[12,] 12 1200 12000
[13,] 13 1300 13000
[14,] 14 1400 14000
[15,] 15 1500 15000
[16,] 16 1600 16000
[17,] 17 1700 17000
[18,] 18 1800 18000
[19,] 19 1900 19000
[20,] 20 2000 20000
[21,] 21 2100 21000
[22,] 22 2200 22000
[23,] 23 2300 23000
[24,] 24 2400 24000
[25,] 25 2500 25000
现在我需要创建一个 3D 矩阵,其尺寸为:[nb.observations, window.width, features]。在我的例子中: [25, 5, 3] 例如,其中
window.width=5 是观察滚动窗口的宽度。
编辑:实际上,由于滚动窗口宽度(x 特征的最后一个样本将是 [例如 21、22、23、24、25])。
我尝试做的是:
window.width <- 5
tmp <- NULL
for(i in 1:(dim(my.matrix)[1] - window.width + 1)) {
s <- i - 1 + window.width
tmp <- rbind(tmp, my.matrix[i:s,])
}
我们有:
> head(tmp, 10)
x y z
[1,] 1 100 1000
[2,] 2 200 2000
[3,] 3 300 3000
[4,] 4 400 4000
[5,] 5 500 5000
[6,] 2 200 2000
[7,] 3 300 3000
[8,] 4 400 4000
[9,] 5 500 5000
[10,] 6 600 6000
这正是我想要的。如果我们查看x 特征,则有从 1 到 5 的第一个窗口,然后是从 2 到 6 的第二个窗口,依此类推。所有特征都相同。
现在,我需要重塑 tmp 矩阵:
result <- array(tmp, dim=c(dim(my.matrix)[1] - window.width + 1, window.width, dim(my.matrix)[2]))
但这不起作用:
> result[1, ,1]
[1] 1 6 11 16 21
我期待:
> result[1, ,1]
[1] 1 2 3 4 5
> result[2, ,1]
[1] 2 3 4 5 6
我也尝试使用 lag 函数来替换 for 循环,但它也不起作用:
result <- array(data = lag(my.matrix, window.width)[-(1:window.width), ], dim = c(dim(my.matrix)[1] - window.width, window.width, 3))
> result[1, ,1]
[1] 1 100 1000 1 100
1) 我做错了什么,如何获得预期的结果?
2) 此外,for 循环似乎不能很好地扩展。它做了我想做的事,但是有了更多的数据,它变得非常慢(我尝试了 150,000 次观察和 23 个特征)。会有更快的替代方案吗?
编辑:实际上,for 循环几乎可以使用
result <- array(tmp, dim=c(5, 21, 3))
矩阵值是正确的,但是维度都混淆了......
> result
, , 1
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21]
[1,] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
[2,] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
[3,] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
[4,] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
[5,] 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
, , 2
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21]
[1,] 100 200 300 400 500 600 700 800 900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 2100
[2,] 200 300 400 500 600 700 800 900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 2100 2200
[3,] 300 400 500 600 700 800 900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 2100 2200 2300
[4,] 400 500 600 700 800 900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 2100 2200 2300 2400
[5,] 500 600 700 800 900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 2100 2200 2300 2400 2500
, , 3
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21]
[1,] 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 11000 12000 13000 14000 15000 16000 17000 18000 19000 20000 21000
[2,] 2000 3000 4000 5000 6000 7000 8000 9000 10000 11000 12000 13000 14000 15000 16000 17000 18000 19000 20000 21000 22000
[3,] 3000 4000 5000 6000 7000 8000 9000 10000 11000 12000 13000 14000 15000 16000 17000 18000 19000 20000 21000 22000 23000
[4,] 4000 5000 6000 7000 8000 9000 10000 11000 12000 13000 14000 15000 16000 17000 18000 19000 20000 21000 22000 23000 24000
[5,] 5000 6000 7000 8000 9000 10000 11000 12000 13000 14000 15000 16000 17000 18000 19000 20000 21000 22000 23000 24000 25000
如何交换尺寸?
【问题讨论】: