ガウス関数

ガウス関数

ガウス関数

ガウス関数の定義

 ガウス関数 (Gaussian function)
 
\[\varphi(x)=a\exp\left\{-\frac{(x-\mu)^2}{2\sigma^2}\right\}\]
で定義される関数です。$\mu$ は中心の位置、$\sigma$ は関数の広がりを決める定数です。機械学習の分野では近似曲線の線形基底関数として用いられることがあります。ガウス関数を Python で実装してグラフの形を確認してみましょう。

# https://python.atelierkobato.com/gaussian/
# リストA-1 ガウス関数 (Gaussian function)

# NumPyとMatplotlibをインポート
import numpy as np
import matplotlib.pyplot as plt

# ガウス関数を定義
def gauss(x, a = 1, mu = 0, sigma = 1):
    return a * np.exp(-(x - mu)**2 / (2*sigma**2))

# Figureを作成
fig = plt.figure(figsize = (8, 6))

# FigureにAxesを追加
ax = fig.add_subplot(111)

# Axesのタイトルを'Gaussian Function'に設定
ax.set_title("Gaussian Function", fontsize = 16)

# 目盛線を表示
ax.grid()

# 軸ラベルを設定
ax.set_xlabel("x", fontsize = 14)
ax.set_ylabel("y", fontsize = 14)

# 軸範囲を設定
ax.set_xlim([-4, 8])
ax.set_ylim([0, 1.2])

# -4~8まで0.1刻みの数値の配列
x = np.arange(-4, 8, 0.1)

# グラフに描く関数
f1 = gauss(x)
f2 = gauss(x, a = 0.5, mu = 2, sigma = 2)

# Axesにガウス関数を描画
ax.plot(x, f1, color = "red", label = "a=1.0, μ=0, σ=1")
ax.plot(x, f2, color = "blue", label = "a=0.5, μ=2, σ=2")

# 凡例の表示
ax.legend(fontsize = 14)

Python ガウス関数(gaussian function)のグラフ

 コードの中で定義した gauss() は x のみを必須引数とし、a, mu, sigma はそれぞれ $a,\ \mu,\ \sigma$ に対応するオプション引数となっています。赤いラインは $a=1,\ \mu=0,\ \sigma=1$ としたガウス関数
 
\[\varphi(x)=\exp\left(-\frac{x^2}{2}\right)\]
のグラフです。青いラインは
 
\[\varphi(x)=\frac{1}{2}\exp\left\{-\frac{(x-2)^2}{8}\right\}\]
のグラフです。赤いラインと比較すると、ピーク値は半分 ($a=0.5$) になり、中心位置(ピークの位置)は右にずれ ($\mu=2$)、全体の幅は $2$ 倍になっています ($\sigma=2$)。

 ガウス関数を全区間 $(-\infty,\ \infty)$ で積分して値が $1$ になるようにパラメータ $a$ を定めると
 
\[a=\frac{1}{\sqrt{2\pi}\sigma}\]
が得られます(≫ ガウス積分についてはこちらの記事を参照してください)。このように 規格化されたガウス関数
 
\[N(\mu,\sigma^2)=\frac{1}{\sqrt{2\pi}\sigma}\exp\left\{-\frac{(x-\mu)^2}{2\sigma^2}\right\}\]
のことを 正規分布 (normal distribution) とよびます。このとき、$\mu$ は平均値、$\sigma^2$ は分散を表すパラメータとなります。
 

ガウス関数の重ね合わせ

 ガウス関数 は機械学習において基底関数として用いられることがあります。ガウス関数を適切に重ね合わせると、たとえば人間の平均身長や国の人口などの成長曲線を近似することができます。以下のサンプルコードは、中心位置 $\mu$ を少しずつずらしたガウス関数を重ね合わせたグラフを描きます。

# https://python.atelierkobato.com/gaussian/
# リストB-1 ガウス関数の重ね合わせ

# NumPyとMatplotlibをインポート
import numpy as np
import matplotlib.pyplot as plt

# ガウス関数を定義
def gauss(x, a = 1, mu = 0, sigma = 1):
    return a * np.exp(-(x - mu)**2 / (2*sigma**2))

# Figureを作成
fig = plt.figure(figsize = (8, 6))

# FigureにAxesを追加
ax = fig.add_subplot(111)

# Axesのタイトルを'Gaussian Function'に設定
ax.set_title("Gaussian Function", fontsize = 16)

# 目盛線を表示
ax.grid()

# 軸ラベルを設定
ax.set_xlabel("x", fontsize = 14)
ax.set_ylabel("y", fontsize = 14)

# 軸範囲を設定
ax.set_xlim([-3, 3])
ax.set_ylim([0, 3])

# -3~3まで0.1刻みの数値の配列
x = np.arange(-3, 3, 0.1)

# 関数fの初期値
f = 0

# 中心位置をずらしながら重ね合わせる
for k in range(5):
    g = gauss(x, mu = k)
    ax.plot(x, g, label = "φ{}".format(k))
    f += g

# Axesに重ね合わせたガウス関数を描画
ax.plot(x, f, color = "black", label = "φ0+φ1+φ2+φ3+φ4")

# 凡例を表示
ax.legend()

# ファイルを保存
plt.savefig("gauss.png", bbox_inches = "tight")

python gauss function (ガウス関数) の重ね合わせ
 

2変数ガウス関数

 2変数のガウス関数
 
\[\varphi(\boldsymbol{\mathrm{r}})=a\exp\left\{-\frac{1}{2}(\boldsymbol{\mathrm{r}}-\boldsymbol{\mu})^T\Sigma^{-1}(\boldsymbol{\mathrm{r}}-\boldsymbol{\mu})\right\}\]
で表されます。$\boldsymbol{\mathrm{\mathrm{r}}}$ と $\boldsymbol{\mu}$ はそれぞれ位置ベクトルと平均ベクトルです。
 
\[\boldsymbol{\mathrm{r}}=\begin{bmatrix}
x\\ y\end{bmatrix},\quad \boldsymbol{\mu}=\begin{bmatrix}
\mu_x\\ \mu_y\end{bmatrix}\]
 $\Sigma$ は共分散行列とよばれる $2\times 2$ の行列です。
 
\[\Sigma=\begin{bmatrix}\sigma_1^2 &\sigma_{12}\\
\sigma_{12}& \sigma_2^2\end{bmatrix}\]
 全区間で積分したときに $1$ になるように規格化すると、
 
\[a=\frac{1}{2\pi}\frac{1}{\sqrt{\mathrm{det}\Sigma}}\]
となります。$\mathrm{det}\Sigma$ は $\Sigma$ の行列式であり、
 
\[\mathrm{det}\Sigma=\sigma_{1}^2\sigma_{2}^2-\sigma_{12}^2\]
によって計算されます。規格化された $2$ 変数ガウス
 
\[\varphi(\boldsymbol{\mathrm{r}})=\frac{1}{2\pi}\frac{1}{\sqrt{\mathrm{det}\Sigma}}\exp\left\{-\frac{1}{2}(\boldsymbol{\mathrm{r}}-\boldsymbol{\mu})^T\Sigma^{-1}(\boldsymbol{\mathrm{r}}-\boldsymbol{\mu})\right\}\]
は $2$ 変数正規分布の確率密度関数を表しています。$2$ 変数正規分布は scipy.stats の multivariate_normal.pdf() で計算できます。

# https://python.atelierkobato.com/gaussian/
# リストC-1 2変数ガウス関数

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from scipy.stats import multivariate_normal

# FigureとAxesの設定
fig = plt.figure(figsize = (8, 6))
ax = fig.add_subplot(111, projection='3d')
ax.set_xlim(-6.0, 6.0)
ax.set_ylim(-6.0, 6.0)
ax.set_zlim(0.0, 0.14)
ax.set_xlabel("x", size = 16)
ax.set_ylabel("y", size = 16)
ax.set_zlabel("z", size = 16)
ax.view_init(elev = 45, azim = 45)

# 格子点を作成
n = 128
x = np.linspace(-6, 6, n)
y = np.linspace(-6, 6, n)
X, Y = np.meshgrid(x, y)
pos = np.dstack((X, Y))

# 2変数ガウス分布
mu = np.array([0.5, 1.0])
sigma  = np.array([[1.0, 0.2],[-0.2, 1.0]])
Z = multivariate_normal(mu, sigma).pdf(pos)

# 曲面を描画
ax.plot_surface(X, Y, Z, cmap = "coolwarm",
                cstride = 1, rstride = 1)

plt.show()

2変数ガウス分布確率密度関数