このシリーズではE資格対策として、シラバスの内容を項目別にまとめています。
線形回帰
恒等写像関数(Identity function)とは、全ての入力がそのまま出力となる関数を指します。数学的には、恒等写像関数fに対してf(x) = xが全てのxについて成り立つと言えます。
線形回帰(Linear regression)は統計学の中でも基本的な手法で、データセットのパターンを表現する線形関数を見つけることを目的としています。線形関数は、独立変数xの値に対する従属変数yの値を予測します。そのため、恒等写像関数が結果を直接反映するのと同様に、線形回帰もまた、予測値がそのまま結果となる恒等関数として解釈することができます。
ロジスティック回帰
シグモイド関数は、その形が’S’字に似ていることから名付けられた特殊な関数で、実数を0と1の間の値にマッピングする特性を持ちます。数学的には、シグモイド関数は以下の形式で表現されます。
$$
f(x) = \frac{1}{{1 + e^{-x}}}
$$
シグモイド関数の一つの重要な特性は、その出力が0と1の間であるため、確率として解釈できることです。
ロジスティクス回帰(Logistic regression)は、二値分類を予測するために用いられる統計的手法で、その出力は確率として解釈されます。従属変数が二値である場合(例えば、病気の有無、購入の有無など)、その値を予測するためにロジスティクス回帰がよく用いられます。
ロジスティクス回帰は線形回帰と似ていますが、その主要な違いは、線形回帰が恒等関数を使用するのに対し、ロジスティクス回帰はシグモイド関数を使用することです。したがって、ロジスティクス回帰の出力は、確率として解釈することができ、特定の事象が発生する可能性を評価するために使用されます。ロジスティクス回帰の出力は次のような数式で表されます。
$$
p(X) = \frac{1}{{1 + e^{-(\beta_0 + \beta_1X)}}}
$$
ロジスティック回帰の学習方法
ロジスティック回帰では、観測された目的変数とモデルによる予測の間で、全データに対する負の対数尤度(Negative Log-Likelihood)関数を最小化することを目指します。この最小化は最尤推定法と呼ばれ、モデルのパラメータを最適化します。
負の対数尤度関数は以下のように表されます。
$$
-\log L(\beta) = -\sum_{i=1}^{n} [y_i \log(\hat{y_i}) + (1-y_i) \log(1 – \hat{y_i})]
$$
この負の対数尤度関数を最小化するという意味では、ロジスティック回帰は実質的には、観測値と予測値が一致する確率を最大化することを試みています。このプロセスは最尤推定と呼ばれ、結果として得られるパラメータは最尤推定量です。
この最小化は通常、勾配降下法やニュートン法などの最適化アルゴリズムを用いて数値的に実行されます。これらの手法はパラメータの初期値から始まり、負の対数尤度関数の勾配(または二次微分)を計算し、パラメータを更新して関数の値を徐々に減少させるというプロセスを繰り返します。
次に、パラメータの解釈についてです。ロジスティック回帰では、パラメータはオッズ比に関連して解釈されます。オッズとは、あるイベントが起こる確率と起こらない確率の比のことで、以下のように定義されます:
$$
\text{Odds}(A) = \frac{P(A)}{1-P(A)}
$$
ロジスティック回帰の実装例
ランダムに生成した入力データx
と、x
の最初の要素が0より大きいかどうかで生成した真の値y_true
を使用しています。学習率を0.1
として、1000回のイテレーションで勾配降下法による学習を行います。
import numpy as np
class Sigmoid:
def forward(self, x, w, b):
"""
x.shape = (データ数, 次元数)
w.shape = (1, 次元数)
b.shape = (1,)
"""
self.x = x
z = np.sum(w * x, axis=1) + b
self.y_pred = 1 / (1 + np.exp(-z))
return self.y_pred
def backward(self, dy):
"""
dy.shape = (データ数, )
"""
dz = dy * (1.0 - self.y_pred) * self.y_pred
dw = np.sum(self.x * dz.reshape(-1,1), axis=0)
db = np.sum(dz)
return dw, db
class NegativeLogLikelihood:
def forward(self, y_pred, y_true):
"""
y_pred.shape = (データ数,)
y_true.shape = (データ数,)
"""
self.y_pred = y_pred
self.y_true = y_true
loss = - (y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))
return loss.sum()
def backward(self):
dy = - (self.y_true / self.y_pred) + ((1 - self.y_true) / (1 - self.y_pred))
return dy
def execute():
sg = Sigmoid()
x = np.random.randn(10, 3)
w = np.random.randn(1, 3)
b = np.array([1.0])
nll = NegativeLogLikelihood()
y_true = x[:, 0] > 0
# パラメータw,bを勾配法によって最適化する
lr = 0.1
for i in range(1000):
y_pred = sg.forward(x, w, b)
loss = nll.forward(y_pred, y_true)
dy = nll.backward()
dw, db = sg.backward(dy)
w -= lr * dw
b -= lr * db
y_pred = sg.forward(x, w, b)
y_pred = y_pred > 0.5
print("y_pred\n", y_pred)
print("y_true\n", y_true)
execute()
実行結果:
y_pred
[False False True True False True True True False False]
y_true
[False False True True False True True True False False]
サポートベクターマシン(SVM)
サポートベクターマシン(SVM)は、機械学習の一分野である教師あり学習を用いた分類問題や回帰問題の解法の一つです。SVMは、データの特徴空間におけるマージン(即ち、異なるクラスのデータ間の間隔)を最大化する超平面を見つけることで動作します。このマージンの最大化は、汎化能力の向上に寄与します。
サポートベクターは、SVMの重要な要素です。これは、マージンの端に位置するデータポイントで、超平面の位置を決定します。サポートベクター以外のデータポイントは、モデルの決定に影響を与えません。
実際のデータは、線形分割可能ではない場合が多いです。SVMは、非線形分割を行うためにカーネルトリックを使用します。これは、データをより高次元の空間にマッピングし、それにより線形分割を可能にする手法です。
しかし、すべてのデータ点が正しく分割できるとは限らないため、一部のデータ点がマージン内部または誤った側に位置することを許容するためのソフトマージンという考え方が導入されました。これを導入するために、スラック変数が使用されます。スラック変数は、各データ点がどの程度マージンの誤った側に位置しているかを表します。このスラック変数の合計を最小化することにより、分類誤差を低減することができます。
動径基底関数
動径基底関数(Radial Basis Function, RBF)は、一般に中心からの距離に基づいて値が変化する関数です。これらの関数は、距離の関数であり、原点からの距離(つまり、半径)に依存します。このような関数は、一般に以下の形式をとります:
$$
f(\mathbf{x}) = \phi(| \mathbf{x} – \mathbf{c} |)
$$
ここで、xは入力ベクトル、cは関数の中心を表すベクトル、そして∥⋅∥∥⋅∥はベクトルのノルム(通常はユークリッドノルム)を示しています。関数ϕは任意のスカラー関数で、通常は非負で、原点で最大値を取ります。
機械学習、特にSVMの文脈では、RBFはカーネル関数として頻繁に使用されます。RBFカーネルは、以下の形式をとります:
$$
K(\mathbf{x}, \mathbf{y}) = \exp(-\gamma | \mathbf{x} – \mathbf{y} |^2)
$$
ここで、γは正の定数で、関数の幅を制御します。このRBFカーネルは、SVMで非線形分類を行う際のカーネルトリックの一部として用いられます。
まとめ
最後までご覧いただきありがとうございました。