3A
  • Portfolio Top
  • Categories
  • Tags
  • Archives

Ex.9 Kullback-Leibler Divergence

Q9

解答¶

1¶

$$ \begin{cases} \begin{aligned} g(1) &= 1-1=0 & g^{\prime}(1) &= 1-0 = 1\\ h(1) &= \log(1)=0 &h^{\prime}(1)&= \frac{1}{1} = 1 \end{aligned} \end{cases} $$

より、接する。実際にグラフを描いて確かめてみる。

In [1]:
import numpy as np
import matplotlib.pyplot as plt
In [2]:
g = lambda x:x-1
h = lambda x:np.log(x)
In [3]:
X = np.linspace(1e-2,5,1000)
In [4]:
plt.plot(X,g(X), color="red",  label="$g(x)=x-1$"), plt.scatter(1,g(1),color="red" , s=100, alpha=0.5)
plt.plot(X,h(X), color="blue", label="$h(x)=\log(x)$"), plt.scatter(1,h(1),color="blue", s=100, alpha=0.5)
plt.grid(), plt.xlabel("$x$"), plt.ylabel("$y$"), plt.legend()
plt.show()

2¶

$d(x) = x-1-\log(x)$ は、$1$ で調べたように $x=1$ で $d(1) = 0$ となる。

また、$d^{\prime}(x) = \begin{cases}1-\frac{1}{x} > 0 & (\text{when $x>1$})\\1-\frac{1}{x} \leq 0 & (\text{when $x\leq1$})\end{cases}$ となることから、$d$ は $1>x>0$ で単調減少し、$x>1$ で単調増加することがわかる。

以上より、題意が成立する。ついでにこのグラフも描いてみる。

In [5]:
plt.plot(X,g(X)-h(X), color="green", label="$d(x)=x-1-\log(x)$"), 
plt.scatter(1,g(1)-h(1), color="green", label="$x=1$", s=100)
plt.axvspan(1,5,color="red",alpha=0.2), plt.axvspan(0,1,color="blue",alpha=0.2)
plt.grid(), plt.xlabel("$x$"), plt.ylabel("$y$"), plt.legend()
plt.show()

3¶

$p_k>0$ だから、

$$ \begin{aligned} p_kd\left(\frac{q_k}{p_k}\right) &= p_k\left(\frac{q_k}{p_k} - 1 - \log\left(\frac{q_k}{p_k}\right)\right)\\ &= q_k - p_k + p_k\log\left(\frac{p_k}{q_k}\right)\\ &\geq0\quad\left(\text{with equality if and only if $p_k=q_k$}\right)\\ \therefore p_k\log\left(\frac{p_k}{q_k}\right) &\geq p_k-q_k\\ \sum_{k=1}^mp_k\log\left(\frac{p_k}{q_k}\right) &\geq \sum_{k=1}^m\left(p_k-q_k\right)\quad\left(\text{with equality if and only if $p_k=q_k$, giving $k=1,\ldots,m$}\right)\\ \therefore \mathrm{KL}\left(p\|q\right) &\geq 0 \end{aligned} $$

4¶

$$ \begin{aligned} \hat{\boldsymbol{\theta}} &= \underset{\boldsymbol{\theta}}{\text{argmin}} \mathrm{KL}\left(p_D\|q_{\boldsymbol{\theta}}\right)\\ &= \underset{\boldsymbol{\theta}}{\text{argmin}} \int p_D(x)\log\left(\frac{p_D(x)}{q_{\boldsymbol{\theta}}(x)}\right)dx\\ &= \underset{\boldsymbol{\theta}}{\text{argmin}} \sum_{k=1}^np_D(x_k)\log\left(\frac{p_D(x_k)}{q_{\boldsymbol{\theta}}(x_k)}\right)\\ &= \underset{\boldsymbol{\theta}}{\text{argmin}} \left(-\sum_{k=1}^np_D(x_k)\log\left(q_{\boldsymbol{\theta}}(x_k)\right)\right)\\ &= \underset{\boldsymbol{\theta}}{\text{argmax}} \sum_{k=1}^n\frac{1}{n}\log\left(p\left(x_k|\boldsymbol{\theta}\right)\right) \end{aligned} $$

したがって、題意が成り立つ。

これは、

  • 「経験分布 $p_D$ に対するモデル分布 $q_{\boldsymbol{\theta}}$ の Kullback-Leibler Divergence の最小化
  • 「経験分布 $p_D$ について平均をとったモデル分布 $q_{\boldsymbol{\theta}}$ の対数尤度 の最大化

が等しいことを表す。


KL Divergence¶

以下では、問題と直接関係ないが、いくつかの確率分布で実際にKL-Divergenceを求めてみる。

確率分布名 scipy クラス
正規分布 stats.norm
ベータ分布 stats.beta
$\chi$ 二乗分布 stats.chi2
F分布 stats.f
ガンマ分布 stats.gamma
t分布 stats.t
一様分布 stat.uniform
In [6]:
from scipy import stats
In [7]:
N = 1000
xmin = -3
xmax = 3
In [8]:
x   = np.linspace(xmin,xmax,N)
y   = stats.norm.pdf(x)
dXs = np.arange(-1,0.2,0.2)
In [9]:
n_fig = len(dXs)
n_col = 3
n_row = n_fig//n_col if n_fig%n_col==0 else n_fig//n_col+1
In [10]:
def KL_diver(P,Q):
    return np.sum([q*np.log(q/p) for p,q in zip(P,Q)])
In [11]:
fig = plt.figure(figsize=(6*n_col, 4*n_row))
for i,dx in enumerate(dXs):
    ax = fig.add_subplot(n_row,n_col,i+1)
    y_ = stats.norm.pdf(x+dx)
    ax.plot(x,y, "b"), ax.fill_between(x,0,y, color="b",alpha=0.3)
    ax.plot(x,y_,"r"), ax.fill_between(x,0,y_,color="r",alpha=0.3)
    ax.set_title(f"KL Divergence: {KL_diver(y,y_):.2f}")
plt.tight_layout()
plt.show()
In [ ]:
 

  • « Ex.8 Multivariate Normal Distribution
  • Ex.10 Expectation Maximization Algorithm »
hidden
Table of Contents
Published
Nov 4, 2019
Last Updated
Nov 4, 2019
Category
情報基礎実験(木立)
Tags
  • 3A 127
  • 情報基礎実験(木立) 20
Contact
Other contents
  • Home
  • Blog
  • Front-End
  • Kerasy
  • Python-Charmers
  • Translation-Gummy
    • 3A - Shuto's Notes
    • MIT
    • Powered by Pelican. Theme: Elegant