2017-09-05 41 views
2

我知道以前的帖子詢問過這個問題,但沒有答案,只有建議編寫自己的函數。我有同樣的問題 - R中的rnn包中的函數int2bin和bin2int似乎返回不正確的值。問題似乎在bin2int中。我很感謝驗證這是一個錯誤。R軟件包中的bin2int函數rnn似乎有一個錯誤

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 
+1

這看起來像是向包維護者報告的更好,而不是在SO上詢問。 –

+0

包裹的作者要求在這裏提問。 – eafpres

回答

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返回爲百兆,當它應該返回爲000000000000001.

可以更正通過改變向後返回intToBits()列表[1:長度]至[長度:1]

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加到每個索引之前返回的和的和。對於實施例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

謝謝,我想刪除這些函數,希望你現在可以做出回答,在第一部分中,i2b首先返回第一位,第二位返回第二位等等,這意味着R從右向左返回,這令人困惑的是讀取 –

+0

Bastiaan(創作者之一)在github回購上有更新的功能;我也在嘗試。感謝您的詳細審查。 – eafpres

+0

packBits(as.raw(c(binary,rep(0,32-length(binary)))),'integer') – eafpres

0

我發現了一個示例實現使用RNN這裏: https://www.r-bloggers.com/plain-vanilla-recurrent-neural-networks-in-r-waves-prediction/ 此實現作品。在使用訓練器之前,我發現鑰匙是轉置:

# 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) 

更新我的代碼我已成功使用該軟件包。因此,使用二進制(如果有的話)的問題不會影響包的使用,並且可能是我在尋找爲什麼我的代碼沒有產生預期結果時提出的一種紅鯡魚。

相關問題