『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

決定境界によるクラス分類

クラス分類

前回記事で定義した平均交差エントロピー関数を最小化するパラメータベクトルを決定します。

共役勾配法(Conjugate Gradient Method)

今回は共役勾配法(Conjugate Gradient Method)というアルゴリズムを使うので、method には “CG” を渡しておきます。さらに、この手法ではヤコビアン (Jacobian matrix) とよばれる行列を渡す必要がありますが、ここでは grad_cee_logistic を渡しておきます。

# In[4]

from scipy.optimize import minimize

# パラメータの初期値
q0 = [2, -2]

# 平均交差エントロピー誤差関数が最小値をとるパラメータを探索
fit = minimize(cee_logistic, q0, args = (X, T),
               jac = grad_cee_logistic, method = "CG")

# パラメータを取得
q = fit.x

print("(a, b) = ({0:.3f}, {1:.3f})".format(q[0], q[1]))
# (a, b) = (0.912, -0.234)

近似関数のパラメータ $a,\ b$ が決定したので、最低気温 $x$ を与えて雨が降る確率 ($t=1$ となる確率) を求めることができるようになりました。

決定境界(Decision Boundary)

次は気温 $x$ が与えられたときに、
「雪になる ($t=0$) のか、雨になる ($t=1$) のか」
という二択情報を得られるようにします。言い換えると
「雪になる確率が高いのか、雨になる確率が高いのか」
ということです。そこで、得られた確率曲線(最適化されたロジスティック関数)が $0.5$ となる $x=b$ を境にして、雨と雪に分類することにしましょう。ひと目でわかるように、決定境界線 $x=b$ をグラフに表示しておきます。

# In[5]

# FigureとAxesの設定
fig, ax = plt.subplots(figsize = (8, 5))
ax.grid()
ax.set_xlim(-8, 8)
ax.set_ylim(-0.5, 1.5)
ax.set_yticks([0, 1])
ax.set_xlabel("Temperature [${}^\circ$C]", fontsize = 14)

# 雨は赤色、雪は青色の点で表示
ax.scatter(X[T == 0], T[T == 0], color = "blue",
           s = 16, label = "snow", zorder = 2)

ax.scatter(X[T == 1], T[T == 1], color = "red",
           s = 16, label = "rain", zorder = 2)

# Tが1となるXの要素で配列を生成し、その中から最小要素を抽出
Z = X[T == 1]
x_1 = np.min(Z)

# Tが1となるXの要素で配列を生成し、その中から最大要素を抽出
Z = X[T == 0]
x_2 = np.max(Z)

# Tが0と1の両方を取り得る範囲を塗り潰す
ax.axvspan(x_1, x_2, color = "orange",
           alpha = 0.4, zorder = 1)

# 目盛を設定
xt = range(-8, 9, 4)
xt = list(xt) + [x_1, x_2]
tt = np.arange(-0.5, 1.5, 0.25)
ax.set_xticks(xt)
ax.set_yticks(tt)

# 最適化されたパラメータでロジスティック曲線を描画
x = np.linspace(-8, 8, 257)
L = logistic(x, q)
ax.plot(x, L, color = "green")

# ★★★★★★★★★★

# 決定境界

# Xの最小要素と最大要素
X_min = np.min(X)
X_max = np.max(X)

# t=1となる確率が0.5を超える要素のインデックスを取得
L2 = np.where(L > 0.5)

# L2の最小要素
i = np.min(L2)

# 決定境界
b = (x[i] + x[i -1]) / 2
print("決定境界 x = {0:.3f}".format(b))

# 決定境界線
ax.plot([b, b], [-2, 2], color = "black",
        linestyle = "dashed", label = "Decision Boundary")

ax.legend()
plt.show()

# 決定境界 x = 0.281

Python 機械学習 決定境界(Decision Boundary)
緑色のラインが雨の降る確率を表す曲線、黒い点線が決定境界です。約 0℃ を境にして雨と雪に分かれていますね。ただし、決定境界に近くなるほど、どちらになるのかは曖昧になります。

コメント