Matlab神经网络给出意想不到的结果

时间:2013-06-05 15:48:44

标签: neural-network classification matlab

我正在玩matlab neural network toolbox,我遇到了一些我没想到的事情。我的问题尤其在于没有隐藏层的分类网络,只有1个输入和tansig传递函数。所以我希望这个分类器在某一点划分一维数据集,该数据集由学习的输入权重和偏差定义。

首先,我认为计算给定输入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和net2具有不同的权重和/或偏差,因为net2是在训练net1的数据集的翻译版本(+77)上训练的。为什么数据集的翻译对偏差和权重没有太大影响?

1 个答案:

答案 0 :(得分:2)

首先,您的代码保留默认的MATLAB输入预处理。您可以通过以下方式查看:

net2.inputs{1}

当我把你的代码放进去的时候我得到了这个:

    Neural Network Input
              name: 'Input'
    feedbackOutput: []
       processFcns: {'fixunknowns', removeconstantrows,
                    mapminmax}
     processParams: {1x3 cell array of 2 params}
   processSettings: {1x3 cell array of 3 settings}
    processedRange: [1x2 double]
     processedSize: 1
             range: [1x2 double]
              size: 1
          userdata: (your custom info)

processFncs设置为mapminmax的重要部分。根据文档,mapminmax将“通过将行最小值和最大值映射到[-1 1]来处理矩阵”。这就是为什么你随意“改变”(重新采样)你的输入没有效果。

我认为通过“计算输出”意味着检查网络的性能。您可以首先在数据集上模拟网络(请参阅doc nnet/sim),然后使用perform功能检查“正确性”。它将使用与训练时相同的成本函数:

% get predictions
[Y] = sim(net2,T);
% see how well we did
perf = perform(net2,T,Y);

Boomshuckalucka。希望有所帮助。