我知道之前的帖子询问了这个问题,但没有答案,只有建议编写自己的功能。我有同样的问题 - R中的rnn包中的函数int2bin和bin2int似乎返回不正确的值。问题似乎在bin2int中。我希望验证这是一个错误。
library(rnn)
X2 <- 1:154
X21 <- int2bin(X2, length = 15)
> head(X2)
[1] 1 2 3 4 5 6
# X21 (data after int2bin(X2, length = 15)) num [1:154, 1:15] 1 0 1 0 1 1 1...
>head(X21)
[,1][,2][,3][,4][,5][,6][,7][,8][,9][,10][,11][,12][,13][,14][,15]
[1,] 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[2,] 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
[3,] 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
[4,] 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
[5,] 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
[6,] 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
# so far so good
>X22 <- bin2int(X21)
# X22 (data after conversion back to integer) X22 int [1:154] 131072 262144...
> head(X22)
[1] 131072 262144 393216 524288 655360 786432
# should be 1 2 3 4 5 6
答案 0 :(得分:1)
int2bin
的基本功能是i2b
,定义为:
function (integer, length = 8)
{
as.numeric(intToBits(integer))[1:length]
}
然后将其包含在int2bin
function (integer, length = 8)
{
t(sapply(integer, i2b, length = length))
}
哪个错误(我认为)因为它向后返回二进制数。
在您的示例中,1返回为100000000000000,应该返回为000000000000001。
您可以通过将[1:length]更改为[length:1]来向后返回intToBits()
列表来解决此问题
function (integer, length = 8)
{
as.numeric(intToBits(integer))[length:1]
}
但是,bin2int
也存在问题,传递正确的二进制输入仍然输出无意义。
b2i
函数实现为:
function(binary){
packBits(as.raw(c(rep(0, 32 - length(binary)), binary)), "integer")
}
传递样本输入,我不明白这个函数在做什么 - 当然不会将二进制转换为整数。
借用函数将二进制从@Julius转换为十进制:
BinToDec <- function(x){
sum(2^(which(rev(unlist(strsplit(as.character(x), "")) == 1))-1)) }
这是从base2进行的简单转换。拆分每个二进制数字,返回索引,其中== 1,从每个索引中减去1(因为R索引从1开始,而不是0),然后将2加到先前返回的每个索引的幂和sum。例如101(二进制)= 2 ^ 2 + 2 ^ 0 = 5
然后(注意这是使用符合标准的从右到左的二进制表示法的校正X21结构)
X22 <- apply(X21,1,BinToDec)
返回1:154
所以简而言之,是的,我同意rnn:bin2int
和rnn::int2bin
似乎是错误的/破坏了。
此外,我建议rnn::int2bin
R.utils::intToBin
功能。
只需使用:
require(R.utils)
X99 <- sapply(X2, intToBin)
答案 1 :(得分:0)
我在这里找到了一个使用rnn的示例实现: https://www.r-bloggers.com/plain-vanilla-recurrent-neural-networks-in-r-waves-prediction/ 这种实现有效。在使用trainr之前,我发现关键是转置:
# Create sequences
t <- seq(0.005,2,by=0.005)
x <- sin(t*w) + rnorm(200, 0, 0.25)
y <- cos(t*w)
# Samples of 20 time series
X <- matrix(x, nrow = 40)
Y <- matrix(y, nrow = 40)
# Standardize in the interval 0 - 1
X <- (X - min(X)) / (max(X) - min(X))
Y <- (Y - min(Y)) / (max(Y) - min(Y))
# Transpose
X <- t(X)
Y <- t(Y)
更新我的代码我成功使用了该软件包。因此,使用二进制文件的问题(如果有的话)不会影响软件包的使用,并且可能是我提出的一个红色鲱鱼,因为我正在搜索为什么我的代码没有产生预期的结果。