Logistic Regression
Sigmoid Function
Classification problem において、(0|1)
の二つの値 Binomial に分類することを考えてみる。
仮説 h(x)
の範囲を 0 < h(x) < 1
に制限し、境界値 0.5
を境に (0|1)
に分類すればよい。シグモイド関数 Sigmoid (Logistic) function により、(0, 0.5)
に変曲点をもち (-Inf, Inf) -> (0, 1)
となる関数を実現できる。
z = 0
のときに1/(1+exp(0)) = 1/(1+1) = 0.5
となる。z >= 0
の場合、分母が指数的に減少し、1
に限りなく近づく。z < 0
の場合、分母が指数的に増加し、0
に限りなく近づく。
学習データ入力のベクトルを x
とし、パラメータを θ
とすると、h(x)
は以下のようになる。
この h(x)
の最適式を見つけることを、ロジスティック回帰 Logistic regression と呼ぶ。
結果値を y
とした時、h(x)
は y = 1
になる確率であると解釈できる。y = (1|0)
となる確率を P(y = 1), P(y = 0)
とした時、P(y = 1) + P(y = 0) = 1
が成り立つ。
Cost Function
ロジスティック回帰の場合も、線形回帰と同様にコスト関数を定義し、最急降下法で最適値に収束させれば良い。
ロジスティック回帰での誤差は
h(x)
が、期待値(0|1)
に近づくほどに0
h(x)
が、期待値(0|1)
から離れるほどに無限大
となればよい。
(-log(1), -log(0)) = (0, Inf)
であることを利用して、誤差の算出方法を以下のように定義できる。
y = (0|1)
で式が異なるので、コスト関数は y
の値によって打ち消す係数 y, 1-y
をかければよい。最急降下法での偏微分の項は線形回帰と違いはない。
Decision Boundary
シグモイド関数を g(z)
とした時、学習データの入力 (x1, x2)
を二次元グラフにプロットすると、z = 0
を境界線として、y = (1|0)
の領域で区分される。
Linear Decision Boundary
z = -2 + x1 + x2
の線形の仮説を例にすると、z = 0
すなわち x1 + x2 = 2
を満たす直線が境界線になることが分かる。
直線なので、プロットするには両端の (x1, x2)
を求めるだけでよい。x1
に対する x2
は以下で求められる。
octave> theta = [-2; 1; 1];
octave> x1 = [0 2];
octave> x2 = (-1 ./ theta(3)) .* (theta(2) .* x1 + theta(1));
octave> plot(x1, x2);
Non-linear Decision Boundary
多項式 Polynomial の場合、z = -1 + x1^2 + x2^2
を例にすると、x1^2 + x^2 = 1
を満たす曲線(この場合円形)が境界線になることがわかる。
二次元グラフに境界線をプロットするには、(x1, x2, z)
の z
軸を等高線でプロットすればよい。
n = 50;
x1 = linspace(-2, 2, n);
x2 = linspace(-2, 2, n);
z = zeros(n, n);
for i = 1:n
for j = 1:n
z(i, j) = -1 + x1(i).^2 + x2(j).^2
end
end
contour(x1, x2, z', [0 0]);
Multi-class Classification
3つ以上の複数の値に分類するには、分類ごとにロジスティック回帰を行い、それぞれの分類の回帰パラメータを保持しておく。
1:4
の分類に振り分けるとして、学習データの正解値のベクトルが y = [1; 2; 3; 2; 4; 1; 3]
の場合
y1 = [1; 0; 0; 0; 0; 1; 0]
y2 = [0; 1; 0; 1; 0; 0; 0]
y3 = [0; 0; 1; 0; 0; 0; 1]
y4 = [0; 0; 0; 0; 1; 0; 0]
のように各分類ごとに、(0|1)
の正解に変換して、分類毎に回帰パラメータを抽出する。
予測する際に、y1, y2, y3, y4
それぞれの分類の回帰パラメータ毎に計算を行ない、最も値が大きい(i.e. 最もフィットする)分類が、予測分類となる。
costFunction.m
function [J, grad] = costFunction(theta, X, y)
[m, n] = size(X);
% Apply sigmoid function
z = X * theta;
h = 1.0 ./ (1.0 + exp(-z));
% Create another theta for penalty term
t = theta;
t(1) = 0;
% The regularized cost
J = sum(-y .* log(h) - (1 .- y) .* log(1 - h)) / m;
J = J + (t' * t) / (2 * m);
% The regularized gradient of the cost
grad = ((h - y)' * X / m)';
grad = grad + (t ./ m);
end
main.m
% Number of labels
% 1: short & skinny
% 2: short & fat
% 3: tall & skinny
% 4: tall & fat
N = 4;
% Training set
X = [1 160 45; 1 160 75; 1 180 63; 1 180 105];
y = [1; 2; 3; 4];
[m, n] = size(X);
% The parameters of each label: N x (n)
Fvec = zeros(N, n);
for c = 1:N
[fvec] = fminunc(
@(a)(costFunction(a, X, y == c)),
zeros(n, 1),
optimset('GradObj', 'on', 'MaxIter', 100));
Fvec(c, :) = fvec(:);
end
% Examine new data
Data = [1 175 95; 1 176 62; 1 158 48; 1 163 78];
[p, actual] = max(Data * Fvec', [], 2);
actual % expected [4; 3; 1; 2];