機械学習 はじめよう

第14回 ベイズ線形回帰を実装してみよう

この記事を読むのに必要な時間:およそ 5 分

事後分布の平均と共分散を求める

先ほどのコードでのxlist=~で始まる行から下はグラフを描く部分です。

ということは,普通の線形回帰そのもののコードは次の一行だけだったことがわかります。

w = np.linalg.solve(np.dot(PHI.T, PHI), np.dot(PHI.T, t))

この一行をベイズ線形回帰にあわせて書き換えるのが第一ミッションです。

より具体的に言うと,前回紹介した事後分布N(w|μNN)の平均μNと共分散行列ΣNを求めるコードを書くことになります。

この式を実装するには,文字αとβをどうにかしなくてはなりません。これらの考察は後ほど見ることにして,ここではひとまずα=0.1, β=9.0とおいて進めることにします。

あとは単なる行列の計算ですから,ほぼ逐語訳でnumpyのコードに落とすことができます。

alpha = 0.1 
beta = 9.0 

Sigma_N = np.linalg.inv(alpha * np.identity(PHI.shape[1]) + beta * np.dot(PHI.T, PHI))
mu_N = beta * np.dot(Sigma_N, np.dot(PHI.T, t))

こうして求めたmu_Nを使ってグラフを描けばめでたしめでたしですが,せっかくですからベイズ線形回帰(青線)と普通の線形回帰(緑線)の両方をグラフに重ねて見比べましょう。

matplotlibのplot関数は続けて呼び出すことでグラフを重ねて描くことができます。色を指定するには,第3引数に'b'(青),'g'(緑色)のように色を表す文字を指定します。

xlist = np.arange(0, 1, 0.01) 
plt.plot(xlist, [np.dot(w, phi(x)) for x in xlist], 'g') 
plt.plot(xlist, [np.dot(mu_N, phi(x)) for x in xlist], 'b') 
plt.plot(X, t, 'o') 
plt.show()

画像

具体的には,事後確率が最大となる値をwの推定値としているわけですが,これは前回の最後で確認したように,正則化付きの線形回帰の結果と一致します。

このように,パラメータに事後分布を最大化する値を選ぶ手法を「MAP推定」⁠Maximum a Posterior)と呼びます。

共分散の眺め方

これで一応ベイズ線形回帰を実装して問題を解いた格好にはなりましたが,しかしこれだけではわざわざベイジアンで解いた甲斐がありません。例えば共分散ΣNは実質使ってませんよね。

そこでまず,共分散とはなんだろうという話をしましょう。

一次元の分布の「分散」はわかりやすいです。正規分布で具体的に説明すると,分散がσ2であるとは,平均を中心として-σから+σの範囲に約7割の点が,-3σから+3σの範囲に99.7%の点が入るくらいの「ばらけ具合」を表しています。

余談ですが,学校や入試のテストで使われる偏差値とは平均50で分散102つまり40から60の範囲に約7割の,20から80の範囲に99.7%の受験者が入るくらいに点数を正規化したものだったりします(実際には正規分布ではないのでズレがあります⁠⁠。

しかし多次元の「共分散」は行列になりますから,そこまで単純な話ではすみません。その正体を知るために,先ほどのサンプルコードで求めた共分散行列ΣNを表示して眺めてみましょう。ただしΣNは12x12の結構大きい行列なのでそのまま表示すると見にくいですから,少し整形して表示します。

# print "\n".join(' '.join("% .2f" % x for x in y) for y in Sigma_N)

 2.94 -2.03 -0.92 -1.13 -1.28 -1.10 -1.21 -1.14 -1.23 -1.06 -0.96 -2.08
-2.03  2.33 -0.70  1.95  0.13  1.02  0.85  0.65  0.98  0.70  0.65  1.44
-0.92 -0.70  2.52 -1.86  1.97 -0.29  0.42  0.59  0.13  0.40  0.32  0.63
-1.13  1.95 -1.86  3.02 -1.66  1.50  0.17  0.29  0.73  0.33  0.36  0.82
-1.28  0.13  1.97 -1.66  2.82 -1.11  1.39  0.22  0.55  0.49  0.40  0.92
-1.10  1.02 -0.29  1.50 -1.11  2.39 -1.35  1.72 -0.29  0.53  0.46  0.69
-1.21  0.85  0.42  0.17  1.39 -1.35  2.94 -2.06  2.39 -0.02  0.25  1.01
-1.14  0.65  0.59  0.29  0.22  1.72 -2.06  4.05 -2.72  1.43  0.37  0.67
-1.23  0.98  0.13  0.73  0.55 -0.29  2.39 -2.72  3.96 -1.41  1.23  0.59
-1.06  0.70  0.40  0.33  0.49  0.53 -0.02  1.43 -1.41  3.30 -2.27  2.05
-0.96  0.65  0.32  0.36  0.40  0.46  0.25  0.37  1.23 -2.27  3.14 -0.86
-2.08  1.44  0.63  0.82  0.92  0.69  1.01  0.67  0.59  2.05 -0.86  2.45

まずこれを見ると,共分散行列は対称行列であることがわかります。

そこで「対角成分⁠⁠,つまり左上の(1,1)成分から右下の(4,4)成分まで順に斜めに取ったものと,上三角行列に分けて,見やすくしましょう。

# 対角成分

(1)   (2)   (3)   (4)   (5)   (6)   (7)   (8)   (9)   (10)  (11)  (12) 
 2.94  2.33  2.52  3.02  2.82  2.39  2.94  4.05  3.96  3.30  3.14  2.45 
# 上三角行列の成分

    (2)   (3)   (4)   (5)   (6)   (7)   (8)   (9)   (10)  (11)  (12) 
(1) -2.03 -0.92 -1.13 -1.28 -1.10 -1.21 -1.14 -1.23 -1.06 -0.96 -2.08 
(2)       -0.70  1.95  0.13  1.02  0.85  0.65  0.98  0.70  0.65  1.44 
(3)             -1.86  1.97 -0.29  0.42  0.59  0.13  0.40  0.32  0.63 
(4)                   -1.66  1.50  0.17  0.29  0.73  0.33  0.36  0.82 
(5)                         -1.11  1.39  0.22  0.55  0.49  0.40  0.92 
(6)                               -1.35  1.72 -0.29  0.53  0.46  0.69 
(7)                                     -2.06  2.39 -0.02  0.25  1.01 
(8)                                           -2.72  1.43  0.37  0.67 
(9)                                                 -1.41  1.23  0.59 
(10)                                                      -2.27  2.05 
(11)                                                            -0.86 

これが正味の共分散行列の情報量となります。

実はこの対角成分と上三角行列をそれぞれ解釈することで,共分散行列を読み解くことができます。

まず対角成分ですが,これは対応するパラメータを単独で見た場合の分散にあたります※1⁠。したがって,対角成分は一次元の正規分布の分散と同じように読むことができるわけです。

この例では一番小さいものでも2.33と,どの対角成分もあまり小さくありません。おそらくデータが少ないため,パラメータ推定の精度があまり高くないのだろうということが読みとれます。

そして三角行列の成分は,対応するパラメータ同士の相関を表しています。0だと相関なし(互いに独立⁠⁠,正の値だと片方が平均より大きいときはもう片方も平均より大きくなる傾向が,逆に負の値なら平均より小さくなる傾向がある,という具合です。

独立,正の相関,負の相関

独立 正の相関 負の相関

上の例をじっくり眺めてみると,ガウス基底を使った場合,定数項の係数(第1パラメータ)とそれ以外のパラメータ,および隣同士のガウス基底の係数は負の相関があり,離れたガウス基底同士はおおむね正の相関があるがどれもだいたい弱い(0に近い⁠⁠,ということが読みとれます。これは線形回帰がどのように関数を作るか少し考えてみれば納得いくのではないでしょうか。

実際に問題を解くときは共分散行列をわざわざこのように眺めることはあまりしません。しかし,どういう意味を持つのかわかっている方がやはりいいですよね。例えば計算間違いやバグのせいでとんでもない値が求まってしまったときにも気づくことができるかもしれません。

※1
より正確には他のパラメータを積分して消した場合の分散。

著者プロフィール

中谷秀洋(なかたにしゅうよう)

サイボウズ・ラボ(株)にてWebアプリ連携や自然言語処理を中心に研究開発を行いながら,英単語タイピングゲーム iVocaをサービス提供している。

URLhttp://d.hatena.ne.jp/n_shuyo/
Twitterhttp://twitter.com/shuyo