グラフィカルモデリング・機械学習などでよく使う正規分布の性質
グラフィカルモデリング・機械学習などでよく使う正規分布の性質
グラフィカルモデリング・機械学習などでよく使う正規分布の性質のメモ
随時追加予定.
参考:
正規分布に従う確率変数を線形変換してもまた正規分布になる
参考:永田靖, 多変量解析法入門, p.41
として,行列$\mathbf{A}$での線形変換$\mathbf{A}\vec{x}$を考える
期待値と分散の線形変換を考えればいい.
$$ E[ \mathbf{A}\vec{x} ] = \mathbf{A} E[\vec{x}] = \mathbf{A} \vec{\mu} $$
よって,
例:2次元 to 1次元
また,これは次元数の変換にもなる.
次の行列で線形変換,つまり和$x_{1} + x_{2}$の正規分布にとなる.
$$ \mathbf{A} = \begin{pmatrix} 1 & 1 \end{pmatrix} $$
$$ \mathbf{A} \vec{x} \sim \mathrm{Norm}_{\mathbf{A} \vec{x}}(0, 2) $$
import scipy as sp import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec import scipy.stats as stats %matplotlib inline xmin, xmax, ymin, ymax = -3, 3, -3, 3 x, y = sp.mgrid[xmin:xmax:.01, ymin:ymax:.01] mu = sp.array([+1, -1]) cov = sp.identity(2) N2 = stats.multivariate_normal(mean=mu, cov=cov) pos = sp.dstack((x, y[:,::-1])) # print(pos) pdf = N2.pdf(pos) fig = plt.figure(figsize=(4, 8)) gs = gridspec.GridSpec(2, 1) ax = fig.add_subplot(gs[0, 0]) ax.imshow(pdf, cmap="hot", extent=[xmin, xmax, ymin, ymax]) # plt.contourf(x, y, pdf, cmap="hot", ) ax.set_title("$N((+1,-1), \\mathbf{I}_{2} )$") ax.set_xlabel("$x_{1}$") ax.set_ylabel("$x_{2}$") # Ax A = sp.matrix([1, 1]) N = stats.multivariate_normal(mean=A.dot(mu), cov=A.dot(cov).dot(A.T)) x_ = sp.linspace(-3, 3, 200) ax = fig.add_subplot(gs[1, 0]) ax.plot(x_, N.pdf(x_)) ax.set_title("$\mathbf{A}\\vec{x} \sim N(0, 2)$") plt.tight_layout() plt.show()
多次元正規分布を周辺化してもまた正規分布になる
多次元正規分布に従う確率変数ベクトルを次のような2つのブロックに分ける.
このとき,$\vec{x}_{2}$で周辺化して消去すると,$\vec{1}$の正規分布になる.
同様に,$\vec{x}_{1}$で周辺化して消去すると,$\vec{2}$の正規分布になる.
補題:ブロック行列の逆行列の導出
参考:SimonJ.D.Prince,Computer Vision Models, Learning, and Inference, Problem 5.4
を求める.
導出:
を満たすように求める.
4つの連立方程式が出てくる.
これを解くことで$\mathbf{W}, \mathbf{X}, \mathbf{Y}, \mathbf{Z}$ を求められる.
$\mathbf{W}$:
(3)より$\mathbf{Y} = -\mathbf{D}^{-1}\mathbf{C}\mathbf{W}$
(1)より,
$$ \mathbf{A}\mathbf{W}+\mathbf{B}(-\mathbf{D}^{-1}\mathbf{C}\mathbf{W}) = \mathbf{I}\\ (\mathbf{A} - \mathbf{B}\mathbf{D}^{-1}\mathbf{C})\mathbf{W} = \mathbf{I}\\ \mathbf{W} = (\mathbf{A} - \mathbf{B}\mathbf{D}^{-1}\mathbf{C})^{-1} $$
$\mathbf{Y}$:
$$ \mathbf{Y} = -\mathbf{D}^{-1}\mathbf{C}\mathbf{W} = -\mathbf{D}^{-1}\mathbf{C}(\mathbf{A} - \mathbf{B}\mathbf{D}^{-1}\mathbf{C})^{-1} $$
$\mathbf{X}$:
(4)式より,$\mathbf{Z} = \mathbf{D}^{-1}(\mathbf{I} - \mathbf{C}\mathbf{X})$
(2)式に代入して
$$ \mathbf{A}\mathbf{X}+\mathbf{B}\mathbf{Z} = \mathbf{0}\\ \mathbf{A}\mathbf{X}+\mathbf{B}(\mathbf{D}^{-1}(\mathbf{I} - \mathbf{C}\mathbf{X})) = \mathbf{0}\ \mathbf{A}\mathbf{X}+\mathbf{B}\mathbf{D}^{-1} - \mathbf{B}\mathbf{D}^{-1}\mathbf{C}\mathbf{X} = \mathbf{0} \\ \mathbf{A}\mathbf{X} - \mathbf{B}\mathbf{D}^{-1}\mathbf{C}\mathbf{X} = - \mathbf{B}\mathbf{D}^{-1} \\ (\mathbf{A} - \mathbf{B}\mathbf{D}^{-1}\mathbf{C})\mathbf{X} = - \mathbf{B}\mathbf{D}^{-1} \\ \mathbf{X} = - (\mathbf{A} - \mathbf{B}\mathbf{D}^{-1}\mathbf{C})^{-1}\mathbf{B}\mathbf{D}^{-1} $$
$\mathbf{Z}$:
導出
確率密度関数(pdf)の中の逆行列をブロック行列に置き換える.
$\mathrm{dim}(\vec{x}_{1}) = D_{1}, \mathrm{dim}(\vec{x}_{2}) = D_{2}, \mathrm{dim}(\vec{x}) = D_{1} + D_{2}$とする.
ブロック行列の逆行列より,
ブロック行列を使ってpdfを展開する.
ここから$\vec{x}_{1}$について2次形式の形を作る.
クロス項の変形:
定数項の追加:
ブロック行列の行列式より
以上より2つの正規分布に分けられる.
よって,$\vec{x_{1}}$で周辺化すると
条件付分布もまた正規分布になる
同時分布の周辺化からそのまま導出できる. 同時分布と条件付分布の関係は,確率の乗法定理(場合によってはbayes ruleともいう)より,
つまり,同時分布から$\vec{x_{2}}$の分布の項を消せば条件付分布になる.
同時分布の周辺化より,
だったので,
よって,積分で周辺化してた項が条件付分布になっている.
平均と分散の記号を直せば,
よって,条件付正規分布の平均パラメータは,
よって,
$\vec{x}_{1}$と$\vec{x}_{2}$を入れ替えた条件付分布も同様で,添え字を入れ替えるだけで求められる
正規分布の密度関数(pdf)の積もまた正規分布になる
正規分布に従う確率変数ベクトル$\vec{x}$があり, この確率変数ベクトルについて平均と分散が異なる確率密度関数(pdf)の積 もまた正規分布になる.
結果として以下の正規分布になる.
導出
積の対象の正規分布を以下とする.
このpdfの積は,以下になる.
expの中を展開する.
共分散行列は対称行列, 対称行列の逆行列も対称行列より,以下の関係が成立することに注意する.
$$ (\mathbf{A}^{-1})^{T} = \mathbf{A}^{-1} \\ (\mathbf{B}^{-1})^{T} = \mathbf{B}^{-1} $$
そして,以下の記号で置き換えると,
$$ \mathbf{C} = \mathbf{A}^{-1} + \mathbf{B}^{-1} \\ \vec{d} = \mathbf{A}^{-1}\vec{a} + \vec{B}^{-1}\vec{b} $$
2次形をつくるために$+ \vec{d}^{T}\mathbf{C}^{-1}\vec{d} - \vec{d}^{T}\mathbf{C}^{-1}\vec{d} = 0$を追加する.
$\mathbf{C}^{-1}\mathbf{C}=\mathbf{C}\mathbf{C}^{-1}=\mathbf{I}$とおいて各項に入れる.
とおいて
よって,expは,2つの項に分けることができる.
結果,1つの正規分布(最初の項)は以下の式になる.
より,
次に定数項となる2番目の項を展開する.
$$ \exp{\left( -\frac{1}{2}(\vec{a}^{T}\mathbf{A}^{-1}\vec{a} + \vec{b}^{T} \mathbf{B}^{-1}\vec{b} - \vec{d}^{T}\mathbf{C}^{-1}\vec{d}) \right)} $$
の中を展開する.
上式の各項を変形する.
よって,まとめると
expの中身は以下の2次形式になる.
よって,定数項は,以下の正規分布になる.
exp外の共分散行列の行列式をまとめる.
よって,pdfの積により,密度の式の係数にある分母の行列式は以下のように分解される.
すべてをまとめると,
可視化・コード
実際にpdfの積を描画してみる.
積の値は実際には定数がかかるので,基本的に密度の値が小さくなる.
import scipy as sp from scipy import stats import matplotlib.pyplot as plt %matplotlib inline x = sp.linspace(-5, 5, 1000) mu1, s21 = (1, 1) mu2, s22 = (-1, 1) N1 = stats.norm(loc=mu1, scale=sp.sqrt(s21)) N2 = stats.norm(loc=mu2, scale=sp.sqrt(s22)) prod = N1.pdf(x) * N2.pdf(x) c = stats.norm(loc=mu1, scale=sp.sqrt(s21+s22)).pdf(mu2) print("constant:", c) prod_s2 = 1 / ( 1/s21 + 1/s22) prod_m = prod_s2 * (mu1 / s21 + mu2 / s22) print(f"prodN({prod_m},{prod_s2})") prodN = stats.norm(loc=prod_m, scale=sp.sqrt(prod_s2)) plt.plot(x, N1.pdf(x), linestyle="--", label="$N1({0:}, 1)$".format(mu1)) plt.plot(x, N2.pdf(x), linestyle="--", label="$N2({0:}, 1)$".format(mu2)) plt.plot(x, prod, label="prod") s = prod/c plt.plot(x, s, label="prod/constant", linestyle="--", alpha=0.5) # print("sum prod/c:", sp.sum((s[:-1] + s[1:]) * sp.diff(x)/2)) plt.plot(x, prodN.pdf(x), label=f"prodN({prod_m: .2f}, {prod_s2: .2f})", alpha=0.5) plt.xlabel("$x$") plt.legend() plt.tight_layout() plt.show()
平均パラメータ中の変数で変換しても正規分布になる
ベイズで$Pr(x|y)$から$Pr(y|x)$への計算に使える.
where
行列$\mathbf{A}$は対称行列でなくてもいい.
また,各記号の次元は,
導出
参考:http://www0.cs.ucl.ac.uk/external/s.prince/book/AnswerBookletStudents.pdf
$\vec{y}$が変数でそれ以外が定数なのでそのように分ける.
として
より,
2次形式を満たすように定数
を追加する.
分布になるように係数を追加する.
定数がどうなっているか
2つの目は ]$をで線形変換したものより
よって,
可視化・コード
import scipy as sp import matplotlib.pyplot as plt import scipy.stats as stats sigma2 = 0.01 a = 1 b = -.1 x = sp.linspace(0, 1, 500) y = sp.linspace(1, 0, 500) pdf = sp.empty((len(y), len(x))) for i in sp.arange(len(y)): N = stats.norm(loc=a*y[i]+b, scale=sp.sqrt(sigma2)) pdf[i] = N.pdf(x) plt.figure() plt.imshow(pdf, cmap="hot", extent=[0, 1, 0, 1]) y = 0.5 plt.plot(x, y + 0.05 * stats.norm(loc=a*y+b, scale=sp.sqrt(sigma2)).pdf(x), label="$\mathrm{Norm}_{x}[a\cdot 0.5 + b, \Sigma ]$", color="b") plt.colorbar() plt.legend() plt.xlabel("x") plt.ylabel("y") plt.tight_layout() plt.show()
sigma2 = 0.01 a = 1 b = -.1 sigma2_ = 1/(a * 1/sigma2 * a) a_ = sigma2_ * a * 1/sigma2 b_ = -a_ * b x = sp.linspace(0, 1, 500) y = sp.linspace(1, 0, 500) pdf_T = sp.empty((len(x), len(y))) for i in sp.arange(len(x)): N = stats.norm(loc=a_*x[i]+b_, scale=sp.sqrt(sigma2_)) pdf_T[i] = N.pdf(y) plt.figure() plt.imshow(pdf_T.T, cmap="hot", extent=[0, 1, 0, 1]) x = 0.5 plt.plot(x + 0.05 * stats.norm(loc=a_*x + b_, scale=sp.sqrt(sigma2_)).pdf(y), y, label="$\mathrm{Norm}_{y}[a'\cdot 0.5 + b', \Sigma' ]$", color="b") plt.colorbar() plt.legend() plt.xlabel("x") plt.ylabel("y") plt.tight_layout() plt.show()