#Julia言語

C++は避けるべき。

できあいの統計関連のライブラリやパッケージを主に使うなら、Rが多分良くて、Pythonも良いと思います。

サンプルコードでアルゴリズムも示したいならば、ほぼJulia一択だと思います。

実際、須山敦志さんはJuliaを早くから使い始めて大成功しているように見える。
#Julia言語

machine-learning.hatenablog.com/search?q=Julia
で須山さんによるJuliaを利用した確率統計の学び方を知ることができる。Juliaは高速かつ強力かつ気楽に使えるので、試しに自力実装するのに非常に向いている。

amazon.co.jp/dp/4065259800
Juliaで作って学ぶベイズ統計学 (KS情報科学専門書)
2021/11/26
須山敦志
#統計 #Julia言語

コインを20回投げたときの表が出る回数の分布は正規分布で近似される。

Juliaのコードがシンプルであること、確率分布を意味するオブジェクトを作って、確率函数、乱数、プロットで使えること、などに注目!

nbviewer.org/github/genkuro…
#統計 #Julia言語

サイコロを10回振って出た目の平均値の分布は正規分布でよく近似される。

nbviewer.org/github/genkuro…
#統計 #Julia言語

2つの確率パラメータ(比率パラメータ)が等しい二項分布で生成れれたサンプルのZ統計量は近似的に標準正規分布に従う。

これは母比率が等しいことの検定の基本原理。

nbviewer.org/github/genkuro…
#統計 #Julia言語

Z統計量の2乗がPearsonのχ²統計量に一致することを数式処理によって確認。

Z統計量の数値計算に使ったzstat函数をそのまま数式処理のために使っていることに注目!
#統計 #Julia言語

正確二項検定のP値函数とそのグラフの例。

ここでもコードがシンプルで十分に抽象化されていることに注目。

nbviewer.org/github/genkuro…
#統計 #Julia言語

信頼区間函数を数行で実装。

信頼区間は本質的にP値函数から決まる。

P値の定義を変えれば信頼区間も変わる。

github.com/genkuroki/publ…
#統計 #Julia言語 確率分布やプロットや零点を求めることについては汎用パッケージを利用しているが、P値函数や信頼区間函数をほぼ自前で実装しているのに、コードが非常にシンプルであったことに注目。

型名注釈は皆無だが、そのままでC, C++, Fortranと同程度の速さで計算してくれる。
#統計 #Julia言語

以上のように、各種の確率分布を確率分布を意味するオブジェクトをコンピュータ上で扱うことによって勉強したり、自分でP値函数や信頼区間函数を実装したりして、確率統計について自習する目的にはJuliaが最適であることは十分に説得力がある主張だと思います。
#Julia言語

高速であって欲しい数値計算用のコードであっても型注釈を一切書かずに済ませられる気楽さが本領発揮されるのは以下のリンク先のような場面です。

数値計算のために使った函数をそのまま数式処理でも利用して欲しい公式を証明できてしまっています!

多重ディスパッチ万歳な感じ。
#Julia言語 #統計

P値函数のプロットを作り直した。
#統計 データkの値を固定してパラメータpの函数としてのP値函数のプロットをする利点は、信頼区間もそこから読み取れることです。

添付画像①ではデータがn=20回中k=6回成功のとき、成功確率pの95%信頼区間を赤線で示しています。

添付画像②にもn=20, k=6での95%信頼区間を赤線で示した。
#統計 仮に自分が教科書として採用して「サンプルコードを実行したい。どうすればよいのか?」と相談されたときに、「C++の開発環境+gnuplotなどのインストール」まで面倒を見るのはかなり辛い。

Julia, Python, RのJupyterトリオなら無難。

Juliaについてはこのスレのサンプルコードを参照。
#統計

nbviewer.org/github/genkuro…

二項分布モデルの場合のデータkごとの信頼区間のプロットの仕方を変えた。

20回中k回成功というデータが得られたときの、成功確率の95%信頼区間をまとめてプロット。
#統計 二項分布モデルの両側検定版P値函数の定義とジェネリックな信頼区間函数と二項分布モデルの信頼区間函数。

信頼係数1-αの信頼区間はP値函数pvalue(data, param)から

ci(data, α) = { param | pvalue(data, param) ≥ α }

で定義し、実装時には零点を求める函数で両端の位置を求めればよい。
#統計 検定の理論は、「棄却されるデータの値の集合(棄却領域)」や理論的にはより便利な「各データの値ごとに棄却する確率の値を対応させる検定函数」で記述すると便利なのですが、実用的にはP値が圧倒的に使われており、初学者向けにはP値の説明も丁寧にしておいた方が無難。
#統計 P値はモデルのパラメータ値とデータの値の函数になることを押さえておくと、データに対する信頼係数1-αの信頼区間を、データが与えられているのでパラメータのみの函数とみなされるP値函数の値が有意水準α以上になるパラメータの値の集合として捉えることが可能になります。
#統計 これによって、データとパラメータの函数としてのP値函数を通して、有意水準αの検定と信頼度1-αの信頼区間が表裏一体の関係になっていることがクリアに理解できます。

そして、コンピュータでの実装もそれによって抽象化できて易しくなる。

上の方では #Julia言語 でその実演をやっています。
#統計 棄却領域や検定函数を使う検定の定式化の御利益は、完備十分統計量を用いた一様最強力不偏検定の構成法の類の理論的な議論をできるようになることだと思います。実践的には厳密に不偏な検定のみにこだわるのは不便なので、個人的には初学者向けの解説ではP値函数がよいと思います。
#統計 Rのような統計ソフトの出力結果はP値やP値函数から作った信頼区間だったりすることが多いので、それらに関する知識がないと実践的でなくなってしまいます。
#統計 添付画像は、20回中6回成功というデータが得られたときの、二項分布モデルのP値のグラフ。横軸は二項分布モデル内での成功確率のパラメータpの値です。モデル内成功確率pを決めるごとに、そのP値が決まる。

それによって信頼区間(conf. int.)もグラフのように決まる。

nbviewer.org/github/genkuro…
#統計 データの値とモデルのパラメータ値の組にP値を対応させるP値函数の明示的な定義は入門書では行われていないのですが、定義していなくても検定と信頼区間を扱っていれば実質的に扱っています。

そのグラフを色々描いて様子を見ると「百聞は一見に如かず」で直観的な理解が得られます。
#Julia言語 に限らず、PythonでもRでも、確率統計学習用のサンプルコードを公開するときに、我々が覚悟しておくべきことは、

 計算のためのサンプルコードの作成以上に
 視覚化のためのサンプルコードの作成の方が
 大変になってしまうこと

プロットの仕方を学ぶことのコストは非常に高い。
確率統計がらみの視覚化のサンプルコードを公開している分量において、私は日本語圏の中でも相当な上位に入ると思われます。

ただし主に使っているのは #Julia言語

私のtwilogでの検索を私自身がよく使っている

twilog.org/genkuroki/sear…

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with 黒木玄 Gen Kuroki

黒木玄 Gen Kuroki Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @genkuroki

12 Nov
#数楽 個人的な体験談

解析力学→正準量子化
量子力学→古典極限

について、ツイッター上で物理学的な議論になっているように見えますが、私は物理と無関係に数学として面白ければよい(面白くなければいけない)という立場なので、物理学的な議論とは別の話をしたいと思います。続く
#数楽 私はずっと(佐藤幹夫の意味での)τ函数の量子化をどのようにすればよいかについて考えていました。

ソリトン系は無限自由度系なので大変過ぎるので、その相似簡約として出て来るパンルヴェ系(所謂パンルヴェ方程式達の大幅な一般化)の"τ"の量子版の構成について考えることにしました。続く
#数楽 パンルヴェ系はLax形式ではモノドロミー保存系とみなせ、モノドロミー保存系は2次元量子共形場理論の共形ブロックの理論の古典極限とみなせ、私は共形ブロックの数学的理論の専門家だったので、自分にとって情報量の大きそうな部分を攻めるとよいと思いました。続く
Read 31 tweets
12 Nov
子供のときに「くもわ図」や「きはじ図」「みはじ図」「はじき図」「木の下のハゲじじい図」(笑)で問題を解くことを教える先生に当たった人は、大人になった自分自身がそれで不自由を感じていなくても、「運が悪かった。そのような教え方は子供を害する」と思っておく必要があります。
❌「くもわ図」や「きはじ図」には算数が苦手な子を救う効果があるので、算数が苦手な子には「くもわ図」や「きはじ図」を教え込もう

と考えるのは非常にまずいです。

子供を害する(子供の頭を悪くする)教え方を、特に算数が苦手な子にはする習慣になると、その子が救われることがなくなる。😭
算数が苦手な真の原因は「公式を暗記できないこと」ではなく、「算数だと常識に沿って考えることができなくなる」や「計算が苦手」な場合が多いと思います。

計算が苦手でも常識に沿って考えることができてかつ公式の使用を強制されなければ問題を解ける場合が増えます。続く
Read 8 tweets
11 Nov
#統計 私は、WAICユーザーの大部分がWAICを誤用している疑いがある血思っています。

ベイズ統計ユーザーの多くは階層化されたモデルを使っていると思います。その場合には内部パラメータで積分してWAICを求める必要があります。手動でそうする必要があるし、計算量も大きく増える。
#統計 日本はWAICの発祥地なので(笑)、日本語圏ではWAIC(やLOOCV)の誤用に関する情報を手に入れ易い。

いれいさんもWAICを簡単に誤用できることと、誤用せずに済ませることが大変なことに気付いている。
#統計 HiroさんもWAICの誤用に気付いている。

Stanのような確率プログラミング言語で記述される「モデル」の情報(よくグラフィカルモデルで表現される)だけでは、予測分布が一意に決まらず、汎化誤差もWAICも確定しない。

通常の場合には「周辺化」版予測分布を使わないとアウト。
Read 10 tweets
11 Nov
#統計 slideshare.net/simizu706/waic を見ているのかな?

もしもそうなら松浦健太郎さんの

statmodeling.hatenablog.com/entry/waic-wit…
階層ベイズモデルとWAIC

が参考になると思います。StanやRの世界が当時より進歩しているので、もっと良い方法があるかもしれませんが、WAICの実装での考え方を学ぶことができます。
#統計 階層モデル(階層ベイズ)関連
#統計 階層モデル(階層ベイズモデル)達のモデル選択は結構大変だよという話関連。Stanなどの確率プログラミング言語で記述される「モデル」の情報だけから、予測分布の定義は確定しないので、情報量規準による予測精度の推測によるモデル選択は注意を要する。
Read 16 tweets
11 Nov
#超算数 かけ算順序問題について教育関係者の多くは「順序が逆なだけでバツにするのは好ましくない」と言います。

しかし、本音では「4人に3本ずつ鉛筆を配る場面で4×3と式を書く子はかけ算の意味を理解していない」と思っており、児童にかけ算の順序を教え込まなければいけないと思っていたりする。
#超算数 質問の内容は可能な限り具体的なものにする必要があります。

例えば、添付画像1のように聞いてみるとよいかもしれません。

「②の式を2×5にする子も問題なくかけ算を理解しているとどの先生も思っている」言ってもらえたらやっと信用できます。

続く Image
#超算数

教科書出版社側は②で5×2としなければいけないことを教え込むためにこの問題を載せています。添付画像1の教科書のマニュアル本の記述を見て下さい。

そしてそういう問題を出す直前のページで交換法則が一般的に成立している理由を教える構成になっています(添付画像2)。 ImageImage
Read 13 tweets
10 Nov
#Julia言語 デフォルトのコンストラクタ:

struct Kuma{T}
p::Tuple{T, T}
end

とするだけで、デフォルトのコンストラクタ達

* Kuma(p::Tuple{T, T}) where T
* Kuma{T}(p) where T

が定義され、後者は引数の型変換も行なってくれる。

多くの場合にこれで十分。

github.com/genkuroki/publ… Image
#Julia言語 struct ~ end の内側に自前のコンストラクタの定義を書くと(内部コンストラクタを定義すると)、それらのデフォルトのコンストラクタは定義されなくなります。

複雑な内部コンストラクタが沢山書いてあるコードは読み難いの出注意。 Image
#Julia言語 デフォルトのコンストラクタを破棄したい理由がある場合や、`new`を使わないとできないことをやる場合以外に、内部コンストラクタは無理に使わない方が良いと思う。

使う場合にも内部コンストラクタの個数はできるだけ少なくするべき。

公式ドキュメント
docs.julialang.org/en/v1/manual/c… Image
Read 4 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Too expensive? Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal

Thank you for your support!

Follow Us on Twitter!

:(