クラス分類
前回記事で定義した平均交差エントロピー関数を最小化するパラメータベクトルを決定します。
共役勾配法(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
緑色のラインが雨の降る確率を表す曲線、黒い点線が決定境界です。約 0℃ を境にして雨と雪に分かれていますね。ただし、決定境界に近くなるほど、どちらになるのかは曖昧になります。
【ChatGPT講義】共役勾配法の直感的な説明
共役勾配法は、関数の最小値を求める方法の一つです。例えば、地形を表す曲面があったとして、その中にある一番低い場所(最小値)を見つけるイメージです。共役勾配法を理解するには、次の2つの重要な要素を考えます:
1. 勾配(Gradient):これは、関数の傾きの方向を表します。関数が上に凸な曲面をしている場合、傾きは山を登る方向を指し、関数が下に凸な曲面をしている場合は傾きは谷を降りる方向を指します。
2. 共役(Conjugate):これは、2つのベクトルが特定の条件を満たすときに使われます。ベクトルとは、数値を並べたもので、矢印で示されることがあります。
共役勾配法では、関数の最小値を求めるために、2つの重要なステップを繰り返します:
ステップ1:初期点の設定
まず、どこかの点から計算を始めます。この点を初期点と呼びます。
ステップ2:最小値を探す
a. 初期点での勾配を計算します。これにより、関数が現在どの方向に進むべきかを知ることができます。
b. その勾配の方向と共役な方向に進むように新しい点を設定します。つまり、一回り前に進んだときの方向と直交する方向に進みます。
c. 新しい点での勾配を計算し、これを繰り返します。このステップを繰り返すことで、最小値にどんどん近づいていきます。
共役勾配法は、計算を繰り返すたびに、それまでに得られた情報を使って最適な方向を見つけるため、効率的に最小値に近づいていく方法です。地形の比喩を使って言うと、共役勾配法は、最小値を見つけるために、山を登ったり谷を降りたりしながら、最短距離で一番低い場所を目指す方法だと言えます。