Maschinelles Lernen im Handel: Theorie, Modelle, Praxis und Algo-Trading - Seite 2756

 
Aleksey Nikolayev #:

Ich habe eine Funktion, die nach einem Muster/einer Sequenz in einer anderen großen Zeichenfolge sucht, wenn sie gefunden wird, dann ITINA, sonst False

Abbildung



Ich habe eine Funktion in Rk, aber sie ist langsam für große Berechnungen, oder besser gesagt, es gibt sogar mehrere Funktionen in verschiedenen Stilen geschrieben....

So sehen die Eingabedaten aus, übrigens können beide Zeichenketten beliebig lang sein.

dat <- sample(letters[1:20],size = 30,replace = T)
pat <- c('a',"c","g")

dat
 [1] "h" "c" "q" "a" "s" "a" "d" "b" "c" "n" "a" "t" "e" "q" "s" "k" "j" "t" "l" "j" "n" "t" "r" "m" "h"
[26] "b" "o" "e" "g" "h"
pat
[1] "a" "c" "g"

Hier ist die erste s1-Funktion im Standardstil geschrieben, klar, aber umständlich.

s1 <- function(pat , dat){  
  lv <- rep(F,length(pat))
  k <- 1     
  for(i in 1:length(dat)){        
    if(dat[i] == pat[k]) 
    {
      lv[k] <- TRUE
      k <- k+1 
    }       
    if(k==length(pat)+1) break
  }
  return(  all(lv)   )
}

oder die elegantere s2.

s2 <- function(pat , dat) grepl(paste(pat, collapse=".*"), paste(dat, collapse=""))

beide machen das Gleiche.

s1(pat = pat,dat = dat)
[1] TRUE
s2(pat = pat,dat = dat)
[1] TRUE

Ich habe eine Frage/Bitte - können Sie diese einfache Funktion in rcpp für mich schreiben?

 
Maxim Dmitrievsky #:
Ich dachte, es gäbe in der Bibliothek einige fertige Werkzeuge, mit denen man ohne großen Aufwand etwas ausgeben kann

wie es Reshetov vor ein paar Dutzend Seiten getan hat.

(und es geht nicht um die Bibliothek)

 
mytarmailS #:

Ich habe eine Funktion, die für ein Muster/Sequenz in einem anderen großen String sucht, wenn gefunden dann ITINA sonst False

Abbildung



Ich habe eine Funktion in Rk, aber es ist langsam für große Berechnungen, oder vielmehr gibt es sogar mehrere Funktionen in verschiedenen Stilen geschrieben....

So sehen die Eingabedaten aus, die beiden Strings können übrigens beliebig lang sein.

Hier ist die erste s1-Funktion im Standardstil geschrieben, übersichtlich aber umständlich.

oder etwas eleganteres wie s2.

beide tun das Gleiche

Ich habe eine Frage/Bitte - können Sie diese einfache Funktion in rcpp für mich schreiben?

Ich bin nicht bereit, es zu tun, weil ich keine freie Zeit habe, und ich mag Programmieren und Debuggen nicht besonders. Und es wird für Sie nützlicher sein, wenn Sie es selbst herausfinden. Ich werde einige spezifische technische Fragen beantworten, wenn ich kann.

 
Aleksey Nikolayev #:

Ich bin nicht bereit, es zu übernehmen, da ich keine Zeit habe und das Programmieren und Debuggen nicht besonders mag. Und es wird für Sie nützlicher sein, wenn Sie es selbst herausfinden. Ich werde einige spezifische technische Fragen beantworten, wenn ich kann.

Danke, dass Sie mir nicht geholfen haben. Ich habe es selbst herausgefunden, und das ist großartig.)

R-Code

yes_seq <- function(pat , dat){  
  lv <- rep(F,length(pat))
  k <- 1     
  for(i in 1:length(dat)){        
    if(dat[i] == pat[k]){
      lv[k] <- TRUE
      k <- k+1 
    }       
    if(k==length(pat)+1) break
  }
  return(  all(lv)   )
}

Rcpp-Code

src <-
  "bool yes_seq_cpp(NumericVector pat, NumericVector dat){

    LogicalVector lv (pat.length() ,false);
    int k=0;

    for(int i=0; i<dat.length(); ++i){
    
      if(dat[i]==pat[k]){
            lv[k] = true;
            k = k+1; 
          }
if(k==pat.length())  break;
}
    
return  is_true(all(lv == true));
}
"
Rcpp::cppFunction(src)


Ich habe eine Frage: wie kann man erreichen, dass die pat dat Eingabevariablen sowohl numerische Vektoren (wie jetzt) als auch String-Vektoren akzeptieren?




p.s. Die Funktion hat sich als nur 6 mal schneller herausgestellt (( Ich dachte, sie wäre mindestens 100 mal schneller ((((

microbenchmark::microbenchmark( yes_seq(pat,dat), yes_seq_cpp(pat,dat))

Unit: microseconds
                  expr    min     lq     mean median      uq     max neval cld
     yes_seq(pat, dat) 42.193 43.333 44.78712 43.903 45.0435 106.052   100   b
 yes_seq_cpp(pat, dat)  5.701  5.987  6.61993  6.272  6.8425  22.807   100  a 
 
mytarmailS #:

Danke, dass Sie mir nicht geholfen haben. Ich habe es selbst herausgefunden, und das ist großartig.)

R-Code

Rcpp-Code


Es gibt eine Frage: Wie kann man die Eingabevariablen von pat dat so gestalten, dass sie sowohl numerische Vektoren (wie jetzt) als auch String-Vektoren akzeptieren?




p.s. Die Funktion erwies sich als nur 6 mal schneller (( Ich dachte, sie wäre mindestens 100 mal schneller ((((

Sie können den Code mit R kompilieren (compile). Ich habe eine fast 3-fache Beschleunigung des Codes erreicht.

Anstelle von for verwenden Sie foreach, um alle Kerne zu laden.

 
СанСаныч Фоменко #:

Sie können R-Code kompilieren (compile). Ich habe fast 3-fache Beschleunigung des Codes.

Verwenden Sie foreach anstelle von for, um alle Kernel zu laden.

seit R 3.4 ist die cmpfun-Kompilierung standardmäßig in jedem R-Code enthalten

https://stackoverflow.com/questions/41502721/could-someone-explain-what-compiling-in-r-is-and-why-it-would-speed-up-this-c
 
mytarmailS #:

seit R 3.4 ist die cmpfun-Kompilierung standardmäßig in jedem R-Code enthalten

https:// stackoverflow.com/questions/41502721/could-someone-explain-what-compiling-in-r-is-and-why-it-would-speed-up-this-c

Dieser Beitrag Ich verstehe, dass jetzt scheint es immer kompilieren Pakete, die durch die Art und Weise gesehen werden kann, wenn Pakete aktualisieren , Zeile Byte-Kompilierung und bereiten Paket für Lazy Loading.

Aber ich denke, dass Benutzer-Code NICHT kompiliert wird. Wir laden Funktionen durch die Quelle und ich habe nicht in der Beschreibung der Quelle zu sehen, dass die Funktion geladen werden kompiliert ist

 
Der ArtikelArbeiten mit Matrizen und Vektoren in MQL5 wurde veröffentlicht:

 
СанСаныч Фоменко #:

Dieser Beitrag Ich verstehe, dass jetzt scheint es immer kompilieren Pakete, die durch die Art und Weise gesehen werden kann, wenn die Aktualisierung von Paketen , Zeile Byte-kompilieren und bereiten Paket für Lazy Loading.

Aber ich glaube, dass Benutzer-Code NICHT kompiliert wird. Wir laden Funktionen durch die Quelle und ich habe nicht in der Beschreibung der Quelle zu sehen, dass die Funktion geladen werden kompiliert ist

hmm, ich werde es versuchen

 
mytarmailS #:

Es gibt eine Frage: Wie kann man erreichen, dass die Eingabevariablen von pat dat sowohl numerische Vektoren (wie jetzt) als auch String-Vektoren akzeptieren?

Die erste Idee zum Überladen ist, eine andere Funktion mit demselben Namen, aber mit anderen Argumenten zu schreiben. Ich habe das noch nie in Rcpp gemacht, also weiß ich nicht, ob es funktionieren wird. Wahrscheinlich muss ich den C-Code in einer separaten Datei erstellen und sourceCpp() anstelle von cppFunction() verwenden.

Grund der Beschwerde: