%%
% One Neuron (Learn)
% 2020/6/14 T. Hirano
%
err_eps = 0.005;
eps = 0.01;
alpha = 2;      % シグモイド関数のパラメータ

% 学習データ（学習データは複数で行ごとに分けている）
a = [0 0; 1 0; 0 1]; % 入力
b = [0  ; 1  ; 1  ]; % 出力

sz_a = size(a);
nl = sz_a(1);   % 学習データ数
ni = sz_a(2);   % 入力素子数

w = rand(1, ni+1);    % 結線重みの初期化
grad_err = zeros(1, ni+1);

err_max = 1;
while (err_max > err_eps)
    for l=1:nl
        a_now = [1 a(l,:)];
        b_now = b(l);
        
        err = 1;
        s=w*(a_now');
        ys = sigmoid(alpha,s);
        while (err > err_eps)
            grad_err = 2.*(ys-b_now) ...
                     .*(alpha.*ys.*(1-ys)) ...
                     *a_now;
            w = w - eps.*grad_err;

            s=w*(a_now');
            ys = sigmoid(alpha,s);
            err = (ys-b_now).^2;
        end
    end

    % 各学習データの誤差の計算
    err_each_learn = zeros(1,nl);
    for l=1:nl
        a_now = [1 a(l,:)];
        b_now = b(l);
        
        s=w*(a_now');
        ys = sigmoid(alpha,s);
        err_each_learn(l) = (ys-b_now).^2;
    end
    err_max = max(err_each_learn);
end

% Check
l=2;
s=w*([1 a(l,:)])'
ys=sigmoid(alpha,s)
(ys-b(l)).^2
%
s=w*([1 0 0])';
ys=sigmoid(alpha,s)

%%
% Definition of sigmoid function
%
function y = sigmoid(alpha,s)
    y=1./(1+exp(-alpha.*s));
end