このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

同時確率分布の圏の使用例:超具体的

昨日の記事「同時確率分布の圏」で、圏FinProbCoupは、「潜在的には使っている圏です。」「ベイズ確率の計算では使っています。」とか書きました。「使ったことねーよ」と言われそうなので事例を挙げておきます。圏論的定式化を気にしないで、計算の事例として読むことも出来るでしょう。

よくある例で、3台の機械A, B, Cで、とある製品を製造するとしましょう。不良品が出ることがあります。この状況で次のような同時確率分布を考えます。全体における比率だけが問題で製品の製造個数は問題にしません。成分(表の欄)は比率なので、その総和は1です。

A B C
良品 Aからの良品の比率 Bからの良品の比率 Cからの良品の比率
不良品 Aからの不良品の比率 Bからの不良品の比率 Cからの不良品の比率

この表を実際の数値で埋めれば、縦方向、横方向に総和を取って周辺確率分布は求まります。X = {A, B, C}, Y = {良品, 不良品} とすると、この確率分布はX×Y上の確率分布なので同時確率分布、つまり、圏FinProbCoupにおけるXからYへの射 f:(X, p)→(Y, q) in FinProbCoup となります。pは上記の表の縦方向の総和、qは横方向の総和による確率分布です。

いきなり同時確率分布ではなくて、機械の不良率の情報が与えられることが普通です。例えば:

A B C
良品 95% 99% 97%
不良品 5% 1% 3%

この行列をFとしましょう。F自体は同時確率分布にはなってません。しかし、どの列の総和も1になっています。このように列(縦方向)の総和が1である行列をマルコフ行列といいます。マルコフ行列FがX×Y上で定義されているとき、X上の確率分布が分かれば同時確率分布を作れます。この場合、X = {A, B, C} 上の確率分布は各機械ごとの製造個数比率です。

10% 70% 20%
A B C

見出し(A, B, C)を下にしたのは意図的で、確率分布をテキストで書くときは (10%/A, 70%/B, 20%/C) のように書くことにします。そうすれば、表とテキストが似た形になります。

X = {A, B, C} 上の分布pが与えられれば、pの成分をマルコフ行列Fの各列に掛けてX×Y上の同時確率分布を求めることができます。

10% 70% 20%
A B C
良品 95%×10% 99%×70% 97%×20%
不良品 5%×10% 1%×70% 3%×20%

その後で横方向に総和すると、Y側周辺確率分布qも求まります。求めたqを左端の列として加えます。

10% 70% 20%
A B C
98.2% 良品 9.5% 69.3% 19.4%
1.8% 不良品 0.5% 0.7% 0.6%

この表の見方は:

  1. 一番上の行はX側周辺確率分布 p = (10%/A, 70%/B, 20%/C)
  2. 一番左の列はY側周辺確率分布 q = (98.2%/良品, 1.8%/不良品)
  3. 内側の2行3列が、X×Y = {A, B, C}×{良品, 不良品} = {(A, 良品), (A, 不良品), (B, 良品), (B, 不良品), (C, 良品), (C, 不良品)} 上の同時確率分布

この表を圏FinProbCoup内で考えると、f:(X, p)→(Y, q) という射です。

さて、もうひとつの射 g:(Y, q)→(Z, r) in FinProbCoup を考えましょう。製造機械とは別に製品の検査機械があって、検査機械が不良品を見つけると自動的に破棄します。しかし、検査機械にも誤認識があって、良品を破棄したり、不良品を通してしまうことがあります。その様子は次のとおり。

良品 不良品
通過 98% 5%
破棄 2% 95%

この行列(表)も、列(縦方向)成分を足すと1なのでマルコフ行列です。Y = {良品, 不良品} 上の確率分布として、先の値 q = (98.2%/良品, 1.8%/不良品) を使いましょう。qの成分を各列に掛けると、次の表が出来上がります。

98.2% 1.8%
良品 不良品
96.326% 通過 96.236% 0.09%
3.674% 破棄 1.964% 1.71%

この表の見方は:

  1. 一番上の行はY側周辺確率分布 q = (98.2%/良品, 1.8%/不良品)
  2. 一番左の列はZ側周辺確率分布 r = (96.326%/通過, 3.674%/破棄)
  3. 内側の2行2列が、Y×Z = {良品, 不良品}×{通過, 破棄} = {(良品, 通過), (良品, 破棄), (不良品, 通過), (不良品, 破棄)} 上の同時確率分布

f:(X, p)→(Y, q), g:(Y, q)→(Z, r) in FinProbCoup なので、fとgの結合(合成) f;g:(X, p)→(Z, r) が定義できます。結合の計算方法は h := f;g として:

  • h(x, z) = Σ(y∈Y | f(x, y)(1/q(y))g(y, z))

6成分を具体的に書くと:

  • h(A, 通過) = Σ(y∈{良品, 不良品} | f(A, y)(1/q(y))g(y, 通過))
  • h(A, 破棄) = Σ(y∈{良品, 不良品} | f(A, y)(1/q(y))g(y, 破棄))
  • h(B, 通過) = Σ(y∈{良品, 不良品} | f(B, y)(1/q(y))g(y, 通過))
  • h(B, 破棄) = Σ(y∈{良品, 不良品} | f(B, y)(1/q(y))g(y, 破棄))
  • h(C, 通過) = Σ(y∈{良品, 不良品} | f(C, y)(1/q(y))g(y, 通過))
  • h(C, 破棄) = Σ(y∈{良品, 不良品} | f(C, y)(1/q(y))g(y, 破棄))

さらに総和記号Σを足し算に直して:

  • h(A, 通過) = f(A, 良品)(1/q(良品))g(良品, 通過) + f(A, 不良品)(1/q(不良品))g(不良品, 通過))
  • h(A, 破棄) = f(A, 良品)(1/q(良品))g(良品, 破棄) + f(A, 不良品)(1/q(不良品))g(不良品, 破棄))
  • h(B, 通過) = f(B, 良品)(1/q(良品))g(良品, 通過) + f(B, 不良品)(1/q(不良品))g(不良品, 通過))
  • h(B, 破棄) = f(B, 良品)(1/q(良品))g(良品, 破棄) + f(B, 不良品)(1/q(不良品))g(不良品, 破棄))
  • h(C, 通過) = f(C, 良品)(1/q(良品))g(良品, 通過) + f(C, 不良品)(1/q(不良品))g(不良品, 通過))
  • h(C, 破棄) = f(C, 良品)(1/q(良品))g(良品, 破棄) + f(C, 不良品)(1/q(不良品))g(不良品, 破棄))

数値を代入すると:

  • h(A, 通過) = 9.5%(1/98.2%)96.236% + 0.5%(1/1.8%)0.09%
  • h(A, 破棄) = 9.5%(1/98.2%)1.964% + 0.5%(1/1.8%)1.71%
  • h(B, 通過) = 69.3%(1/98.2%)96.236% + 0.7%(1/1.8%)0.09%
  • h(B, 破棄) = 69.3%(1/98.2%)1.964% + 0.7%(1/1.8%)1.71%
  • h(C, 通過) = 19.4%(1/98.2%)96.236% + 0.6%(1/1.8%)0.09%
  • h(C, 破棄) = 19.45(1/98.2%)1.964% + 0.6%(1/1.8%)1.71%

あるいは行列計算で:

\begin{bmatrix}96.236\% & 0.09\% \\ 1.964\%  & 1.71\% \\ \end{bmatrix}\begin{bmatrix} 1/(98.2\%)  & 0     \\ 0      & 1/(1.8\%)  \\ \end{bmatrix}\begin{bmatrix} 9.5\% & 69.3\% & 19.4\% \\  0.5\% &  0.7\% &  0.6\% \\ \end{bmatrix}

R言語で計算(電卓叩くよりは楽)してみると:


> f
[,1] [,2] [,3]
[1,] 0.095 0.693 0.194
[2,] 0.005 0.007 0.006
> qi # 1/q(y)
[,1] [,2]
[1,] 1.01833 0.00000
[2,] 0.00000 55.55556
> g
[,1] [,2]
[1,] 0.96236 0.0009
[2,] 0.01964 0.0171
> x <- g %*% qi %*% f
> x
[,1] [,2] [,3]
[1,] 0.09335 0.67949 0.19042
[2,] 0.00665 0.02051 0.00958
>

マルコフ行列FとGの積(順序はGF)を求めて、それにpを掛けてもかまいません。下の計算では、確率分布pを対角行列にして右から行列の掛け算をしています。


> p
[1] 0.1 0.7 0.2
> F
[,1] [,2] [,3]
[1,] 0.95 0.99 0.97
[2,] 0.05 0.01 0.03
> G
[,1] [,2]
[1,] 0.98 0.05
[2,] 0.02 0.95
> P <- diag(p)
> P
[,1] [,2] [,3]
[1,] 0.1 0.0 0.0
[2,] 0.0 0.7 0.0
[3,] 0.0 0.0 0.2
> G %*% F %*% P
[,1] [,2] [,3]
[1,] 0.09335 0.67949 0.19042
[2,] 0.00665 0.02051 0.00958
>

最後の結果が f;g : (X, p)→(Z, r) in FinProbCoup で、表の形に整形すれば:

10% 70% 20%
A B C
96.326% 通過 9.335% 67.949% 19.042%
3.674% 破棄 0.665% 2.051% 0.958%

これは、各機械A, B, Cで作られた製品が検査機械で通過/破棄される比率の表です。X×Z = {A, B, C}×{通過, 破棄} = {(A, 通過), (A, 破棄), (B, 通過), (B, 破棄), (C, 通過), (C, 破棄)} 上の同時確率分布であり、X = {A, B, C} 上の確率分布 (10%/A, 70%/B, 20%/C) と、Y = {通過, 破棄} 上の確率分布 (96.326%/通過, 3.674%/破棄) を周辺確率分布として持ちます。


同時確率分布の圏FinProbCoupにおける射の結合計算を「潜在的には使っている」は嘘ではないでしょ。比率(確率)の表が複数あって、それらを組み合わせて何かしたいときは、たいてい同時確率分布の圏やマルコフ行列の圏のなかで計算を行っています。ベイズ推論をするときは、マルコフ行列の転置(ベイズ反転)も使っています。意識はしてなくても、やってることは圏論的計算になっています。