円周率1,000,000桁で各数字が等確率で出現するか問題
- 0から9の各数字が、円周率1000桁に等確率で出現するかを仮説検定してみる
一般に、
ある属性Aによって、n個の個体がk種のカテゴリー へ分類されるとき
各カテゴリーへ属する観測度数が であるとする
これが、各カテゴリーの理論確率 に適合するかを見るには、これが正しければ生じるであろ
う理論度数 を、観測度数と比べ、K.ピアソンの適合度基準
で判断すればよい。
この適合度のχ^2統計量χ^2はnが大きいとき、自由度 k-1 の χ^2 分布 に従う。
帰無仮説を
とするとき、
ならば、"観測度数は理論確率分布 に適合している" という仮説は、有意水準で棄却される。ここで、自由度=カテゴリー数(k)-1である。
円周率1,000桁でやってみる
計算
# observed frequency of 0, 1, ..., 9 (これは適当にスクリプトでカウントした) freq <- c(93,116,103,102,93,97,94,95,101,106) # expected probability p <- 0.1 # number of observations n <- 1000 np <- n * p chi <- sum((freq - np)^2 / np) # => 4.74 qchisq(0.95, 9) # => 16.91898
chiの値(4.74) < (16.91898) なので、有意水準5%で棄却されない(0, ..., 9 は等確率で出現している)。
1,000,000桁でもやってみる
# これは適当にスクリプトでカウントした freq <- c(99959,99758,100026,100229,100230,100359,99548,99800,99985,100106) p <- 0.1 n <- 10^6 np <- n * p chi <- sum((freq - np)^2 / np) # => 5.50908 qchisq(0.95, 9) # => 16.91898
(5.50908) < (16.91898) なので、棄却されない。
同じ事だけどp値の計算でやると
pchisq(5.50908, 9, lower.tail=F) # => 0.7878669
参考文献
- 無駄な知識などない:円周率って完全に乱数なのかな。0~9の中で偏ってたりしないのか?
- 作者: 東京大学教養学部統計学教室
- 出版社/メーカー: 東京大学出版会
- 発売日: 1991/07/09
- メディア: 単行本
- 購入: 158人 クリック: 3,604回
- この商品を含むブログ (79件) を見る
Rの練習
Stanford ML Classの練習問題をHaskellで解く...
と思ったけどex1の線形回帰はRで一発ぽいのでパス。適当にやったら線引けたので終了。
リハビリ
「Web+DB vol.66 きっちりわかるアルゴリズム」の「埋め込み性的辞書による圧縮アルゴリズム」をHaskellで
module Main where type Dict = [(String, String)] dict :: Dict dict = [ ("http", "'") , (".jp", "|") , ("www", ">") , (".co", "<") , ("html", "^") ] replace :: Eq a => [a] -> [a] -> [a] -> [a] replace [] _ _ = [] replace s find repl = if take (length find) s == find then repl ++ (replace (drop (length find) s) find repl) else [head s] ++ (replace (tail s) find repl) compressWithDict :: Dict -> String -> String compressWithDict [] s = s compressWithDict ((find, repl):rest) s = compressWithDict rest $ replace s find repl decompressWithDict :: Dict -> String -> String decompressWithDict d = compressWithDict dict' where dict' = [ (y,x) | (x,y) <- d ] compress :: String -> String compress = compressWithDict dict decompress :: String ->String decompress = decompressWithDict dict
統計勉強する
今日から統計とかRとかやる
ネタは
- 作者: 山田剛史,杉澤武俊,村井潤一郎
- 出版社/メーカー: オーム社
- 発売日: 2008/01/25
- メディア: 単行本
- 購入: 64人 クリック: 782回
- この商品を含むブログ (68件) を見る
- 作者: 鳥居泰彦
- 出版社/メーカー: 日本経済新聞社
- 発売日: 1994/11/01
- メディア: 単行本
- 購入: 49人 クリック: 551回
- この商品を含むブログ (47件) を見る
実践! Rで学ぶ統計解析の基礎 − @IT
Statistical Aspects of Data Mining (Stats 202) Day 1 - YouTube
AnyEventの練習
噂のsleepsort書いてみた。AnyEvent->timer の戻り値捨てると動かないんだなぁとか。
#!/usr/bin/env perl use strict; use warnings; use Data::Dumper; use AnyEvent; sub sleepsort { my (@args) = @_; my $cv = AnyEvent->condvar; my (@sorted, @timers); for my $arg (@args) { $cv->begin; push @timers, AnyEvent->timer( after => $arg / 10, cb => sub { push @sorted, $arg; $cv->end; }, ); } $cv->recv; \@sorted; } print Dumper sleepsort(@ARGV);
Perlのsystem()に@_を渡せなくてハマった。と思ったら単純ミス。
問題
でもユーティリティ関数で呼んでいるsystem()に引数が渡らない!なぜ!><
単純化するとこんなプログラム
#!/usr/bin/env perl use strict; use warnings; use Capture::Tiny qw(capture); sub caller0 { my $out = capture { system('echo', @_) }; print $out; } sub caller1 { my @args = @_; my $out = capture { system('echo', @args) }; print $out; } print "caller 0\n"; caller0('output!'); # 何も出ない print "caller 1\n"; caller1('output!'); # ちゃんと出力される
caller0内で直接@_を使うと動かない。引数に何も渡ってこない。
解決編
ひたすらハマったけど気づいてみると当たり前だった。captureは単なる関数なので、{ ... } は無名サブルーチンを渡しているだけ。なので caller0の引数のつもりで@_と書いても、実際はcaptureに渡しているサブルーチンの引数と解釈される。だからcapture呼ぶ前にコピーしてそっちを渡しましょうっていうだけの話。
おまけ
ちなみに参考にしてるApp::cpanminusのコードはこちら
xt/Run.pm
package xt::Run; use strict; use base qw(Exporter); our @EXPORT = qw(run last_build_log); use Capture::Tiny qw(capture); use File::Temp qw(tempdir); $ENV{PERL_CPANM_HOME} = tempdir(CLEANUP => 1); sub run { my @args = @_; my @notest = $ENV{NOTEST} ? ("--notest") : (); return capture { system($^X, "./script/cpanm.PL", @notest, "--quiet", "--reinstall", @args) }; } sub last_build_log { open my $log, "<", "$ENV{PERL_CPANM_HOME}/latest-build/build.log"; join '', <$log>; } 1;
最初これをコピペしてたのに何で書き換えちゃったんだろう。。。まぁ勉強になりました。
memcached
You can enable memcached to automatically load on login with: mkdir -p ~/Library/LaunchAgents cp /usr/local/Cellar/memcached/1.4.5/com.danga.memcached.plist ~/Library/LaunchAgents/ launchctl load -w ~/Library/LaunchAgents/com.danga.memcached.plist Or start it manually: /usr/local/bin/memcached Add "-d" to start it as a daemon.