はむこの勉強記録

http://bit.ly/2ktf20t の写し

緑本(データ解析のための統計モデリング入門)読了(1周目)

一貫した例で非常にわかりやすく、線形モデル(LM)→一般化線形モデル(GLM)→混合一般化線形モデル(GLMM)→階層ベイズモデル(H-GLMM)を解説している。

こっちはPRMLと違って目的意識がはっきりしており、非常にわかりやすかったので、読む前と後での変わった視点を列挙します。

勉強したこと

離散・カウントデータはポワソン分布か二項分布か負二項分布(p.165)が普通

ポワソンは上限なし、二項分布は上限あり。

連続データは正規分布かガンマ分布が普通

ガンマ分布は下限0。正規分布は2自由度。

割算値の統計モデリングは二項分布+ロジスティック回帰で可能

p.130

交互作用は交互作用の説明変数を2次で突っ込む

p.127

分散の逸脱から分布に従っていそうかを判定することができる

応答変数yのモデリング(GLM, GLMM, H-GLMM)

x->yの予測の時に、

  • y=f(x), fは線形関数、とモデリングするとLM
  • y=exp(f(x)), fは線形関数、とモデリングするとGLM
  • y=exp(f(x)+r_i), r_iはパラメータsに特徴づけられる確率変数、sは定数、とモデリングするとGLMM
  • y=exp(f(x)+r_i), r_iはパラメータsに特徴づけられる確率変数、sは確率変数、とモデリングするとH-GLMM

GLMMを使うかは、過分散と局所的変動の有無と、観測されなかった原因不明な個体差と場所差の有無で判断

過分散(p.148), 局所的変動(逆に大局的な変動GLMの変数で十分)、どう原因不明かはp.151(反復と擬似反復の基準p.163)

フルモデル推定はナンセンス

推定自由度は低く。 p.155

GLMは分布を混ぜあわせてるから変なモデリングができている

p.157

H-GLMMでは無条件分布や恣意的事前分布を葉としてDAGが描ける

expは負にならないのでカウントデータだと特に便利

AICモデル選択方法

前: AICのモデル選択は、今まではぶっちゃけよくわからない指標で、本当に実際使うべきなのかなあ

後: fitnessではなく、モデルの予測性能で評価するから偉い

とりあえず図にして第0直感を得るの大事

Rグラフィクスみたいなのを読むべきかな

箱ひげ図は情報が多くて強い

mean, stdだけだと心もとない

対数リンク関数は効果が解釈しやすい

効果が掛け算になる

ロジットリンク関数は

効果がオッズになる(p.125)

分布によってカノニカルなリンク関数が決まっている

MCMC: メトロポリス

-確率探索+尤度が小さくなってもr=L(q新)/L(q)の確率でも更新する、というだけで、定常分布が事後分布となる

無条件事前分布には、広い正規分布(定義域[-∞, ∞])か、区間を区切った一様分布(定義域有限)を使う

階層ベイズモデルは、MCMCで推定

階層ベイズモデルの空間相関は、r_iに隣接項に依存する正規分布を設定

再帰的になるがなんとかなる, p.246

空間相関は欠損データがある場合の生成モデルに強い

そりゃね

データの変数変換して回帰・ANOVAは話にならない

それは本当に正規分布になりますか

疑問

ノンパラにはノンパラの前提があるので注意、とあるがどうやるの?

p.51 Wald統計量がわからない

PRML上巻読了(1周目)

スタンスとして、応用に使うぞ!という気持ちで読んではいけない類の本だとわかった。トイプロブラムが、面白くなく、ただ数学的に最小構成だという本当にトイプロブレムなので、どういう応用があるかは別途インターネットでしらべる必要がある。また、実世界の問題との接地が極めて甘いので、ガチ工学徒には数式の難易度とは無関係に読むのがつらい。

初めは数式をすべて追おうとしたが、かなりの論理飛躍があり、諦めた。演習の解答も載っておらず、一体何なのだろうと感じた(普通演習問題を作ったら自分で解いてテストしませんか)。

とりあえず雰囲気がわかることが大事だと思うので、目を通すパート終了

Atcoderで並列プログラム書いてみたけど、やっぱりダメだったよという話 (AtCoder Beginner Contest 033 D - 三角形の分類)

概要

AtCoder Beginner Contest 033 D - 三角形の分類で、C++ pthread並列化を試しました。手元ではちゃんと3倍くらい高速化しましたが、Atcoderのジャッジ的には速くなりませんでした。これもCPUタイムを測っているのかなあ。

abc033.contest.atcoder.jp

比較

並列化なし

02-12.txtで1.5s abc033.contest.atcoder.jp

10並列

02-12.txtで1.65s abc033.contest.atcoder.jp

100並列(タスクが偏ってるので多めに分割したほうが良さそうだったので)

02-12.txtで1.65s abc033.contest.atcoder.jp

yukicoderで並列計算プログラム書いても無駄だよって話 - Millions of Submits! TLE解

概要

yukicoderで並列計算して定数倍高速化できないかなあ、と思って実際にやってみたけど時間計測がCPU timeなのでダメでした。yukicoderのC++コンパイルは並列計算ライブラリをリンクするオプションが無いから、闇魔法を使ってごにょごにょしたのに、悲しい。

#173906 No.456 Millions of Submits! - yukicoder

何をしたか

Millions of Submits!は100万個の独立なクエリを処理する問題です。なので、並列処理がよく効くかな、と思って実装しようとしました。

No.456 Millions of Submits! - yukicoder

C++で並列計算するためには、(1) pthread (2) C++11以上のstd::thread (3) C++17のpar指示したreductionのどれかがお手頃です。

(1) pthread

結論、(1)でゴリ押しました。

そもそもyukicoderのC++コンパイルは並列計算ライブラリをリンクするオプションをつけていません。従って、pthreadもC++のthreadも何も動きません。どうしましょうか?

解決策として、具体的には、C++11から__stdcallなどを使って動的ライブラリを叩く黒魔術を駆使して、yukicoderのジャッジサーバのlibpthreadを直叩きしました。 結果、実装して並列化はできましたが、TLEしました。これは測定が実時間ではなくCPU時間であることが理由です。

#173906 No.456 Millions of Submits! - yukicoder

(2) C++11以上のstd::thread

pthreadをリンクしていない状態では、何故かCEではなく、pthreadを使おうとした時にREするという謎仕様により、REしました。

この後、bits/stdc++.hのpthread系の関数をdefineで全部自前関数に置き換えようとしましたが、無理そうなので諦めました。

#173861 No.456 Millions of Submits! - yukicoder

ちなみにC++17以上だとそもそもCEします。

#173862 No.456 Millions of Submits! - yukicoder

(3) C++17のpar

そもそもCEするので提出すらしていません。

要するに

並列化コンテストじゃないコンテストで並列化するのはやめましょう。