トレーディングにおける機械学習:理論、モデル、実践、アルゴトレーディング - ページ 2756

 
Aleksey Nikolayev #:

別の大きな文字列からパターン/シーケンスを検索し、見つかった場合はITINA、そうでない場合はFalseとする関数があります。

図解



Rkで関数を持っているのですが、大きな計算には遅いです、というか、異なるスタイルで書かれた関数がいくつもあります...。

入力データはこのような感じである。

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"

これが標準的なスタイルで書かれた最初のs1 関数で、わかりやすいが面倒だ。

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

よりエレガントなs2

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

どちらも同じことをする。

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

この簡単な関数をrcppで書いてくれませんか?

 
Maxim Dmitrievsky #:
ライブラリにはすぐに使えるツールがいくつかあるので、それほど労力をかけずに何かを出力できると思っていた。

レシェトフが数十ページ前にやったようにね。

(ライブラリーの話ではない)

 
mytarmailS #:

別の大きな文字列からパターン/シーケンスを検索する関数があります。

図解



Rkで関数を持っているのですが、大きな計算には遅い、というか、異なるスタイルで書かれた関数がいくつもあるくらいです......。

入力データはこんな感じです。ちなみに文字列はどちらも任意の長さにできます。

最初のs1 関数は標準的なスタイルで書かれている。

あるいはs2の ようにもっとエレガントなものもある。

どちらも同じことをする

この簡単な関数をrcppで書いてもらえませんか?

私は時間がないし、コーディングやデバッグがあまり好きではないので、それをする準備ができていません。それに、自分で考えた方が役に立つだろう。もし可能なら、技術的な質問にお答えします。

 
Aleksey Nikolayev #:

私は自由な時間がないし、コーディングやデバッグがあまり好きではないので、引き受ける準備ができていない。それに、自分で解決した方が役に立つだろう。もし可能であれば、技術的な質問にお答えします。

助けてくれなくてありがとう)自分で解決しました。)

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

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)


質問があります: pat datの入力変数に、(現在のように)数値ベクトルと文字列ベクトルの両方を受け入れるようにするにはどうすればよいでしょうか?




p.s.この関数は6倍しか速くならないことが判明しました(( 少なくとも100倍は速くなると思っていました((

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

助けてくれてありがとう)自分で解決したんだ。)

Rコード

Rcppコード


質問があります: pat datの入力変数に数値ベクトル(現在のように)と文字列ベクトルの両方を受け入れるようにするにはどうすればよいですか?




p.s.この関数は6倍しか速くならないことが判明しました(( 少なくとも100倍は速くなると思っていました((

このコードはRでコンパイルできる。ほぼ3倍速くなった。

forの代わりにforeachを使い、すべてのカーネルをロードする。

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

Rのコードをコンパイル(compile)することができる。3倍近くスピードアップした。

forの代わりにforeachを使い、すべてのカーネルをロードする。

R 3.4 以降、 すべてのRコードにcmpfun コンパイルが デフォルトで含まれて いる。

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

R 3.4 以降、 すべての R コードにcmpfun コンパイルが デフォルトで含まれて います。

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

この投稿で、パッケージの更新時に、バイトコンパイルと遅延ロードのためのパッケージの準備の行を 見ることができる方法で、 パッケージを常にコンパイルするようになったようだと理解した。

しかし、私はユーザーコードはコンパイルされていないと思います。我々は、ソースによって関数をロードし、私はソースの説明では、ロードされる関数がコンパイルされていることを見なかった

 
MQL5で行列とベクトルを扱う」が掲載されました:

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

この投稿は、私はそれが常にパッケージの更新時に見ることができる方法で、パッケージをコンパイルするようであることを理解し、バイトコンパイルと遅延ロードのためにパッケージを準備行

しかし、私はユーザーコードはコンパイルされていないと信じています。我々は、ソースによって関数をロードし、私はソースの説明で、ロードされる関数がコンパイルされていることを見ていない

うーん、試してみよう。

 
mytarmailS #:

質問があります。pat datの入力変数に、(現在のように)数値ベクトルと文字列ベクトルの両方を受け付けるようにするにはどうすればいいでしょうか?

オーバーロードする最初のアイデアは、同じ名前で異なる引数を持つ別の関数を書くことです。Rcppでこれをやったことがないので、うまくいくかどうかわからない。おそらくCのコードを別のファイルにして、cppFunction()の代わりにsourceCpp()を使うことになるだろう。

理由: