c4se記:さっちゃんですよ☆

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

.。oO(此のblogは、主に音樂考察Programming に分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡)

音樂は SoundCloud に公開中です。

考察は現在は主に Scrapbox で公表中です。

Programming は GitHub で開發中です。

多量のデータをストリームして省メモリで統計処理するgemを作った

log を撫でまはし乍らごそごそしてゐたら出來てゐたので gem にした。

github.com

N 個のデータから成る large_data が在り Ruby の Enumerable として取得出來る時、標準偏差や分散等を計算しやうとしたら、単純にやると N 個のデータをディスクに置かなければならない。全体の平均を計算した後でなければ標準偏差は計算出來ないから、得られた N 個のデータを何処かに保存しつつ平均を得た後、保存した N 個のデータを読み出しつつ標準偏差を計算してゆく。2 pass 掛かってゐる。何の爲の Enumerable だったのか。

stream_stat を使へば、

p StreamStat.new(large_data).inject { |_a, stat| stat }.sd

と 1 pass で標準偏差を計算出來る。上記 inject の中の stat 變數は、途中結果を保存してゐる。今は、平均 (算術平均)・分散・標準偏差・最大値・最小値を計算してある。avg・variance・sd・max・min の名のメソッドで參照出來る。メモリーには幾つかの方法に就いて浮動小數点數計算の誤差を検討し、總數・平均・二乘の平均・最大値・最小値の五つを保持してゐる。データ數がどれだけ増えようが五つだけで濟む。

今後は、中央値と最頻値を計算しやうと思ふ。中央値や最頻値そのものは、N 個のデータに対し N 個の情報を保存しなければならず、省メモリに計算出來ない。そのものではなく類似を探してゐる。確率的な計算を行なふ類似は幾つか在るやうだ。それも検討するし、確率的なオンラインアルゴリズムでなく、幾何学的な類似でオンラインで計算出來るものも探さうと思ふ。