L'apprendimento automatico nel trading: teoria, modelli, pratica e algo-trading - pagina 2756

 
Aleksey Nikolayev #:

Ho una funzione che cerca un modello/sequenza in un'altra stringa di grandi dimensioni, se viene trovata allora ITINA altrimenti False

illustrazione



Ho una funzione in Rk, ma è lenta per i calcoli di grandi dimensioni, o meglio ci sono addirittura diverse funzioni scritte in stili diversi....

Ecco come appaiono i dati di input, tra l'altro entrambe le stringhe possono essere di lunghezza arbitraria.

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"

Ecco la prima funzione s1 scritta nello stile standard, chiaro ma macchinoso.

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

o la più elegante s2.

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

Entrambe fanno la stessa cosa.

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

Ho una domanda/richiesta: potete scrivere questa semplice funzione in rcpp per me?

 
Maxim Dmitrievsky #:
Pensavo che nella libreria ci fossero alcuni strumenti pronti all'uso per poter produrre qualcosa senza troppi sforzi.

come ha fatto Reshetov qualche decina di pagine fa.

(e non si tratta della libreria)

 
mytarmailS #:

Ho una funzione che cerca un modello/sequenza in un'altra stringa di grandi dimensioni, se viene trovata allora ITINA altrimenti False

illustrazione



Ho una funzione in Rk ma è lenta per i calcoli di grandi dimensioni, anzi ci sono addirittura diverse funzioni scritte in stili diversi....

Ecco come appaiono i dati di input, tra l'altro entrambe le stringhe possono essere di lunghezza arbitraria.

Ecco la prima funzione s1 scritta nello stile standard, chiara ma macchinosa.

o qualcosa di più elegante come s2.

Entrambe fanno la stessa cosa

Ho una domanda/richiesta: potete scrivere questa semplice funzione in rcpp per me?

Non sono pronto a farlo, perché non ho tempo libero e non mi piace molto la codifica e il debug. E sarà più utile per voi capirlo da soli. Se posso, risponderò ad alcune domande tecniche specifiche.

 
Aleksey Nikolayev #:

Non sono pronto a occuparmene, perché non ho tempo libero e non mi piace molto la codifica e il debug. Sarà più utile per voi capire da soli. Se posso, risponderò ad alcune domande tecniche specifiche.

grazie per non avermi aiutato) L'ho capito da solo ed è fantastico )

Codice R

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

Codice Rcpp

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)


Ho una domanda: come fare in modo che le variabili di input di pat dat accettino sia vettori numerici (come ora) che vettori di stringhe?




p.s. La funzione si è rivelata solo 6 volte più veloce (( pensavo che sarebbe stata almeno 100 volte più veloce ((((

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

grazie per non avermi aiutato) l'ho capito da solo ed è fantastico)

Codice R

Codice Rcpp


C'è una domanda: come fare in modo che le variabili di input di pat dat accettino sia vettori numerici (come ora) che vettori di stringhe?




p.s. La funzione si è rivelata solo 6 volte più veloce (( pensavo che sarebbe stata almeno 100 volte più veloce ((((

È possibile compilare il codice con R (compile). Ho ottenuto una velocizzazione del codice di quasi 3 volte.

Invece di for, usare foreach, caricando tutti i kernel.

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

È possibile compilare il codice R (compile). Ho ottenuto una velocizzazione del codice di quasi 3 volte.

Usare foreach invece di for, per caricare tutti i kernel.

da R 3.4 la compilazione di cmpfun è inclusa di default in tutto il codice R

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

da R 3.4 la compilazione di cmpfun è inclusa di default in tutto il codice R

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

Da questo post capisco che ora sembra compilare sempre i pacchetti, che tra l'altro possono essere visti quando si aggiornano i pacchetti , la linea byte-compile e preparare il pacchetto per il caricamento pigro.

Ma credo che il codice utente NON venga compilato. Carichiamo le funzioni per fonte e non ho visto nella descrizione della fonte che la funzione da caricare è compilata.

 
È stato pubblicato l'articoloLavorare con matrici e vettori in MQL5:

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

Questo post ho capito che ora sembra sempre compilare i pacchetti, che tra l'altro può essere visto quando l'aggiornamento dei pacchetti , linea byte-compile e preparare il pacchetto per il caricamento pigro.

Ma credo che il codice utente NON venga compilato. Noi carichiamo le funzioni per fonte e non ho visto nella descrizione della fonte che la funzione da caricare è compilata.

hmm, ci proverò

 
mytarmailS #:

C'è una domanda: come fare in modo che le variabili di input di pat dat accettino sia vettori numerici (come ora) che vettori di stringhe?

La prima idea di sovraccarico è quella di scrivere un'altra funzione con lo stesso nome ma con argomenti diversi. Non l'ho mai fatto in Rcpp, quindi non so se funzionerà. Probabilmente dovrò creare il codice C in un file separato e usare sourceCpp() invece di cppFunction().