文字列の状態を分析するための R での HMM 実装を探していましたが、HMM ライブラリの実行が遅いようで、RHmm ライブラリを使用しています。
私のデータは 1953138 個のシンボル (U、D、N) の文字列です
これは私のデータのサンプルです:
string <- sample(c("D","U","N"),1953138,replace=T)
フィッティング HMM
HMM <- HMMFit(string,dis="DISCRETE",nStates=3)$HMM
viterbi を実行すると、ここでエラーが発生します
viterbi_results <- viterbi(HMM,string)
#Error: protect(): protection stack overflow
ただし、文字列 viterbi() のサブセットのみを使用すると、問題なく動作します。
viterbi_results <- viterbi(HMM,string[1:49963])
実際に実行しようとすると:
viterbi_results <- viterbi(HMM,string[1:49964])
#Error: protect(): protection stack overflow
同じスタック オーバーフロー エラーが発生し、ベクター内の 49964 要素が制限です
問題は --max-ppsize のデフォルトの R オプションが 50000 であるという事実に関連している可能性があると思いますが、このパラメーターを制限 --max-ppsize 500000 に変更しても問題は修正されません。ただし、viterbi() のベクトル制限は増加し、文字列ベクトルの 49964 要素から約 499960 要素になります。
ビタビ アルゴリズムをチャンクで実行しようとしました。最初に文字列を 49960 要素のチャンクに分割し、それぞれに viterbi を適用しましたが、同じエラーが発生しました
list_string <- split(string, ceiling(seq_along(string)/49960))
viterbi_results <- lapply(list_string,function(x) viterbi(HMM,x)$states)
#Error: protect(): protection stack overflow
ここでスタックオーバーフローで、私が持っているものと同様の問題を見つけましたLINK。どうやら問題の原因は、不要なループ内の PROTECT でした。viterbi 関数の C++ ソース コードに飛び込みましたが、PROTECT が 1 つもありません。
も試しulimit -s unlimited
ましたが、同じエラーが発生しています。
私は1009 GBのRAMメモリを搭載したUNIXで作業しています
RHmm パッケージへのリンク
助けてくれてありがとう!