#統計

amazon.co.jp/dp/4130413007
竹内啓・竹村彰通編
数理統計学の理論と応用
1994
第5章 竹内啓 統計的推測理論の諸問題

に最尤法が漸近的に全然最良でないシンプルな例が載っていたので(添付画像)、#Julia言語 で数値的に確認してみた↓

nbviewer.jupyter.org/gist/genkuroki…

ベイズ統計に繋がる話題。続く ImageImage
#統計 その節のタイトルは「5 非正則な場合の漸近推定論」で、尤度函数が漸近的にフラットになる場合(一様事前分布の事後分布が漸近的に一様分布になる場合)のシンプルな例を作っているので、渡辺澄雄『ベイズ統計の理論と方法』の読者は特に興味を持つと思ったので、紹介することにしました。
#統計 データを生成する真の分布は添付画像の密度函数を持つtruncated normal distributionです。標準正規分布を |x|>1 なら確率密度が0になるように改変したもの。

モデルはこの分布を並行移動したものです。パラメータは平均μのみ。

分布の台がパラメータμごとに違うモデルになっている。 Image
#統計 その場合に、

* 最尤法(max.lik.estim.)

* サンプル中の値の最大値と最小値の平均を推定値として採用(mean extrema)

の2つを比較すると、添付画像のように、後者を使った方が真の値の0に近い値が得られる確率が高くなります。

n=10だと違いは小さいにですが、n=100だと違いは明瞭。 Image
#統計 #Julia言語 せっかく計算したので n=1000, 10000の場合も。

最尤法(max. lik. estim.)は、最大値と最小値の平均を推定値として採用するシンプルな推定法に惨敗しています。

分散固定のtruncated normal distribution modelでこのようなことが起こるわけです。 Image
#統計 #Julia言語

nbviewer.jupyter.org/gist/genkuroki…

添付画像はランダムに生成したサンプルの尤度函数のグラフです。

n=10, 100, 1000とサンプルサイズnを大きくして行くと、尤度函数が区間上ほぼ一定値の形に近付いて行く様子が見えます。微小な傾きが原因で最尤推定値は区間の両端に偏りがちになる。 ImageImageImage
#統計 最尤法が有効なのは、サンプルサイズ大で、尤度函数の形が正規分布の密度函数の定数倍でよく近似される釣鐘型になる場合です。

上の切断正規分布モデルの尤度函数は釣鐘型には全然近付かず、一様分布の密度函数の定数倍の形に近付き、最尤法による推定は全然最良にならない。
#統計 この場合には、サンプルサイズ大のとき、最尤推定量よりも優れている「サンプル中の最大値と最小値の平均」は平坦事前分布から得られる事後分布の平均値に近似的に等しくなる。

尤度函数が持っている貴重な情報の利用の仕方として、最尤法が最良ではないことは、この例からもわかるわけです。
#統計 このスレッドのトップで引用した竹内啓さんによる「5 非正則な場合の漸近推定論」の内容は、最尤法が良い方法として使用可能なのは漸近的にベイズ統計の結果と一致する場合で、そうでない場合にはベイズ統計が優れた方法になることを示唆しているとみなせます。
#統計 そこで引用した文献は1994年のものであり、現代においては(少なくとも私にタイムラインでは)

「渡辺澄雄『ベイズ統計の理論と方法』をみんな読んでいる」

という雰囲気になっており、最尤法が最良の方法でない場合にはベイズ統計が良い方法になることを

「みんな知っている」

わけです。
#統計 注意・警告: このスレッドを見て、「最尤法はダメで、ベイズ統計がよい」と解釈した人はひどく誤解している!

最尤法が非常にうまく行く場合は結構あります。そういう場合にはベイズ統計を使う必要はないです。

「ケース・バイ・ケースで自分の目的に合った方法を使う」以上のことは言えない。
#統計 色々な統計モデルの尤度函数のプロットをすると、釣鐘型になって最尤法が非常にうまく行きそうな場合にも多数出会うし、全然釣鐘型にならず、最尤法の使用はやめた方が良さそうな場合にも出会います。

モデルを作るのはユーザー側なので、どの道具をどのように適切に使うかはユーザー側の責任。
#統計 一般に、確率密度函数p(x)が p(b)=C>0, p(x)=0 (x>b) を満たすとき、その密度函数で定まる分布のサイズnのサンプルの最大値Mについて、b - M が従う分布は、n大のとき、期待値 1/(nC) の指数分布で近似されます。

真の最大値と標本の最大値の差は1/nのオーダーで小さくなります。
#統計 一方、真の平均と標本平均の差は、中心極限定理より、1/√nのオーダーでしか小さくなって行きません。

だから、nが大きなとき、標本最大値と比較すると、標本平均の揺らぎの大きさは圧倒的に大きくなる。

これがこのスレッドで紹介した例の理解では重要になります。
#統計 確率密度函数

p(x|μ) = const. exp(-(x-μ)²/2) if |x-μ|≤1
p(x|μ) = 0 if |x-μ|>0

のサンプルX_1,…,X_nの尤度函数は、標本平均、標本最小値、標本最大値をそれぞれX̅,A,Bと書くと、

L(μ) = const. exp(-n(μ-X̅)/2) if B-1≤μ≤A+1
L(μ) = 0 otherwise.
#統計 nは大と仮定し、p(1|0)=p(-1|0)=C>0とおき、p(x|0)の分散をσ²と書き、サンプルはp(x|0)のサンプルだとする。

このとき、-(B-1)とA+1は期待値1/(nC)の指数分布に近似的に従い、X̅は平均0標準偏差σ/√nの正規分布に近似的に従い、|X̅|≤const./(nC)となる確率は0に近付く。 ImageImageImage
#統計 尤度函数は

L(μ) = const. exp(-n(μ-X̅)/2) if B-1≤μ≤A+1
L(μ) = 0 otherwise

なので、標本平均X̅が、標本最大値-1以上標本最小値+1以下の区間から外れると(n大で外れる確率は1に近付く)、L(μ)を最大化するμは区間の両端のどちらかになります。
#統計 本当は尤度函数の台になっている区間の真ん中あたりがもっともらしいのに、尤度最大化にこだわるとその区間の両端の値を推定値として採用してしまう確率が高くなって、誤差を無駄に大きくしてしまうことになるわけです。

尤度最大化は必ずしも「もっともらしさ」の最大化にはなりません。
#統計 「尤度」(ゆうど)は英語のlikelihoodの翻訳語で、英語でlikelihoodは「もっともらしさ」という意味を持っているのですが、数学的に定義された尤度はそのような代物ではないので、likelihoodと名付けた人は尤度について誤解を招く専門用語を作ってしまったことになります。
#統計 #Julia言語 区間[-1,1]の外側を切断した標準正規分布のサンプルの最大値Mについて、1-Mが従う分布が指数分布で近似されることの数値的に確認。

ヒストグラムはモンテカルロ法でのMの分布。
青線はMの正確な分布。
赤の破線は指数分布による近似。

nbviewer.jupyter.org/gist/genkuroki… ImageImageImage
#数楽 Akahira-Takeuchi (1979)は結局見ていない。

切断正規分布の尤度函数の様子を調べるだけなら、大学新入生レベルの易しい微積分の計算に過ぎない。

しかし、実際には、大学新入生レベルの易しい微積分の計算を自由にできるようになるには、数年以上の修練が必要になる。

数学はかなり大変。
#数楽 大学新入生レベルの微積分だけではなく、線形代数の難易度も同様で、自由に使えるようになるには、数年以上の修練が必要になります。

数ヶ月間勉強して理解できた気分になれなくてもがっかりする必要はなくて、「勉強時間が足りないだけ」(←「だけ」を強調)と考えて気楽に構えた方がお得。
#数楽 どうして成立するかが全然理解できない数学的結果を使うときにも、「数年~数十年かけて理解すればいいや」と気楽に構えて、正々堂々と「理解していないことを使っています!」と言ってよいと思います。

そして、同じ「理解していない」であっても様々なパターンがあって同一視はできない。
#数楽 「正直かつ気楽」でないと数学の勉強はきつすぎたり、トンデモ化したりします。

「正直かつ常にシリアス」だと神経がすり潰されてアウト。😰

「気楽に不正直」なのは単なる嘘つきです。😅

「正直かつ気楽」以外の道はないと思う。😊
#統計 平均をμと書くとき、μ±1の外側を切り落とした分散1の正規分布モデルの(真の分布はμ=0に対応)の場合には、異なるμごとに分布の台が異なるせいで、最尤法の予測分布の汎化誤差は確率1で∞になります!
#統計 なぜならば、分布q(x)の台が分布p*(x)の台に含まれないとき、その含まれないq(x)の台内の点をxとするとq(x) > 0, p*(x)=0なので、-q(x) log p*(x) = ∞ となるからです。

こういうことからも、この場合に最尤法は不適切そうであることが分かります。

• • •

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

13 Jan
#Julia言語

Juliaでの最適化では、函数の定義で

function f(x::Float64)::Float64

end

のように「型指定」しても全然__速くならない__ことを理解しておく必要があります。

function f(x)

end

のままで最適化できることを知らずに、一所懸命「型指定」するのは時間の無駄。
#Julia言語 函数の引数の「型指定」をするのは、multiple dispatchを使うためです。例えば

function f(x)
広く通用するアルゴリズムのコード
end

と定義しておいて、Float64専用の同名の函数を

function f(x::Float64)::Float64
Float64に最適化されたコード
end

と定義するとよい。
#Julia言語 しかし、

function f(x)
広く通用するアルゴリズムのコード
end

の段階で十分高速なコードを書ける場合も多いです。

それを可能にするのが、型の伝搬を促すコードの書き方です。

Juliaでは「型指定」ではなく、「引数の型の伝搬」で考える。
Read 23 tweets
12 Jan
#数楽 そうなんです!ベータ函数や超幾何函数達は非常に面白い!高校で微積分を習っていればめっちゃ楽しめる。

B(p,q)=∫_0^1 x^{p-1}(1-x)^{q-1}dx

がよく使われるが、

B(p,q)=∫_0^∞ t^{p-1}/(1+t)^{p+q} dy

およびさらにt=u^{1/p}やt=u^2とおいた場合も応用上重要な点は盲点になり易い。 Image
#数楽

B(p,q)=∫_0^∞ t^{p-1}/(1+t)^{p+q} dy

型のベータ函数の表示で t を t²/ν で置き換えて、p=1/2, q=ν/2 とおけば、本質的に自由度 ν のt分布が得られます。

t分布は非常に基本的な確率分布なのですが、ベータ分布の特別な場合(p=1/2)の変種と思えます。F分布はp=1/2の特殊化をやめた場合。 Image
#数楽

B(p,q)=∫_0^∞ t^{p-1}/(1+t)^{p+q} dy

型のベータ函数の表示を知っていれば

Γ(p)Γ(q)=Γ(p+q)B(p,q)

を y = tx (yを直線の傾きtに変数変換)の形の積分変数変換で示せます。その計算の過程も面白いので知っておいて損がないです。

大学新入生向けの計算練習の題材としてもよい。 Image
Read 19 tweets
11 Jan
#Julia言語

Juliaでは

foo(f::函数, X::配列など)

の形式で、配列Xなど(generatorやiteratorを含む)のすべての要素に函数fを施した結果に "foo" の操作を施せる場合が多数あります。

例えばXの要素の絶対値の最大値と和はそれぞれ

maximum(abs, X)
sum(abs, X)

二乗和は

sum(x->x^2, X)
#Julia言語 二乗和は

X = randn(10^6)
sum(Base.Fix2(^, 2), X)
sum(abs2, X)

のようにも書ける。Fix2(f, a)は本質的に x->f(x, a) です。読み易さは x->f(x,a) の方が上のことが多い。

1.96より大きい要素の割合は

count(>(1.96), X)/length(X)

using Statistics
mean(>(1.96), X)
#Julia言語

Xのすべての要素に手続き f を施すには

foreach(f, X)

返り値はforループと同じnothingになります。

Xの要素に函数 f を作用させた結果を集めたものは f.(X) だけではなく

map(f, X)

で作れる。

これら以外にもmaximum, minimum, count, sum, mean, …も似た使用法が可能。
Read 15 tweets
4 Jan
#統計 統計学の哲学者のMayoさんによれば

* Royallの3つの問いに、びっくりするほど多くの(しかも異なる信念を持つ)統計家達・哲学者達が賛同している。(大変なことになっている、とてもひどいことになっているというニュアンス)

続く

errorstatistics.com/2014/10/10/bre…
#統計 Mayoさん曰く

* Royallの3つの問いの「戒律」によれば

①何を信じるか→ベイジアンの事後分布

②どう行動するか→Neyman-Pearsonの方法による長期的なパフォーマンスの良さ

③証拠の比較→尤度比較法

となるが、あなたはこれら全部を拒否したいかもしれません。私が拒否しているように。
#統計 日本語圏でも同様にRoyallの3つの問いの「戒律」という合理的であろうとすれば到底受け入れることができない考え方を受け入れている人達を容易に発見できます。

ソーバー著『科学と証拠―統計の哲学入門―』とその翻訳者の松王政浩さんが大変な悪影響を与えているように見える。
Read 11 tweets
3 Jan
#Julia言語 個人的にJuliaはPythonにあまり似ていないと思うのですが、Pythonから来たっぽい人のJuliaのコードで気になるのは、

A = []
for ~

push!(A, a)

end

におけるA = []という書き方(Anyの配列になって効率悪化!)と、

sum([f(x) for x in X])

のような書き方。続く
#Julia言語

sum([f(x) for x in X]) だと、すべてのXの要素についてf(x)を計算した結果を配列として保存してから、その配列の要素の和を計算してしまいます。無駄にメモリを消費する。

sum(f(x) for x in X) # generatorを使う

もしくは

sum(f, X)

と書いた方が得だし、コードも短くなります。
#Julia言語

A = []
for i in 1N
push!(A, randn())
end

とするとAnyの配列Aができてしまう。

Anyの配列に格納されたサンプルによるモンテカルロ積分はFloat64の配列の場合と比較すると180倍くらい遅くなった!

A = [] → push!(A, ~) の繰り返しは要注意。

gist.github.com/genkuroki/7cd0…
Read 4 tweets
3 Jan
他にも似たような反応がありますが、小5の算数の教科書にある割合の3つの公式を覚えさせたり、「もとにする量」「比べられる量」という割合の概念を理解するために不要な用語を使うことを児童に強制していたら、教わっている子の将来が暗くなると思います。

教科書通りの教え方がまずい証拠がある。
お勧めしたいのは以下の2冊の本です。
実際に子供に算数を教えていたら楽しんで読めると思います。

amazon.co.jp/dp/4101370311
お母さんは勉強を教えないで
見尾 三保子

このタイトルはひどいし、内容とも一致していません。

内容の大部分は算数や数学の真っ当な教え方の話です。

2冊目紹介に続く
2冊目

amazon.co.jp/dp/4788508435
学力低下をどう克服するか―子どもの目線から考える
2003/3/25
吉田 甫

タイトルを見ても分からないことですが、教科書通りの教え方の対照群と実験的な教え方を、実際に授業をしてみて比較してみた研究結果が書いてあります。分数と割合の教え方を詳しく扱っています。
Read 8 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 Become our Patreon

Thank you for your support!

Follow Us on Twitter!