R包中的bin2int函数rnn似乎有一个bug

时间:2017-09-05 20:23:02

标签: r

我知道之前的帖子询问了这个问题,但没有答案,只有建议编写自己的功能。我有同样的问题 - 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

2 个答案:

答案 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:bin2intrnn::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)

更新我的代码我成功使用了该软件包。因此,使用二进制文件的问题(如果有的话)不会影响软件包的使用,并且可能是我提出的一个红色鲱鱼,因为我正在搜索为什么我的代码没有产生预期的结果。