Aprendizado de máquina no trading: teoria, prática, negociação e não só - página 2756

 
Aleksey Nikolayev #:

Tenho uma função que procura um padrão/sequência em outra cadeia de caracteres grande; se for encontrado, então ITINA; caso contrário, False

ilustração



Tenho uma função no Rk, mas ela é lenta para cálculos grandes, ou melhor, há várias funções escritas em estilos diferentes....

Esta é a aparência dos dados de entrada; a propósito, as duas cadeias de caracteres podem ter um comprimento arbitrário.

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"

Aqui está a primeira função s1 escrita no estilo padrão, clara, mas incômoda.

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 a mais elegante s2.

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

Ambas fazem a mesma coisa.

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

Tenho uma pergunta/solicitação: você pode escrever essa função simples em rcpp para mim?

 
Maxim Dmitrievsky #:
Achei que havia algumas ferramentas prontas para uso na biblioteca para que você pudesse produzir algo sem muito esforço

como Reshetov fez há algumas dezenas de páginas.

(e não se trata da biblioteca)

 
mytarmailS #:

Tenho uma função que procura um padrão/sequência em outra cadeia de caracteres grande; se for encontrado, então ITINA; caso contrário, False

ilustração



Tenho uma função no Rk, mas ela é lenta para cálculos grandes, ou melhor, há várias funções escritas em estilos diferentes....

É assim que os dados de entrada se parecem, a propósito, ambas as cadeias de caracteres podem ter um comprimento arbitrário.

Aqui está a primeira função s1 escrita no estilo padrão, clara, mas incômoda.

ou algo mais elegante como s2.

Ambas fazem a mesma coisa

Tenho uma pergunta/solicitação: você pode escrever essa função simples em rcpp para mim?

Não estou pronto para fazer isso, pois não tenho tempo livre e não gosto muito de codificação e depuração. E será mais útil para você descobrir isso sozinho. Se possível, responderei a algumas perguntas técnicas específicas.

 
Aleksey Nikolayev #:

Não estou pronto para assumi-lo, pois não tenho tempo livre e não gosto muito de codificação e depuração. E será mais útil para você descobrir por si mesmo. Se possível, responderei a algumas perguntas técnicas específicas.

Obrigado por não me ajudar) Eu mesmo descobri e isso é ótimo)

Código 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)   )
}

Código 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)


Tenho uma pergunta: como fazer com que as variáveis de entrada do pat dat aceitem vetores numéricos (como agora) e vetores de string?




p.s. A função acabou sendo apenas 6 vezes mais rápida (( Eu pensei que seria pelo menos 100 vezes mais rápida ((((

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

obrigado por não ajudar) descobri sozinho e isso é ótimo )

Código R

Código Rcpp


Há uma pergunta: como fazer com que as variáveis de entrada do pat dat aceitem tanto vetores numéricos (como agora) quanto vetores de strings?




p.s. A função acabou sendo apenas 6 vezes mais rápida (( Eu pensei que seria pelo menos 100 vezes mais rápida ((((

Você pode compilar o código com o R (compile). Consegui quase 3 vezes mais velocidade no código.

Em vez de for, use foreach, carregando todos os kernels.

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

Você pode compilar o código R (compile). Obtive uma velocidade quase três vezes maior do que a do código.

Use foreach em vez de for, carregando todos os kernels.

Desde o R 3.4, a compilação cmpfun está incluída por padrão em todo o código R

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

Desde o R 3.4, a compilação cmpfun é incluída por padrão em todos os códigos do R

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

Nesta postagem, entendo que agora parece que os pacotes são sempre compilados, o que , a propósito, pode ser visto ao atualizar pacotes , compilar bytes de linha e preparar pacotes para carregamento lento.

Mas acho que o código do usuário NÃO é compilado. Carregamos funções pelo código-fonte e não vi na descrição do código-fonte que a função a ser carregada é compilada

 
O artigoTrabalhando com matrizes e vetores em MQL5 foi publicado:

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

Esta postagem me fez entender que agora parece que ele sempre compila pacotes, o que , a propósito, pode ser visto ao atualizar pacotes , compilar bytes de linha e preparar pacotes para carregamento lento.

Mas acredito que o código do usuário NÃO é compilado. Nós carregamos funções pelo código-fonte e não vi na descrição do código-fonte que a função a ser carregada é compilada

Vou tentar

 
mytarmailS #:

Há uma pergunta: como fazer com que as variáveis de entrada do pat dat aceitem vetores numéricos (como agora) e vetores de strings?

A primeira ideia para sobrecarregar é escrever outra função com o mesmo nome, mas com argumentos diferentes. Nunca fiz isso no Rcpp, portanto, não sei se funcionará. Provavelmente terei de criar o código C em um arquivo separado e usar sourceCpp() em vez de cppFunction().