ロジスティック関数とロジット

ロジスティック関数とロジット

ロジスティック関数

 ロジスティック方程式
 
\[\frac{dN}{dx}=aN\left( 1-\frac{N}{K}\right)\tag{1}\]
の解である ロジスティック関数 (Logistic function) は、シグモイド関数
 
\[f(x)=\frac{1}{1+\exp(-ax)}\quad (a\gt 0)\tag{2}\]
を特別な形として含む、より汎用的な関数です:
 
\[N=\frac{K}{1+\exp\left\{-a(x-x_0)\right\}}\tag{3}\]
 この定義式において $K=1,\ x_0=0$ とすればシグモイド関数となります。シグモイド関数は(パラメータ $a$ によって)曲線の形しか変えられませんでしたが、ロジスティック関数は $x_0$ によって左右に平行移動させることが可能です。このような柔軟性から、機械学習の分類問題の回帰手法 (最尤推定の記事を参照) としてロジスティック関数が用いられることがあります。
 
 次のコードは $a=1,\ K=1$ として、$x_0$ を変化させて少しずつ平行移動させたロジスティック関数をプロットします。

# PYTHON_LOGISTIC

# In[1]

# ライブラリをインポート
import numpy as np
import matplotlib.pyplot as plt

# ロジスティック関数を定義
def logistic(x, a, k, x0):
    y = k / (1 + np.exp(-a * (x - x0)))
    return y

# グラフ描画領域の設定
fig = plt.figure()
ax = fig.add_subplot(111)
ax.grid(linestyle = "--")
ax.set_title("Logistic Function", fontsize = 16)
ax.set_xlim(-8, 10)
ax.set_xlabel("x", fontsize = 16)
ax.set_ylabel("y", fontsize = 16)

# xのデータ
x = np.linspace(-10, 10, 257)

# x0を変えながらロジスティック曲線をプロット
x0 = [0, 2, 4]
for j in range(3):
    y = logistic(x, 1, 1, x0[j])
    ax.plot(x, y, label = "x0 = {}".format(x0[j]))

ax.legend()

Python ロジスティック関数

オッズとロジット

 シグモイド関数において、$a=1$ とした関数を標準シグモイド関数とよびます:
 
\[y=\frac{1}{1+e^{-x}}\tag{4}\]
 標準シグモイド関数の逆関数を ロジット またはロジット関数とよび、$\mathrm{logit}(x)$ で表します:
 
\[\mathrm{logit}(x)
=\log\left(\frac{x}{1-x}\right)=\log(x)-\log(1-x)\quad (0\lt x\lt 1)\tag{5}\]
 ロジットは主に確率・統計の分野で使用される関数で、普通は変数を $x$ の代わりに $p$ で表します:
 
\[\mathrm{logit}(p)=\log\left(\frac{p}{1-p}\right)\quad (0\lt p\lt 1)\tag{6}\]
 このとき、$p$ はある事象 $A$ が起こる確率を表します。$p/(1-p)$ はオッズとよばれる値です。
 
\[\mathrm{Odds}=\frac{p}{1-p}\tag{7}\]
 オッズは事象 $A$ が起こる確率と起こらない確率の比なので、事象 $A$ の起こりやすさの指標となります。オッズは Python でオッズ関数を定義して、グラフの概形を描いてみます。

# PYTHON_ODDS

# In[1]

import numpy as np
import matplotlib.pyplot as plt

# オッズ関数を定義
def odds(p):
    return p / (1 - p)

# データの作成
p = np.linspace(0.01, 0.99, 65)

# 描画領域の設定
fig = plt.figure()
ax = fig.add_subplot(111)
ax.grid()
ax.set_xlim(0, 1)
ax.set_ylim(0, 10)
ax.set_title("Odds", fontsize=16)
ax.set_xlabel("p", fontsize=16)
ax.set_ylabel("Odds(p)", fontsize=16)

# オッズをプロット
ax.plot(p, odds(p), color="blue")

plt.show()

Python Oddsの概形 (グラフ)
 
 オッズは $p=1/2$ のとき $1$ となり、$p$ が $1$ に迫るにつれて急激に値を増加させ、$p\to\ +1$ で $\infty$ となります。
 
 ロジットはオッズの 対数 として定義されています。
 Matplotlib でロジットの概形を描いてみます。

# PYTHON_LOGIT

# In[1]

# ロジット関数を定義
def logit(p):
    return np.log(odds(p))

# データの作成
p = np.linspace(0.01, 0.99, 65)

# 描画領域の設定
fig = plt.figure()
ax = fig.add_subplot(111)
ax.grid()
ax.set_xlim(0, 1)
ax.set_ylim(-4, 4)
ax.set_title("logit function", fontsize=16)
ax.set_xlabel("p", fontsize=16)
ax.set_ylabel("logit(p)", fontsize=16)

# ロジット関数をプロット
ax.plot(p, logit(p), color="blue")

plt.show()

ロジット関数の概形
 
 オッズは正の値のみをとるのに対し、ロジットは $p\lt 0.5$ で負の値をとる関数です。$p\to -0$ あるいは $p\to +1$ で発散する関数ですが、対数をとっているので、オッズに比べると変化は緩やかです。