2017-09-05 1 views
2

Ich bin mir bewusst, den vorherigen Post darüber zu fragen, aber es gab keine Antwort, nur der Vorschlag, Ihre eigenen Funktionen zu schreiben. Ich habe das gleiche Problem - die Funktionen int2bin und bin2int im Rnn-Paket in R scheinen falsche Werte zurückzugeben. Das Problem scheint in bin2int zu liegen. Ich würde mich freuen zu überprüfen, dass dies ein Fehler ist.bin2int Funktion in R-Paket rnn scheint einen Fehler zu haben

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

Dies scheint etwas zu sein, das dem Paketbetreuer besser berichtet wird als auf SO gefragt. –

+0

Der Autor des Pakets bat darum, dass hier Fragen gestellt werden. – eafpres

Antwort

1

Die zugrunde liegende Funktion von int2bin ist i2b die wie folgt definiert ist:

function (integer, length = 8) 
{ 
    as.numeric(intToBits(integer))[1:length] 
} 

die dann in int2bin gewickelt

function (integer, length = 8) 
{ 
    t(sapply(integer, i2b, length = length)) 
} 

was falsch ist (glaube ich), weil es die zurück Binärzahl rückwärts.

In Ihrem Beispiel 1 als 100 Billionen zurückgegeben, wenn es als 000000000000001.

Sie beheben können zurückgegeben werden soll, dass durch die intToBits() Liste rückwärts durch Änderung der Rückkehr [1: Länge] bis [Länge: 1]

function (integer, length = 8) 
{ 
    as.numeric(intToBits(integer))[length:1] 
} 

Allerdings gibt es auch ein Problem mit bin2int, die Weitergabe der richtigen binären Eingabe gibt immer noch Unsinn.

Die b2i Funktion implementiert, wie:

function(binary){ 
    packBits(as.raw(c(rep(0, 32 - length(binary)), binary)), "integer") 
} 

Passing Probe-Eingänge, ich verstehe nicht, was diese Funktion tun - schon gar nicht binäre Umwandlung in Integer.

eine Funktion Borrowing binär konvertiert von @Julius in Dezimalzahlen:

BinToDec <- function(x){ 
    sum(2^(which(rev(unlist(strsplit(as.character(x), "")) == 1))-1)) } 

Dies ist eine einfache Umwandlung von base2. Teilt jede Binärziffer auf, gibt die Indizes mit == 1 zurück, subtrahiere 1 von jedem Index (weil R von 1, nicht null, indexiert), erhöhe dann 2 zur Potenz jedes zuvor zurückgegebenen Indexes und Summe. Zum Beispiel 101 (binär) = 2^2 + 2^0 = 5

Und dann (man beachte dies eine korrigierte X21-Struktur verwendet, die Standard-rechts-nach-links-binärer Schreibweise folgt)

X22 <- apply(X21,1,BinToDec) 

Returns 1: 154

Kurz gesagt, ja, ich stimme zu, dass rnn:bin2int und rnn::int2bin scheinen falsch/gebrochen zu sein.

Auch anstatt zu versuchen, die rnn::int2bin Funktion zu beheben, würde ich R.utils::intToBin

vorschlagen und einfach verwenden:

require(R.utils) 

X99 <- sapply(X2, intToBin) 
+1

danke, ich möchte diese Funktionen entfernen, hoffentlich mit Ihrer Antwort jetzt, die möglich sein wird, auf dem ersten Teil, i2b gibt das erste Bit zuerst, das zweite Bit Sekunde usw., was bedeutet R druckt es rechts nach links, die macht es verwirrend zu lesen –

+0

Bastiaan (einer der Schöpfer) hat eine aktualisierte Funktion auf dem Github Repo; Ich versuche das auch. Danke für die ausführliche Überprüfung. – eafpres

+0

packBits (as.raw (c (binär, rep (0, 32-Länge (binär)))), 'integer') – eafpres

0

ich eine Beispielimplementierung mit rnn hier: https://www.r-bloggers.com/plain-vanilla-recurrent-neural-networks-in-r-waves-prediction/ Diese Implementierung funktioniert .Ich fand den Schlüssel, um die Transposition zu sein, bevor ich trainr benutze:

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

Aktualisierung meines Codes Ich hatte Erfolg in der Verwendung des Pakets. Daher haben die Probleme mit der Verwendung von Binärdateien keine Auswirkungen auf die Verwendung des Pakets und waren wahrscheinlich ein Ablenkungsmanöver, das von mir ausgelöst wurde, als ich suchte, warum mein Code keine erwarteten Ergebnisse hervorbrachte.

Verwandte Themen