2017年6月21日水曜日

R の for 文

以下の文献に掲載されているアルゴリズムの実装に取り組んでいました。

榊原ほか「 ラフ集合を用いたデータマイニングによるがけ崩れ発生要因の抽出に関する研究」 土木学会論文集 No. 658/VI-48, p. 221-229, 2000. 9
(1) 整合度の要求水準を設定する.
(2) 要因数が1っの場合の整合度を求め, 要求水準と比較する. 少なくとも1つの要因において整合度が要求水準上回った場合, 最小必要要因数は1となる.
(3) すべての要因について, 整合度が要求水準を下回っていた場合, 2つの要因の組み合わせに関する整合度を求め, 要求水準と比較する.
(4) 以下順次要因数を増加させ, 整合度が要求水準を初めて上回った時点における要因数を最小必要要因数とする.

要は、順次総当たりでラフ集合の下近似を計算し、dependency を求め、閾値を上回れば終了といった内容です。
いくつかの会社や大学が特許を取られているようですので、実務で使わないほうがよさそうです。https://www7.j-platpat.inpit.go.jp/tkk/tokujitsu/tkkt/TKKT_GM301_Detailed.action
ま、研究では近年の深層崩壊でも使われていますので、研究やデータマイニングツールとして使えそうです。

フローは単純ですので、単コアでの実装は容易です。dependency(「整合度」と訳されている)の計算部分も、R のパッケージに関数として組まれていますので、特に悩む必要はありません。一晩で(といってもかなり遅くまでかかりましたが)実装は終わりました。

で、計算!

遅い!
for で 118万回ループさせた dependency の計算でしたが、完走するまで11.5時間かかりました。

R の for 文 は遅くなることで有名なようでしたが、本当に遅かった。
dependency を算出する関数がベクトルを受け付けてくれませんので、仕方ありません。ま、for ループを使っておけば、次の並列化が楽になるだろうという目論見もあったわけですが。

やはり並列化・高速化が必要でしょう。
続く。

**************************************
20170623追記

dependency を算出する関数の引数にリストから値を代入する関数を作り、それを apply  lapply で呼んでやることはできました。が、新たな問題も発生。こちらに関しては後日。


0 件のコメント:

コメントを投稿