我需要在下面的图表中绘制分界线:
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;
但我还想在图表中显示分隔各组的线。我该如何操作?提前感谢您。
回答:
首先,您没有正确地训练您的神经网络。您需要将circles
和crosses
都作为输入样本输入到神经网络中,并且输出需要是两个神经元的输出,其中[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
并独立查看每一列来实现 – 每列一个输入样本,并查看哪个位置给出了最大值。
完成后,我们创建一个新图形,并将属于第一类的点(即圆圈)用黄色绘制,属于第二类的点(即十字)用绿色绘制。我添加了一些透明度以确保我们可以看到带点的区域。之后,我使用您的代码正常绘制点。
使用上述代码,我得到了这个图形:
如您所见,您的模型存在一些分类错误。具体来说,有三个十字会被误分类为圆圈。您需要调整隐藏层中神经元的数量,并可能使用不同的激活函数,但这足以让您开始了。
祝您好运!