在MATLAB中绘制分界MLP线与图表

我需要在下面的图表中绘制分界线:

enter image description here我用来训练MLP神经网络的代码如下:

circles = [1 1; 2 1; 2 2; 2 3; 2 4; 3 2; 3 3; 4 1; 4 2; 4 3];crosses = [1 2; 1 3; 1 4; 2 5; 3 4; 3 5; 4 4; 5 1; 5 2; 5 3];net = feedforwardnet(3);net = train(net, circles, crosses);plot(circles(:, 1), circles(:, 2), 'ro');hold onplot(crosses(:, 1), crosses(:, 2), 'b+');hold off;

但我还想在图表中显示分隔各组的线。我该如何操作?提前感谢您。


回答:

首先,您没有正确地训练您的神经网络。您需要将circlescrosses都作为输入样本输入到神经网络中,并且输出需要是两个神经元的输出,其中[1 0]作为输出表示分类应属于圆圈类,而[0 1]表示分类应属于十字类。

此外,每一是一个输入样本,而每一行是一个特征。因此,您需要转置这两个矩阵并创建一个更大的输入矩阵。您还需要根据我们刚才讨论的内容来制作您的输出标签:

X = [circles.' crosses.'];Y = [[ones(1, size(circles,1)); zeros(1, size(circles,1))] ...     [zeros(1, size(crosses,1)); ones(1, size(crosses,1))]];

现在训练您的网络:

net = feedforwardnet(3);net = train(net, X, Y);

现在,如果您想确定每个点属于哪个类别,您只需查看哪个神经元输出最大,哪个输出最大,该点就属于哪个类别。


现在,回答您的问题,如果您使用MATLAB工具箱,神经网络没有直接的方法来显示分隔“线”。然而,您可以显示分隔的区域,并可能添加一些透明度,以便您可以将此覆盖在图形上。

为此,定义一个跨越您两个类的二维坐标网格,但要更细致一些…比如…0.01。将此通过神经网络运行,查看最大输出神经元是什么,然后在您的图形上相应地标记。

我想到了这样的方法:

%// 生成测试数据[ptX,ptY] = meshgrid(1:0.01:5, 1:0.01:5);Xtest = [ptX(:).'; ptY(:).'];%// 查看输出标签是什么out = sim(net, Xtest);[~,classes] = max(out,[],1);%// 现在绘制区域figure;hold on;%// 绘制第一类区域plot(Xtest(1, classes == 1), Xtest(2, classes == 1), 'y.');%// 添加透明度alpha(0.1);%// 绘制第二类区域plot(Xtest(1, classes == 2), Xtest(2, classes == 2), 'g.');%// 添加透明度alpha(0.1);%// 现在添加点plot(circles(:, 1), circles(:, 2), 'ro');plot(crosses(:, 1), crosses(:, 2), 'b+');

前两行代码生成了一系列测试(x,y)点,并确保它们在一个2行输入矩阵中,因为这是网络输入所需的格式。我使用meshgrid来生成这些点。接下来,我们使用sim来模拟或将输入输入到神经网络中。完成后,我们将对每个输入点得到两个输出神经元的网络响应,我们查看哪个输出神经元给出了最大的响应。如果第一个输出给出了最大的响应,我们认为该输入属于第一类。否则,它属于第二类。这通过使用max并独立查看每一列来实现 – 每列一个输入样本,并查看哪个位置给出了最大值。

完成后,我们创建一个新图形,并将属于第一类的点(即圆圈)用黄色绘制,属于第二类的点(即十字)用绿色绘制。我添加了一些透明度以确保我们可以看到带点的区域。之后,我使用您的代码正常绘制点。


使用上述代码,我得到了这个图形:

enter image description here


如您所见,您的模型存在一些分类错误。具体来说,有三个十字会被误分类为圆圈。您需要调整隐藏层中神经元的数量,并可能使用不同的激活函数,但这足以让您开始了。

祝您好运!

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注