Mar 19, 2018

ディリクレ分布を直観的に理解する

サイコロを振って1,2,3,4,5,6の目が出た回数がそれぞれn1,n2,n3,n4,n5,n6だった時、それぞれの目が出る確率p1,p2,p3,p4,p5,p6は(n1,n2,n3,n4,n5,n6)をパラメーターとするディレクトリ分布に従う、という話を聞いたので、ちょっと勉強しておくことにした。

コインの表が出る確率がpの時、N回振って表が出る回数nはNとpをパラメーターとする二項分布に従う。
コインをN回振って表が出た回数がn回だと観測された時、点推定では表が出る確率はn/Nとなるが、ベイズ推定では表が出る確率(事後確率)pは(n+1, N-n+1)をパラメーターとするベータ分布に従う。
勝手な表記だが、回数がnになる確率P(n)が
P(n;N,p)=Binomial\_PMF(n;N,p)=\pmatrix{N \cr n}p^n(1-p)^{N-n}
(PMF=Probability mass function)という感じであり、事後確率がpになる確率の密度関数f(p)が
f(p;N,n)=Beta\_PDF(p;n+1,N-n+1)=\frac{\Gamma(N+1)}{\Gamma(n+1)\Gamma(N-n+1)}p^n(1-p)^{N-n}=\pmatrix{N \cr n}p^n(1-p)^{N-n}
(PDF: probability density function)ということになる。
この関係のことを、ベイズ推定の用語で、尤度関数が二項分布の場合、ベータ分布は共役事前分布(conjugate prior)であると言うらしい。

多項分布とディリクレ分布もその関係にある。
サイコロをN回振って1〜6の目が出る確率がp1〜p6の時、1〜6の目が出る回数n1〜n6はp1〜p6をパラメーターとする多項分布に従う。(n1+n2+n3+n4+n5+n6=N, p1+p2+p3+p4+p5+p6=1)
サイコロをN回振って1〜6の目が出た回数がそれぞれn1〜n6回だと観測された時、推定される1〜6の目が出る事後確率p1〜p6は(n1+1, n2+1, n3+1, n4+1, n5+1, n6+1)をパラメーターとするディリクレ分布に従う。
nをn1〜n6のベクトル、pをp1〜p6のベクトルとすると、回数がnになる確率P(n)が
P(n;p)=Multinomial\_PMF(n;p)=\frac{\left(\sum_{k=1}^{6}n_k\right)!}{\prod_{k=1}^{6}n_k!}\prod_{k=1}^{6}p_k^{n_k}
であり、事後確率がpになる確率の密度関数f(p)が
f(p;n)=Dirichlet\_PDF(p;n+1)=\frac{\Gamma\left((\sum_{k=1}^6n_k)+1\right)}{\prod_{k=1}^6\Gamma(n_k+1)}\prod_{k=1}^6p_k^{n_k}=\frac{\left(\sum_{k=1}^6n_k\right)!}{\prod_{k=1}^6n_k!}\prod_{k=1}^6p_k^{n_k}
ということである。

ディリクレ分布はベータ分布の確率変数の次元を拡張したものである。
上記のコインの例も多項分布とディリクレ分布で表現でき、コインの表が出る確率がp1、裏が出る確率がp2の時、N回振って表が出る回数n1と裏が出る確率n2は(p1, p2)をパラメーターとする多項分布に従う。
コインをN回振って表が出た回数n1回、裏が出た回数がn2だと観測された時、表が出る事後確率p1、裏が出る事後確率p2は(n1+1, n2+1)をパラメーターとするディリクレ分布に従う。

図1はパラメーターを(3n+1, 2n+1)、n=1〜10としたベータ分布のグラフである。 コインを投げて5回中3回、10回中6回、15回中9回、...、50回中30回、表が出た時の表が出る確率の分布に対応する。
図1
5回中3回でも表が出る確率が0.6である確率が最も高いが、他の確率である確率もそれなりに高いのに対し、回数を増すほど確率が0.6近辺に限定されていく様子がわかる。
最尤推定のような点推定では5回中3回でも50回中30回でも単に0.6であり、その尤もらしさが区別されない。

図2は同様にパラメーターを(3n+1, n+1)、n=1〜10としたベータ分布のグラフである。 コインを投げて4回中3回、8回中6回、...、40回中30回、表が出た時の表が出る確率の分布に対応する。 図2

図3はパラメーターを(2+1, 3+1, 5+1)とした3次元のディリクレ分布のグラフである。 3面しか無いサイコロを10回振って各面が2回、3回、5回出た時の各面が出る確率の分布に相当する。
図3
ちょっとややこしいが、三角形の各頂点がサイコロの各面に対応し、三角形内の各頂点への近さが各面の出る確率に対応し、上方向の高さがその確率の組み合わせになる確率であり、高いほど高温の色になっている。右下の頂点が1つ目の面、右上の頂点が2つ目の面、左の頂点が3つ目の面に対応する。XYZ空間で右下の頂点が(1,0,0)、右上の頂点が(0,1,0)、左の頂点が(0,0,1)にあるとすれば、三角形内の点のX座標、Y座標、Z座標が各面の出る確率である。
上から見ると、図4のようなヒートマップになる。
図4
(0.2, 0.3, 0.5)に対応しそうな所が頂点になっている。

図5はパラメーターを(20+1, 30+1, 50+1)とした3次元のディリクレ分布のグラフである。 3面しか無いサイコロを100回振って各面が20回、30回、50回出た時の各面が出る確率の分布に相当する。
図5
図6は上から見た図である。
図6
それぞれの面が出た割合が同じでも、回数を重ねた方が確率が高い範囲が限定される様子がわかる。

See more ...

Posted at 18:17 in 数学 | WriteBacks (0)
WriteBacks

Feb 01, 2018

(Emacs)Jediで数字に不正な補完候補が出る

筆者はEmacsでPythonのコードを書く時に補完機能としてJedi+CompanyModeを使っているが、筆者の環境では数字に対しておかしな補完が働く。

例えば、

このように、数字を打つと"and"などが補完候補として現れ、Enterキーを押すと

このように、打った数字が消えて"and"になってしまう。

そして慌てて"and"を消してもう一度数字を入力してEnterを押すと、また"and"になるのである。
これは不便である。

CompanyModeでなくAutoCompleteだと同じことにはならないが、やはりおかしな補完が起こることがある。

このように、数字を1文字打つと"if"などが補完候補として現れ、Enterキーを押すと

このように、"if"が足される。

筆者の環境は以下である。
・macOS Sierra バージョン10.12.6
・Emacs 24.5.1 (https://emacsformacosx.comからダウンロード)
 ※同サイトからダウンロードしたEmacs 25.2でも起こる
・jedi 20160425.2156
・company-jedi 20151216.1921

.emacsは次のものだけにしても再現する。

(require 'package)
(package-initialize)

;; for Jedi + company
(require 'company)
(add-hook 'python-mode-hook 'company-mode)
(add-to-list 'company-backends 'company-jedi)

;; for Jedi + auto-complete / company-mode
(require 'jedi-core)
(setq jedi:complete-on-dot t)
(add-hook 'python-mode-hook 'jedi:setup)

Webで調べても、同じ症状の話はほとんど見つからない。
唯一見つけたのは、https://github.com/jorgenschaefer/elpy/issues/1115である。昨年に見つけて時々チェックしているが、今年に入って、筆者と同じ症状の報告が追加された。しかし、私には再現できていないという書き込みや、Jediの問題ではない、Python的に間違った補完ではない(??)、Elpyで回避可能といった書き込みがあり、すぐに修正されそうには見えない。

とりあえずの対策として .emacs に

(setq company-idle-delay 0.5)

を加えて、キー入力から0.5秒間は補完が働かないようにした。

See more ...

Posted at 23:10 in PC一般 | WriteBacks (0)
WriteBacks

Jan 29, 2018

ベイジアンネットワークの例題をやり直す

以前にやったFamily Out Problemの事後確率計算は、ベイジアンネットワークらしくない計算だったことに気付いた。ネットワーク全体をまとめて計算するのでは、ネットワークの構造を無視して確率モデル全体に対してベイズの定理を使ってるだけである。ベイジアンネットワークにしてるからには、新たな情報が追加される度に、ノード毎の事前確率が事後確率に更新されるべきであろう。

問題を再掲する。


Family Out Problem

これのP(fo | lo, hb)を計算する。

この初期状態の事前確率は、単純に上から全パターンの確率を足し合わせて、
(P(fo), P(bp), P(lo), P(do), P(hb)) = (0.15, 0.01, 0.1325, 0.3958, 0.2831)
と求まる。

次に、loが確定した(lo=True, ¬lo=False)として、それに合わないP(fo)を事後確率に更新する。
ベイズの定理より、条件付き確率P(fo | lo)は
P(fo|lo) = \frac{P(lo|fo)P(fo)}{P(lo)} = \frac{P(lo|fo)P(fo)}{P(lo|fo)P(fo) + P(lo|\lnot fo)P(\lnot fo)}
= (0.15 * 0.6) / (0.15 * 0.6 + 0.85 * 0.05) = 0.6792...
であり、これに事後確率P(lo)=1.0を掛けたものがfoの事後確率なので、これを新たなP(fo)とする。
P(do), P(hb)はP(fo)に依存するので、これらも計算し直すと、
(P(fo), P(bp), P(lo), P(do), P(hb)) = (0.6792, 0.01, 1.0, 0.7103, 0.5001)
となる。

次に、hbが確定したとして、それに合わせるべく、関係する事前確率を事後確率に更新する。

まず、hbが直接依存するdoの条件付き確率は、しつこいがベイズの定理より、
P(do|hb) = \frac{P(hb|do)P(do)}{P(hb)} = \frac{P(hb|do)P(do)}{P(hb|do)P(do) + P(hb|\lnot do)P(\lnot do)}
= (0.7 * 0.7103) / (0.7 * 0.7103 + 0.01 * 0.2897) = 0.9942...
であり、hbの事後確率が1.0なので、doの事後確率がこれになる。

次に、doが依存するfoの事後確率は、¬doの事後確率 ≠ 0.0なので、¬doを考慮して P(fo|do)P(do) + P(fo|¬do)P(¬do) と計算することになる。見た目にもかなりしつこいがベイズの定理より、条件付き確率は
P(fo|do) = \frac{P(do|fo)P(fo)}{P(do)} = \frac{P(do|fo,bp)P(fo)P(bp)+P(do|fo,\lnot bp)P(fo)P(\lnot bp)}{P(do|fo,bp)P(fo)P(bp)+P(do|fo,\lnot bp)P(fo)P(\lnot bp)+P(do|\lnot fo,bp)P(\lnot fo)P(bp)+P(do|\lnot fo,\lnot bp)P(\lnot fo)P(\lnot bp)}
= (0.99 * 0.6792 * 0.01 + 0.90 * 0.6792 * 0.99) / (0.99 * 0.6792 * 0.01 + 0.90 * 0.6792 * 0.99 + 0.97 * 0.3208 * 0.01 + 0.3 * 0.3208 * 0.99) = 0.86147...
P(fo|\lnot do) = \frac{P(\lnot do|fo)P(fo)}{P(\lnot do)} = \frac{P(\lnot do|fo,bp)P(fo)P(bp)+P(\lnot do|fo,\lnot bp)P(fo)P(\lnot bp)}{P(\lnot do|fo,bp)P(fo)P(bp)+P(\lnot do|fo,\lnot bp)P(fo)P(\lnot bp)+P(\lnot do|\lnot fo,bp)P(\lnot fo)P(bp)+P(\lnot do|\lnot fo,\lnot bp)P(\lnot fo)P(\lnot bp)}
= (0.01 * 0.6792 * 0.01 + 0.10 * 0.6792 * 0.99) / (0.01 * 0.6792 * 0.01 + 0.10 * 0.6792 * 0.99 + 0.03 * 0.3208 * 0.01 + 0.7 * 0.3208 * 0.99) = 0.23232...
なので、foの事後確率はdo及び¬doの事後確率を用いて、
P(fo|do)P(do) + P(fo|¬do)P(¬do) = 0.86147 * 0.9942 + 0.23232 * (1 - 0.9942) = 0.8578...
と計算できる。

bpの事後確率も同様に計算できるので、ついでに計算してまとめると、
(P(fo), P(bp), P(lo), P(do), P(hb)) = (0.8579, 0.0138, 1.0, 0.9942, 1.0)
となる。

See more ...

Posted at 18:00 in 数学 | WriteBacks (0)
WriteBacks

Dec 26, 2017

フォトマスター検定1級 優秀個人賞受賞

先月、フォトマスター検定の1級を受験した。自己採点は71/80で、合格ラインは7割なので無事合格したことはわかってたのだが、昨日、合格通知と共に、優秀個人賞の賞状が届いた。

成績の上位10名程度がもらえるとされるものである。
今年は合格したらバッジがプレゼントされるということもあり、記念に受験したものだが、良い記念になった。

筆者は数年前から仕事で少々カメラに関わりがあり、会社の勧めで一昨年にフォトマスター検定の準1級を受験して、平凡に正解率80%くらいで合格した。
それからほとんどカメラを使わないまま2年近く経った今年の夏には、勉強したことをすっかり忘れて、絞り値=焦点距離÷レンズ口径という基本的なことまで思い出せなくなっていた。

今年も社内でフォトマスター検定について講義する当番が回ってきて、しかも昨年と違ってテーマが決められていたので、かなり時間をかけて復習する羽目になりそうだった。
それに費やす時間が勿体無いし、筆者のカメラに対する興味が薄れており、今年受験しなかったら二度と受けない可能性が高いので、復習するついでに1級を受験することにした。

8月に「フォトマスター検定合格 平成29年度版」のテキスト部分を一通り読んだ後、過去3年分の3級~1級の問題、計12セットを選択問題も含めて全て解いた。この時の1級の問題の正解率は70〜80%だった。
9月に、その3年分の過去問から割り当てられたテーマ(フィルム、レタッチ)に合った問題をピックアップして出題傾向を分析し、講義用の資料を作った。
11月に入ってからもう一度テキストを通して読み(時間が足りなくて読み切れなかったが)、並行して過去3年分の3級~1級の問題をもう一度全て解いた。この時には8月に過去問を解いた時の記憶が半分以上無くなってて、正解を見た全く同じ問題を解いたので満点でもおかしくなかったのに、1級の問題の正解率は80%〜85%程度だった。

そんな感じだったので、11/19の本番の正解率89%は運が味方したかも知れない。

See more ...

Posted at 23:22 in 雑記 | WriteBacks (0)
WriteBacks

Dec 20, 2017

横歩取り4五角戦法の今年食らった手

筆者は居飛車党ながら、相掛かりが大の苦手なので、先手番で横歩取り模様になったら勉強不足なのに諦めて横歩を取るのだが、今年に入って、何故か4五角戦法をよく仕掛けられる。

これである。最近また流行ってるのだろうか?

実は筆者が定跡の勉強を始めた20年くらい前に最初に覚えた定跡が横歩取り4五角戦法で、結構馴染み深いのだが、指しこなせなかったのでやめ、相手から仕掛けられたことも観戦したことも少なかったので、うろ覚えになっていた。
そんな曖昧な記憶の中であるが、今年はこれまで見たことが無い手を色々食らった。
それらについて、少し調べたことと合わせてメモしておく。

1. ▲3六香△同角の後△5四香でなく△5五香
△4五角の後のオーソドックスな手順は、▲2四飛△2三歩▲7七角△8八飛成▲同角△2四歩▲1一角成△3三桂▲3六香

であり、ここで△同角▲同歩△5四香

という、角香交換の駒損をしながら攻める、筆者のような素人には理解不能だが有望とされる有名な手があるが、この前、△5四香でなく△5五香とされた。

△5四香には▲8五飛で先手優勢、が定跡の教える所であり、△5五香なら▲8五飛が香取りになりさらに条件が良さそうなので、迷わず▲8五飛と打ったら、△2五飛とされて罠に嵌ってしまった。

銀取りと△5七香不成からの飛車の素抜きを同時に受ける術が無い。

調べてみたら、これは昔から知られている手で、この△5四香には▲8五飛、という固定観念を持っている筆者のような人間をターゲットにしたハメ手らしい。
見事にはまってしまった。

△5五香に対する正解は▲4六角または▲6六角らしい。△5四香相手だと今1つとされる手だが、この場合は香当たりになるので良いとのこと。これに対し△8六飛〜△7六飛〜角取りが気になるが、△8六飛に▲7七桂で何とか凌げるということか。

2. ▲3六香△6六銀の後、△6九飛▲3九飛を入れずに△6七銀成
上記の▲3六香には△同角でなく△6六銀が最有力とされ、その後は▲5八金△3八飛▲4八飛△同飛成▲同玉

△6九飛▲3九飛△6七銀成▲6九飛△5八成銀▲同玉△7八角成▲6三飛成△6二銀▲6六竜△3八金▲3九銀打△6七歩▲3八銀△6八馬▲4八玉△5八金▲3九玉

で先手良しというのが昔からある、もし途中で▲6六竜を形良く▲6五竜としてるとここで△5七馬で詰んでしまうことでも有名な定跡手順である。

この前、この手順に沿って指してたら、上図の▲4八同玉にいきなり△6七銀成とされ、▲同金右△同角成▲同金△8八飛とされた。

△3八飛▲4八飛△同飛成▲同玉を入れずに△6七銀成とする手は「羽生の頭脳」の第10巻にも書かれており、▲同金右△同角成▲同金△8八飛に▲6八金引△8九飛成▲6九歩で先手の勝ち筋と書かれているが、△3八飛▲4八飛△同飛成▲同玉を入れてからだと▲6八金引とできないので、底歩が打てないのである。
この手は見たことが無かった。

実戦は△8八飛の後、▲6八歩△8九飛成▲3九飛△同竜▲同銀△8九飛▲3八銀△2八金▲4九銀打△2六桂で、終盤力の無い自称アマ三段らしく自滅して終了してしまった。
▲3八銀が大悪手で話にならないが、ここまで来ると、▲3八銀打や▲1六角(激指14推奨)などとしても形が悪いので受け切れないと思う。

感想戦で対戦相手の人が、昔、中部地方の有名なアマ強豪(元朝日名人)にこれを食らって負け、未だに対策がわからないと言っていた。

その後、参考文献[1]にこの手が書かれているのを見つけた。△8八飛には▲6八銀、後手の攻めが一段落したら攻め合えば良いと書かれていたと思う。激指14の推奨手もこれである。

確かに▲6四歩が残っている分、後手を攻めやすそうではあるが、問題は後手の攻めを一段落させられるかどうかである。相変わらず底歩が打てないので、なかなか安全な形にならないように思う。
この後は△8九飛成▲3九飛△同竜▲同銀△8九飛▲5九飛△同飛成▲同銀

くらいだろうか。盤上に受け駒を1枚増やせてる分、少しましのようには思うが、後手からは△3八歩や△5五桂や△8八飛があり、やはり筆者には受け切れそうに無い。

3. △3三桂跳ばずに△8七銀
上記の△3三桂▲3六香の後に△8七銀とするのも有名な手で、横歩取り4五角戦法を覚えた頃の筆者は奇襲っぽさが気に入ってこれしか指さなかったのだが、最近は△3三桂とせずに△8七銀とする手をよく見かける。

「羽生の頭脳」第10巻では▲7七馬△7六銀不成▲6八馬△8八歩▲7七歩△8九歩成▲7六歩△9九と▲3六香

△3三香▲1一飛
で先手良しとされている手である。

筆者は20年前にこれを読んで以来、▲1一角成の直後の△8七銀を実際に指されたのを見たことが無かった。それが、昨年度のNHK将棋講座で紹介され、筆者は今年に入って100局も指してない中で少なくとも2回食らった。
NHK将棋講座の手順は、▲7七歩に△6七銀成▲同金△8九歩成▲5六歩で先手良しである。

△6七銀成は▲3六香に△3五歩(▲同香なら△2五飛)とする歩を用意したもの、▲5六歩はその△3五歩を消した手なのだろうか。

筆者は「羽生の頭脳」の手順もNHK将棋講座の手順も覚えておらず、△8八歩に全て▲7七桂と指して、△8九飛やら△8九歩成〜△7九とやらでやられてしまった。

しかし、参考文献[1]には上記▲5六歩の局面は先手難しいと書かれており、△8八歩に▲7七歩ではなく▲4六飛が本線とされて難解な手順が続き、さらに△7六銀不成には▲同馬△2六飛▲2七歩でもいい勝負と書いてあり、訳がわからない。
とにかく難解のようだ。

See more ...

Posted at 20:46 in 将棋 | WriteBacks (0)
WriteBacks

Nov 28, 2017

有意水準はなぜ0.05がよく使われるのか?

統計学の検定で、有意水準といえば5%である。
有意水準とは、ある仮説の下でそれより低い確率でしか起こらないはずのことが観測されたら、それはたまたまでなく意味が有り、その仮説が誤っていると判断する、確率のしきい値のことである。
1%もよく使われるし、5%に限らないと教わるが、使われるのは圧倒的に5%=0.05である。
何故0.05かについては、筆者は寡聞にして、これまで根拠や由来を目にしたことが無かった。

数ヶ月前にある所で、この0.05は統計学の大家であるフィッシャーが決めたもので、その理由は、フィッシャーが30歳の頃に、研究者としてあと20年仕事して引退するとして、その内1年くらいは失敗するだろうと思ったから、というような話を聞いた。
その話に興味を持って、結構時間をかけてWeb検索してみたのだが、それに近い話は1つも見つからなかった。有名な話なら1つくらいは見つかりそうなものなので、この話が有名だという仮説は棄却するしかなさそうだ。

有意水準として0.05という数字を最初に記したのはフィッシャーだという話はすぐに大量に見つかった。
いくつか読んだので、筆者なりにまとめておく。

"On the Origins of the .05 Level of Statistical Significance"より:


Fisher's (1925) statement in his book, Statistical Methods for Research Workers, seems to be the first specific mention of the p=.05 level as determining statistical significance.

It is convenient to take this point as a limit in judging whether a deviation is to be considered significant or not. Deviations exceeding twice the standard deviation are thus formally regarded as significant. (p. 47)

参考リンク[2]からダウンロードできる"Statistical Methods for Research Workers"の5th editionではp.45だが、上記引用部の少し前から引用すると、


The value for which P=.05, or 1 in 20, is 1.96 or nearly 2; it is convenient to take this point as a limit in judging whether a deviation is to be considered significant or not. Deviations exceeding twice the standard deviation are thus formally regarded as significant.

となっており、これが歴史上初めて、有意水準を0.05とすると便利だと記したものということらしく、至る所に引用されている。
便利である理由は、平均μ、標準偏差σの正規分布に従う確率変数がμ±2σの範囲外の値を取る確率(つまり、平均から標準偏差の2倍以上外れる確率)がほぼ5%でわかりやすいから、と読み取れる。


In the 1926 article Fisher acknowledges that other levels may be used:

If one in twenty does not seem high enough odds, we may, if we prefer it, draw the line at one in fifty (the 2 per cent point), or one in a hundred (the 1 per cent point). Personally, the writer prefers to set a low standard of significance at the 5 per cent point, and ignore entirely all results which fail to reach this level. A scientific fact should be regarded as experimentally established only if a properly designed experiment rarely fails to give this level of significance. (p. 504)

この部分も多数引用されているが、5%にしても2%にしても1%にしても良いが、Fisher自身は5%を好む、とだけ書かれており、特別に理由があった訳ではないと読める。

そもそもFisher以前から大体5%くらいの値が使われていたことについて、以下のように書かれている。


With respect to the determination of a level of significance, Student's (1908) article, in which he published his derivation of the t test, stated that "three times the probable error in the normal curve, for most purposes, would be considered significant" (p. 13).

ここで"probable error"というのは、平均からの25%点や75%点までの距離であり、標準偏差が広く使われる前によく使われていた統計量で、値としては標準偏差の約2/3である。


In any case, it is clear that as early as 1908 X ± 3PE was accepted as a useful rule of thumb for rejecting differences occurring as the result of chance fluctuations.

Student(William Gosset)は正規分布において3PEが有意だと記しており、遅くとも1908年には3PEが有意水準として受け入れられていた、とある。


A fact that would have been no surprise to most of those reading his book (and which, indeed Fisher pointed out) is that "a deviation of three times the probable error is effectively equivalent to one of twice the standard error" (Fisher, 1925, pp. 47-48).

Fisher then cannot be credited with establishing the value of the significance level. What he can perhaps be credited with is the beginning of a trend to express a value in a distribution in terms of its own standard deviation instead of its probable error.

それを受けてFisherは3PE ≒ 2σだと書いており、Fisherは有意水準を0.05とした人というよりは、"probable error"の代わりに標準偏差を使い始めた人と言えるだろう、とある。

"Why P=0.05?"より:


The impact of Fisher's tables was profound. Through the 1960s, it was standard practice in many fields to report summaries with one star attached to indicate P 0.05 and two stars to indicate P 0.01, Occasionally, three starts were used to indicate P 0.001.

検定の計算表でp≦0.05, p≦0.01, p≦0.001をそれぞれ *, **, *** と表すのは、今でもよく使われるが、Fisherに由来するらしい。ここでも有意水準として0.05が出てくる。


For such procedures to be effective, it is essential ther be a tacit agreement among researchers to use them in the same way. Otherwise, individuals would modify the procedure to suit their own purposes until the procedure became valueless. As Bross (1971) remarks,

Anyone familiar with certain areas of the scientific literature will be well aware of the need for curtailing language-games. Thus if there were no 5% level firmly established, then some persons would stretch the level to 6% or 7% to prove their point. Soon others would be stretching to 10% and 15% and the jargon would become meaningless. Whereas nowadays a phrase such as statistically significant difference provides some assurance that the results are not merely a manifestation of sampling variation, the phrase would mean very little if everyone played language-games. To be sure, there are always a few folks who fiddle with significance levels--who will switch from two-tailed to one-tailed tests or from one significance test to another in an effort to get positive results. However such gamesmanship is severely frowned upon and is rarely practiced by persons who are native speakers of fact-limited scientific languages--it is the mark of an amateur.

Fisherは有意水準を5%に限らないとしたが、後世の人は、確立した5%という基準があることが無意味な言葉遊びを生じなくしている、その反面、5%にこだわる余りに両側検定でなく片側検定にしたり、5%以下を達成するために検定方法を変えたりするアマチュアが居る、と書いている。

"Fisher and the 5% Level"より:


Table VI gave only the P = .05 percent points for the distribution of z (the log of the F-statistic) by numerator df and denominator df, for df = 1, 2, 3, 4, 5, 6, 8, 12, 24, ∞. By the third edition (1930), he had added a table giving the 1% points and enlarged the range of denominator df considerably.

Fisherの"Statistical Methods for Research Workers"の初版には、F分布表はp=0.05のものしか記載されていなかったと書かれている。
参考リンク[2]からダウンロードできる5th editionの巻末のTable VIにはp=0.01の表も含まれているが、http://psychclassics.yorku.ca/にある"STATISTICAL METHODS FOR RESEARCH WORKERS"の初版のTABLE VIには確かにp=0.05の表しか無い。
なお、"Statistical Methods for Research Workers"のF分布表の数値は、普段我々が目にするF分布表の値の自然対数の1/2になっており、分散比との比較に使う値ではなく、標準偏差の比の対数との比較に使う値のようだ。

参考リンク
[1] Michael Cowles & Caroline Davis, "On the Origins of the .05 Level of Statistical Significance", 1982
[2] R. A. Fisher, "Statistical Methods for Research Workers" fifth edition, 1934
[3] Gerard E. Dallal, "Why P=0.05?"
[4] Stephen Stigler, "Fisher and the 5% Level"
[5] Lynn D. Torbeck, "On the Verge of Significance: Why 5%"
[6] Carl Anderson, "What's the significance of 0.05 significance?"
[7] 奥村 晴彦, http://oku.edu.mie-u.ac.jp/~okumura/stat/basics.html
 下の方に、Fisherが5%を好むとしたことについて言及あり
[8] Regarding p-values, why 1% and 5%? Why not 6% or 10%? - Cross Validated

See more ...

Posted at 23:27 in 数学 | WriteBacks (0)
WriteBacks

Oct 29, 2017

RaspbianにTomcat+MySQL環境構築

続いてTomcatからMySQLが使えるよう、MySQL Connector/Jをインストールした。

■やったこと

  • aptitudeでlibmysql-javaをインストール
  • /var/lib/tomcat7/shared/に/usr/share/java/mysql-connector-java.jarへのシンボリックリンクを作成
    例:
    ln -s /usr/share/java/mysql-connector-java.jar /var/lib/tomcat7/shared/
  • /etc/tomcat7/catalina.propertiesの
    shared.loader=${catalina.home}/shared/classes,${catalina.home}/shared/*.jar
    の"home"を"base"に変更
  • Tomcatを再起動

See more ...

WriteBacks

Oct 28, 2017

Raspbianにmod_jk+Tomcatインストール

特に何に使ってる訳でもないが、このブログの過去の記事で何か書いたのが残ってるし、Tomcatは筆者のお気に入りなので、Raspbianで作り直した自宅サーバーにもインストールしておくことにした。

▪️やったこと
  • Tomcatのインストール
    • aptitudeでtomcat7とtomcat7-examplesをインストール
    • http://localhost:8080/にアクセスしてServlets examplesが何らか動くことを確認
    • 昔作ったRandomTable Servletを/var/lib/tomcat7/webapps/servlet/に配置し、
      Tomcatを再起動し、
      http://localhost:8080/servlet/RandomTableにアクセスして動くことを確認
  • mod_jkのインストール
    • aptitudeでlibapache2-mod-jkをインストール
    • /etc/libapache2-mod-jk/workers.propertiesを書き換える
      workers.tomcat_home=/usr/share/tomcat7
      workers.java_home=/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt
    • Tomcatはport 8009を待ち受ける設定に変更
      (上記ファイルにて"ajp13_worker"がport 8009に接続する設定になっている為)
      /etc/tomcat7/server.xml の Connector port="8009" ... の行のコメントアウトを外してTomcatを再起動
    • /servletへのアクセスをTomcatに転送する設定
      /etc/apache2/mods-available/jk.confの<IfModule jk_module>に
          <VirtualHost *:80>
              JkMount /servlet/* ajp13_worker
          </VirtualHost>
      
      または
          JkMount /servlet/* ajp13_worker
          JkMountCopy All
      
      を追加

See more ...

WriteBacks

Oct 11, 2017

Wolfram CDF Playerは期待外れだった

図書館からMathematicaの入門書を借りて、夏に買ったRaspberry Pi 2のMathematicaを少し使ってみた。

一昔前のワークステーション並みの速度は出ていると思うが、確かに遅い。
筆者はMathematicaは25年くらい前に大学にあったNeXTで触ったのが最初だが、その当時を思い出した。(実際には当時はもっと遅かったのだろうが)
入門書を読みながら書いてたら入力行が200くらいになったノートブックを丸ごと再計算させたら、2分かかった。
一番気になるのは、スクロール動作が遅いことで、スクロール操作を終えてから少し遅れてページが動くことがあるので、スクロールバーを操作して思った位置で止められなかったり、思った所にカーソルを当てられないことがあるのが地味にストレスになる。
まあ、筆者は主にMaximaを使っており、Mathematicaはたまにしか使わないし、本格的に使うこともまず無いので、これで満足である。

今日までずっと、Wolfram CDF Playerは前身のMathematica Playerとは違って、ノートブックの数式の評価(計算)ができるようになったものと勘違いしており、どんな数式でもRaspberry PiのMathematicaで書いてパソコンのCDF Playerで計算すれば良いと思っていたが、そうではないようだ。CDF Playerでできるのは、インタラクティブなUIを操作して変数の数値を変えて、UI上の評価結果を更新することだけらしい。
これを利用して、CDF Playerに任意の数式を評価させる手段を作成した人もいるようだが、決して便利ではない。
CDF Playerは、ほぼMathematicaそのものでプログラムサイズが巨大な割に、そのほとんどの機能が容易には使えなくされている、残念な代物のようだ。

さらに、Raspberry PiのMathematica(11.0.1.0)では再生できるのに、CDF Player(ver 11.1.1.0 for Mac)では再生できないアニメーションがあった。
Raspberry PiのMathematicaで

sol = DSolve[{y''[t] == -9.8, y'[0] == 10, y[0] == 0}, y, t];
x[t_] := 2.5 t;
Animate[Graphics[{Red, Disk[{x[t], First[y[t] /. sol]}, 0.5]},
Frame -> True, PlotRange -> {{0, 5}, {0, 5}},
GridLines -> Automatic], {t, 0, 2}, AnimationRunning -> False]

を実行すると、

このようなアニメーションが実行されるが、その状態をCDFとして保存してCDF Playerで開くと、グラフ部分がエラー表示になり、マウスカーソルを当てると
座標{$CellContext`x[0.], $CellContext`y[0.]}が数値のペア、Scaled形式、またはOffset形式ではありません。

というエラーメッセージが表示される。

また、CDF Playerで表示されるエラーメッセージには別バージョンもあり、

sol2 = DSolve[{y''[t] == -9.8, y'[0] == v0, y[0] == 0}, y, t];
Animate[Plot[First[y[t] /. sol2 /. v0 -> v], {t, 0, 2},
PlotRange -> {0, 5}], {v, 5, 10}, AnimationRunning -> False]

の出力

も同様にCDF Playerではエラーになり、
ReplaceAll: {sol2} is neither a list of replacement rules nor a valid dispatch table, and so cannot be used for replacing.

と表示される。

しかし、その下で

Show[Graphics[{Red, Disk[{x[t], First[y[0] /. sol]} /. t -> 0, 0.5]},
Frame -> True, PlotRange -> {{0, 5}, {0, 5}},
GridLines -> Automatic]]

Show[Plot[First[y[t] /. sol2 /. v0 -> 10], {t, 0, 2},
PlotRange -> {0, 5}]]

を実行して表示した、それぞれのアニメーションの1フレームは、CDF Playerでも正常に表示されるので、少なくともsol2は"a list of replacement rules"として機能しており、よくわからない。
Webで検索しても、同じようなエラーが発生するという情報すら見つからず、お手上げである。

無料だから文句は言えないが、インタラクティブなコンテンツを再生できるのが売りのCDF Playerなのに、よりによってアニメーションがエラーになるとは、残念である。

See more ...

Posted at 22:44 in 数学 | WriteBacks (0)
WriteBacks

Sep 06, 2017

要件定義が先か、要求分析が先か?

筆者は就職して約20年、一貫してソフトウェア開発の業務に関わってきた。研究や試作、性能改善などの為のものではなく、要求仕様に従って開発して最後ば残バグを0件にする、言わば品質の作り込みと品質確保を目的とするものである。
そのようなソフトウェア開発では、開発プロセスの定義が必須である。筆者も、ある時は実開発者として開発プロセスに従って作業し、ある時は外注管理担当として開発プロセスに則っているかを点検し、ある時はリーダーとしてプロセス改善に取り組み、ある時は間接業務担当として開発プロセスが崩壊してデスマーチとなる様子を眺めてきた。設計やソースコードよりも開発プロセスを最も意識して会社人生を過ごしてきたと言って過言ではない。

複数の開発プロセスを見てきて、用語の違いや揺れはかなりあったが、大体、ウォーターフォールモデル(及びスパイラルモデルの1サイクル)の開発フェーズは次のように分けられると理解してきた。


要件定義
ユーザー/顧客の言葉で、ソフトウェアに求められる要件を記述する

要求分析
ソフトウェアの仕様が一意に解釈される、完成したソフトウェアが要求を満たすかどうかを客観的に評価できる、要求仕様書を作成する

システム設計/方式設計
全体のモジュール分割、モジュールのI/F仕様(静的構造)やタスク分割(動的構造)、メモリ割り当てなど、ソフトウェア全体のトップレベルの基本設計を、プログラミング言語に依存しないレベルで行う

プログラム設計/モジュール設計/詳細設計
プログラミング言語に依存するレベルの設計やモジュールの内部設計を行う

実装
プログラムのコーディングを行う

単体テスト/モジュールテスト
モジュール内部の実装を踏まえた、網羅的なテストを行う
プログラム設計/モジュール設計/詳細設計に対応する

結合テスト
結合相手のモジュールがI/F仕様を満たしているかなどをテストする
システム設計/方式設計に対応する

システムテスト
ソフトウェア全体が要求仕様を満たしているかどうかをテストする

このように理解してきて、これまで実務上不都合はほとんど無かった。

たまに「要求分析」が「要件定義」より先になっている開発プロセスを見かけたが、たまたま、一般的な何かに基づいて作成されたように見えない、特定の会社が独自に考えたように見えるものばかりだったので、それを作った人の理解不足、きっとユーザーの「要求」を「分析」してシステムの「要件」を「定義」するという発想で字面だけで決めたものだろうと思っていた。

しかし、特にここ3年くらい、様々な企業が作成する資料で、「要求分析」が「要件定義」より先になっている開発プロセスをいくつも目にするようになって、気になるようになった。

そこで、ちょっとソフトウェア開発プロセスの「要件定義」と「要求分析」の使われ方について調べてみた。

[事例1]https://www.ipa.go.jp/files/000053941.pdf
IPA(情報処理推進機構)のサイトにある、この資料でも、「要求分析」→「要件定義」の順になっている。さらに「要求分析」→「要求定義」→「要件分析」→「要件定義」とも書かれていて、この一連の活動の成果物が要件定義書となっている。
要求分析は「顧客の要求」を分析するフェーズで、要件定義がシステムの要件を定義するフェーズという意図らしい。

[事例2]ESPR Ver.2.0
IPA/SECが作成した、ESPR(組込みソフトウェア向け開発プロセスガイド) Ver.2.0では「システム要求定義」「ソフトウェア要求定義」という言葉を使っている。開始条件として、それぞれ「製品企画として、エンドユーザーニーズが明確になっている」「製品仕様として、取説レベルの内容は決まっている前提になっている」とあり、出力はそれぞれシステム要求仕様書/ソフトウェア要求仕様書である。

[事例3]https://www.ogis-ri.co.jp/otc/hiroba/technical/RequirementsAnalysis/pdf/RequirementsAnalysis.pdf
オージス総研のサイトにある、この2007年くらいの記事では、「要求定義」の成果物が要求仕様書と書かれており、「要求定義」が要求分析を含むものと解釈できる。

[事例4]http://isw3.naist.jp/IS/TechReport/report/2011002.pdf
このレポートには「要求分析」の後に「要件定義」のように見える図があるが、本文は「要件定義」が「要件分析」/「要求分析」を含む前提で書かれている。

[事例5]JIS X 0160
ISO/IEC 15288の「利害関係者要件定義」→「要件分析」が、JIS X 0160では「利害関係者要求事項定義」→「システム要求事項分析」に対応すると書かれている。
「システム要求事項分析」の中に「要求事項の仕様化」があり、要求仕様書という言葉は使われていないが、次のフェーズが方式設計なので、このフェーズで要求仕様書が作成されるものと思われる。

[事例6]PMBOK(5th Edition)
"Collect Requirements"の次が"Define Scope"となっている。"Define Scope"において、specificationの類の単語は出て来ない。

[事例7]SWEBOK V3.0
"Requirements Elicitation"(要求抽出)
"Requirements Analysis"(要求分析)
"Requirements Specification"(要求仕様記述)
の順になっている。

[事例8]SDEM
よく知られた富士通のソフトウェア開発プロセスであるSDEMでは、「要件定義」という言葉が使われ、このフェーズが要求分析や要求仕様書作成を含むようである。

まず、「要求定義」や「要件分析」といった用語の揺れがあるが、筆者の理解では、開発プロセスの文脈において「要件」と「要求」の違いはほとんど無い。日本語的には、「要件」はシステムが満たすべきもので「要求」はユーザーが求めるものという印象があるが、元々はどちらも英語のrequirementを訳したものであり、「要件」=「要求仕様」だと思っている。「要件」は"requisite"だ、と書かれたのを何かで読んだことがあるが、筆者は英語の文献で"requisite"を目にしたことがない。
通常、"requirement"の訳は「要求」なので、表記の統一を目指せば「要件定義」は「要求定義」になるだろうが、筆者としては「要件定義」の方が日本語として自然だと思うし、Googleで調べても圧倒的に多い。

[事例1]では「要求分析」→「要求定義」→「要件分析」→「要件定義」となっているが、しかもこの一連のフェーズの成果物が要求仕様書の前段階の要件定義書だと、果たしてこれで要求分析と要件定義は明確に区別できるのだろうか?
筆者の感覚では、システムの動作仕様が一意に解釈される仕様書を作成するフェーズより前のフェーズはいくら分解しても無意味だと思う。そもそも分解したフェーズの完了基準を明確に一般化できないであろう。抽象レベルに差をつけるのであれば、結論ありきで逆算して段階的に抽象化する、無意味な工数を発生させるだけだと思う。

[事例6]も、日本語訳すれば"Collect Requirements"は「要求分析」、"Define Scope"は「要件定義」という感じなので、「要求分析」→「要件定義」であるが、同様に"Define Scope"のoutputが仕様書ではなく「要件定義書」という感じで、その先にも仕様を作成するフェーズが見当たらないので、そのままソフトウェアの開発プロセスとしては使えない。

[事例2][事例5]は要求仕様書を作成するフェーズの前にもユーザーの要求を扱うフェーズがあって、「要求定義」「要件分析」「システム要求事項分析」というフェーズで要求仕様書を作成している。

[事例3][事例4][事例8]はユーザーの要求を扱うフェーズが1つで、その大括りな「要求定義」「要件定義」というフェーズで要求分析を行い、要求仕様書を作成する。

[事例7]は要求仕様書を作成するフェーズの前に「要求分析」のフェーズがあるので、「要求分析」の成果物は、要求仕様書ではなく、要件定義書に相当するものだと思う。
ただ、少なくとも"Requirements Specification"を「要件定義」と訳す人はいないと思うので、[事例3][事例4][事例8]と同様、これらを含む大括りなフェーズの中に「要件分析」と「要求仕様書記述」があると解釈するのが妥当だろう。

こうして見ると、「要求分析」→「要件定義」の順の開発プロセスでは大体要求仕様作成、つまりソフトウェアの設計フェーズへのインプット作成まで行っていないので、何かソフトウェア開発とは異なるものを対象にしているのかも知れない。
もし「要件定義」という名前のフェーズで要求仕様書を作成するのであれば、名前からしておそらくそのフェーズで要求仕様書の前段階である要件定義書に相当するものも作成するだろうから、「要件定義」の前に似たような目的のフェーズは必要ないと思う。

筆者が冒頭で示したような、要件定義書作成フェーズと要求仕様書作成フェーズが大きく分かれているプロセスは、[事例2][事例5]のように近いものがいくつかあったが、要求仕様書を作成するフェーズの名称として「要求分析」が使われているケースは、上記の事例以外も含めて1つも見つからなかったので、「要件定義」→「要求分析」も一般的ではないようだ。筆者が最初の10年居た会社で外注管理の為に読みまくった開発プロセスには間違いなく「要求分析」と書かれていたので、個人的にショックである。そういえば、確か過去に要求仕様書作成フェーズの名前を「要求仕様」としていた開発プロセスがあり、当時はネーミングセンスが無いなあと思っていたが、今改めて考えると、よく体を表している名前だ。

最も一般的なのは、[事例3][事例4][事例7][事例8]のように、要求仕様書作成をゴールとする要件定義フェーズが要求分析を含む開発プロセスのようだ。確かに、要求仕様書作成に限らず、その前の要件定義書を作成する上でも要求分析と呼ぶべき作業は必ずあるので、不自然さが無く、これが妥当だと思った。

See more ...

Posted at 23:33 in PC一般 | WriteBacks (0)
WriteBacks