2015年4月12日日曜日

データ解析のための統計モデリング入門

読んだ。

Rで書いてあるコードを自分でも再現しながらやるつもりだったけど、結局途中から読むだけになってしまった。以下メモ

・やりたいのは、多数のデータのふるまいを少数のパラメータによって表現すること

・GLMでは確率分布・リンク関数・線形予測子によってモデルが構成される

・最小二乗法は、確率分布に正規分布を仮定したときの最大尤度

・観測にかからない影響をモデルに組み入れたのがGLMM

・GLMMでは過分散を説明するようなモデルも作ることができる

・階層ベイズモデルでは、モデルのパラメータ自体も確率分布する量としてさらにモデル化する →局所的なパラメータを大域的なパラメータで代表させてパラメータを減らす

↑ここまでモデルの話

↓ここから推定の話

・得られたパラメータから後続のデータを予測する際にはどんなモデルが良いか?→AIC基準といものがある(唯一ではないと思うがわかりやすい基準)

・より複雑な統計モデルのあてはめに効果的なのがMCMC

・MCMCサンプリングで得られるのは現在得られたデータから得られるモデルパラメータの定常分布

2015年4月5日日曜日

メタ関数 is_same

template <typename, typename>
struct is_same : public false_type {};

template <typename Type>
struct is_same<Type, Type> : public true_type {};
 
1つ目はfalse_typeを継承したis_same。
テンプレート引数2つがどんな組み合わせでも実体化されうる 
したがって
次に定義する特殊化されたis_sameが選ばれなければis_sameはfalse_typeを継承する。
 
2つ目は2つのテンプレート引数が同一だった場合の特殊化。これが選ばれるとtrue_typeを継承する。
  
 

2015年3月8日日曜日

ポアソン分布

試行回数N、確率pのコイン投げで表がk回出る確率は二項分布
\begin{equation}
p(k) = _N C_kp^k(1-p)^{N - k}
\end{equation}
に従う。

これをN→∞として連続化したものがポアソン分布。
ただしこのとき平均$Np$も同時に無限に発散してしまわないよう、$Np = \lambda$と固定しておく。
こうして平均$\lambda$を持つポアソン分布ができる。
\begin{equation}
f(x) = \frac{e^{-\lambda}\lambda ^x}{x!}
\end{equation}
ポアソン分布:単位時間当たり平均$\lambda$回起こる事象が単位時間に$x$回起こる確率

ポアソン分布の特徴として
・平均と標準偏差がともに$\lambda$。(両方が$\lambda$ということより、分布が$\lambda$というただひとつのパラメータによって決定されることに注目)
・「回数」を表現する分布のため正の値しかとらない。分布の形が非対称。
・指数分布との関係


参考URL
http://www.slideshare.net/teramonagi/ss-11296227

2014年10月12日日曜日

数値計算の常識

少し前に読んだ本。

興味のある章だけ飛ばし読みしたんですが、丸め誤差と桁落ち、刻み幅と数列の収束の話は読んでよかったと思う。どう考えても常識として知っておくべき。

桁落ちについてはこれまで意識してなかったので、本の中にもあった刻み幅と差分の関係を調べてみると確かにその通りでした。
y=sin(x)のx=1での差分と真値cos(1)の差を出力。 (これだとcos(1)の丸め誤差も気になる?)
刻み幅は、最も小さい点ではマシンイプシロン。そこからは順に10倍しています。

やはり刻み幅は小さければいいというものではなく、ある程度小さくなると桁落ちの影響が相対的に大きくなっていくのが見て取れます。

前進差分と中心差分で二通りやってますが、中心差分の方が精度良いというのも教科書通り。

 しかし、最初計算してみたときはx=0で差分を計算してみたのですが、このときは差分がマシンイプシロンのときも正しい値を返していました。
どうやら桁落ちの影響は常にあるわけではないようで、テストの値をきちんと用意してやらないと桁落ちの影響を見逃してしまいそうだと思いましたまる

2014年9月27日土曜日

テンプレート引数を式パラメータにしたとき

TMPの練習にと、FizzBuzzしたり素数並べたりしてるとこで

template<int N, int D = N - 1> struct Test

っていう形に出会った。パッと見第2引数が常にN - 1になるかと思ったが、実はそうではなかった。

テンプレートの第2引数に何も指定されていなければD=N - 1になり、何か引数が与えらていればDはその値になるようだ。

例えば以下のコードの出力は
9
5
10
 になる。

#include <iostream>

template<int N, int D = N - 1> struct Test{
    Test(){
        std::cout << D << std::endl;
    }
};

template<int N> struct Test<N, 1>{
    Test(){
        std::cout << N << std::endl;
    }
};

int main()
{
    Test<10>();
    Test<10, 5>();
    Test<10, 1>();
}


ちなみに3つ目は部分特殊化

2014年9月8日月曜日

テンプレートメタプログラミングが難しい

Effective C++を読んでいたら最後の法でテンプレートメタプログラミング(TMP)というのが出てきました。

以下の階乗を計算するプログラムがTMPの初歩的なプログラムらしいです。

#include <iostream>

template<unsigned n>
struct  Factorial {
    enum { value = n * Factorial<n - 1>::value };
};

template<>
struct  Factorial<0> {
    enum { value = 1 };
};

int main()
{
    std::cout << Factorial<5>::value << std::endl;
    std::cout << Factorial<10>::value << std::endl;
    getchar();

}

このコードを見てよくわからなかったのは

・enumってなんか意味あるの?
・Factorialっていつ計算されるの?

でした。

enumってなんか意味あるの? 

enumハックというやつらしいです。コンパイル時にクラス内で定数が必要になるときに使うそうです。

static const unsigned value = n * Factorial<n - 1>::value;

と書いても動きましたが、こっちはコンパイラによってはエラーになるらしい。

Factorialっていつ計算されるの?

コンパイル時にされる。普通に本文に書いてあったのですが、文章ってあまり頭に入ってこないですね。コード見たときになんやこれ、って思って悩んでしまいました。
TMPでは、このような静的な計算がコンパイル時に行われるため、計算が高速化するらしいです。


ほかにTMPの効用としては

エラーがコンパイル時にみつかる

たとえば Factorial<20> とかにすると値が大きくなりすぎてエラーをはく

TMPはチューリング完全であることが証明されている

要はどんな計算でもTMPで書けることが保障されているらしい・・・



しかし、実際どうやってTMPで書いていったらいいかわからんです


2014年8月3日日曜日

プログラミング

4月から会社でプログラミングの研修を受けてました。

そんで一応動くコードが書けるようになってきたところ、はてぶの

クイズに答えるだけで「プログラミングの勉強」ができるWebサービスたちにハマる! 

 という記事を見つけました。

自分がどのくらいコードを書けるようになったのか知るにはちょうどいいかなーと思い、CodeEvalとpaizaをやってみました。

CodeEvalの方は、英語なのが若干めんどいですが、問題数がたくさんあってこれやってたらいつまでも時間を潰せそう。

paizaの方は問題を解くのに時間制限があって、しかも一回しか挑戦できないからなんかわからんけど緊張感がありました。なにやら書いたコードを企業に送って転職活動をするというのが主目的のサイトらしい。どうりで問題をブログとかに書くなよって警告されるわけです。

実際に問題やってみてわかったことは、プログラミングのスキルというより、入出力のスキルが不足しまくってるということでした。

問題を解く部分はわりとすぐできるのに、入力を受け取ることに時間かかりまくってました。

C++で書いてたのですが、スペース区切りの文字列を受け取るのができなくて発狂しそうでした。

ググってみたところgetlilne関数使えばいいよー的な記事があったので、getline(cin, str)って書いたら、そんな関数ねーよと言われてしまいました。ちゃんとヘッダもインクルードしたはずなのに。なんやねん

そんなこんなで入出力の部分を作ることができたら、そのあとはすんなり作ることができました。算数とか得意だったからそっちはいけるらしい。

 難しい問題も少し見てみたところ、問題になりそうなのはやはり入出力でした。標準入出力ができるようになったら難しい問題に挑戦してみたいと思います。