5

文字列の状態を分析するための 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 パッケージへのリンク

助けてくれてありがとう!

4

1 に答える 1