私は matlabニューラル ネットワーク ツールボックスをいじっていましたが、予期しないことがいくつかありました。私の問題は特に、隠れ層がなく、1 つの入力と tansig 伝達関数しかない分類ネットワークにあります。したがって、この分類器は、学習した入力の重みとバイアスによって定義されるある時点で 1D データセットを分割することを期待しています。
まず、与えられた入力 x に対する出力 y を計算する式は、y = f(x*w + b) であり、w は入力の重み、b はバイアスであると考えました。ネットワークの出力を計算するための正しい式は何ですか?
また、データセット全体を特定の値 (+77) だけ変換すると、バイアスや重みに大きな影響があると予想しました。しかし、そうではないようです。データセットの翻訳がバイアスと重みにあまり影響しないのはなぜですか?
これは私のコードです:
% Generate data
p1 = randn(1, 1000);
t1(1:1000) = 1;
p2 = 3 + randn(1, 1000);
t2(1:1000) = -1;
% view data
figure, hist([p1', p2'], 100)
P = [p1 p2];
T = [t1 t2];
% train network without hidden layer
net1 = newff(P, T, [], {'tansig'}, 'trainlm');
[net1,tr] = train(net1, P, T);
% display weight and bias
w = net1.IW{1,1};
b = net1.b{1,1};
disp(w) % -6.8971
disp(b) % -0.2280
% make label decision
class_correct = 0;
outputs = net1(P);
for i = 1:length(outputs)
% choose between -1 and 1
if outputs(i) > 0
outputs(i) = 1;
else
outputs(i) = -1;
end
% compare
if T(i) == outputs(i)
class_correct = class_correct + 1;
end
end
% Calculate the correct classification rate (CCR)
CCR = (class_correct * 100) / length(outputs);
fprintf('CCR: %f \n', CCR);
% plot the errors
errors = gsubtract(T, outputs);
figure, plot(errors)
% I expect these to be equal and near 1
net1(0) % 0.9521
tansig(0*w + b) % -0.4680
% I expect these to be equal and near -1
net1(4) % -0.9991
tansig(4*w + b) % -1
% translate the dataset by +77
P2 = P + 77;
% train network without hidden layer
net2 = newff(P2, T, [], {'tansig'}, 'trainlm');
[net2,tr] = train(net2, P2, T);
% display weight and bias
w2 = net2.IW{1,1};
b2 = net2.b{1,1};
disp(w2) % -5.1132
disp(b2) % -0.1556
異なる平均を持つ正規分布を持つ 2 つの母集団で構成される人工データセットを生成しました。これらの母集団をヒストグラムにプロットし、それを使用してネットワークをトレーニングしました。データセット全体の正しく分類されたインスタンスのパーセンテージである正しい分類率を計算します。これは約 92% であるため、分類器が機能していることがわかります。
しかし、私は net1(x) と tansig(x*w + b) が同じ出力を与えると思っていましたが、そうではありません。トレーニング済みネットワークの出力を計算するための正しい式は何ですか?
また、net1 がトレーニングされているデータセットの翻訳バージョン (+77) で net2 がトレーニングされているため、net1 と net2 の重みやバイアスが異なると予想しました。データセットの翻訳がバイアスと重みにあまり影響しないのはなぜですか?