L'apprentissage automatique dans la négociation : théorie, modèles, pratique et algo-trading - page 2756

 
Aleksey Nikolayev #:

J'ai une fonction qui recherche un motif/séquence dans une autre grande chaîne, si elle est trouvée alors ITINA sinon Faux.

illustration



J'ai une fonction dans Rk mais elle est lente pour les gros calculs, ou plutôt il y a même plusieurs fonctions écrites dans différents styles....

Voici à quoi ressemblent les données d'entrée, d'ailleurs les deux chaînes peuvent être de longueur arbitraire.

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"

Voici la première fonction s1 écrite dans le style standard, claire mais lourde.

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

ou la fonction s2, plus élégante.

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

Les deux font la même chose.

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

J'ai une question/demande - pouvez-vous écrire cette fonction simple en rcpp pour moi ?

 
Maxim Dmitrievsky #:
Je pensais qu'il y avait des outils prêts à l'emploi dans la bibliothèque pour que vous puissiez produire quelque chose sans trop d'efforts.

comme l'a fait Reshetov il y a quelques dizaines de pages.

(et ce n'est pas à propos de la bibliothèque)

 
mytarmailS #:

J'ai une fonction qui recherche un motif/séquence dans une autre grande chaîne, si elle est trouvée alors ITINA sinon False.

illustration



J'ai une fonction en Rk mais elle est lente pour les gros calculs, ou plutôt il y a même plusieurs fonctions écrites dans des styles différents....

Voici à quoi ressemblent les données d'entrée. D'ailleurs, les deux chaînes peuvent être de longueur arbitraire.

Voici la première fonction s1 écrite dans le style standard, clair mais lourd.

ou quelque chose de plus élégant comme s2.

les deux font la même chose

J'ai une question/demande - pouvez-vous écrire cette fonction simple en rcpp pour moi ?

Je ne suis pas prêt à le faire, parce que je n'ai pas de temps libre, et je n'aime pas beaucoup coder et déboguer. Et il sera plus utile pour vous de trouver la solution vous-même. Je répondrai à quelques questions techniques spécifiques si je le peux.

 
Aleksey Nikolayev #:

Je ne suis pas prêt à m'en charger, car je n'ai pas de temps libre et je n'aime pas beaucoup coder et déboguer. Et il vous sera plus utile de vous débrouiller tout seul. Je répondrai à certaines questions techniques spécifiques si je le peux.

merci de ne pas m'aider) j'ai trouvé tout seul et c'est très bien )

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

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


J'ai une question : comment faire pour que les variables d'entrée de pat dat acceptent à la fois les vecteurs numériques (comme maintenant) et les vecteurs de type chaîne de caractères ?




p.s. La fonction s'est avérée être seulement 6 fois plus rapide (( Je pensais qu'elle serait au moins 100 fois plus rapide ((((

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

merci de ne pas m'aider) j'ai trouvé tout seul et c'est très bien )

Code R

Code Rcpp


Il y a une question : comment faire en sorte que les variables d'entrée de pat dat acceptent à la fois les vecteurs numériques (comme maintenant) et les vecteurs de type chaîne de caractères ?




p.s. La fonction s'est avérée être seulement 6 fois plus rapide (( Je pensais qu'elle serait au moins 100 fois plus rapide ((((

Vous pouvez compiler le code avec R (compile). J'ai presque triplé la vitesse du code.

Au lieu de for, utilisez foreach, en chargeant tous les noyaux.

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

Vous pouvez compiler le code R (compile). J'ai presque triplé la vitesse du code.

Utilisez foreach au lieu de for, en chargeant tous les noyaux.

Depuis R 3.4, la compilation cmpfun est incluse par défaut dans tout le code R.

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

depuis R 3.4 la compilation cmpfun est incluse par défaut dans tout le code R

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

Je comprends que maintenant il semble toujours compiler les paquets, ce qui d 'ailleurs peut être vu lors de la mise à jour des paquets , de la ligne byte-compile et de la préparation des paquets pour le lazy loading.

Mais je pense que le code utilisateur n'est PAS compilé. Nous chargeons des fonctions par source et je n'ai pas vu dans la description de la source que la fonction à charger est compilée.

 
L'articleTravailler avec des matrices et des vecteurs dans MQL5 a été publié:

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

Je comprends que maintenant il semble toujours compiler les paquets, ce qui d 'ailleurs peut être vu lors de la mise à jour des paquets , la ligne byte-compile et prépare le paquet pour le chargement paresseux.

Mais je crois que le code utilisateur n'est PAS compilé. Nous chargeons des fonctions par source et je n'ai pas vu dans la description de la source que la fonction à charger est compilée.

hmm, je vais essayer

 
mytarmailS #:

Une question se pose : comment faire en sorte que les variables d'entrée de pat dat acceptent à la fois les vecteurs numériques (comme c'est le cas actuellement) et les vecteurs de type chaîne de caractères ?

La première idée pour surcharger est d'écrire une autre fonction avec le même nom mais avec des arguments différents. Je n'ai jamais fait cela en Rcpp, donc je ne sais pas si cela fonctionnera. Je vais probablement devoir faire le code C dans un fichier séparé et utiliser sourceCpp() au lieu de cppFunction().