Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MATLAB中用图表绘制除法MLP线_Matlab_Plot_Machine Learning_Neural Network_Classification - Fatal编程技术网

在MATLAB中用图表绘制除法MLP线

在MATLAB中用图表绘制除法MLP线,matlab,plot,machine-learning,neural-network,classification,Matlab,Plot,Machine Learning,Neural Network,Classification,我需要将分割线与下图一起绘制: 我用来训练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

我需要将分割线与下图一起绘制:

我用来训练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 on
plot(crosses(:, 1), crosses(:, 2), 'b+');
hold off;

但我也想在图表中显示分组之间的分隔线。我该如何进行?提前谢谢。

首先,你没有正确训练你的神经网络。您必须同时使用
交叉
作为神经网络的输入样本,并且输出必须是两个神经元的输出,其中
[10]
,因为输出将表示圆类是分类应该是什么,而
[01]
是交叉分类应该是什么

此外,每一列都是一个输入样本,而每一行都是一个特征。因此,您必须转换这两个,并生成一个更大的输入矩阵。您还需要按照我们刚才讨论的内容制作输出标签:

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. 在神经网络中运行,看看最大输出神经元是什么,然后在你的图形上相应地标记

我想到了这样的事情:

%// Generate test data
[ptX,ptY] = meshgrid(1:0.01:5, 1:0.01:5);
Xtest = [ptX(:).'; ptY(:).'];

%// See what the output labels are
out = sim(net, Xtest);
[~,classes] = max(out,[],1);

%// Now plot the regions
figure;
hold on;
%// Plot the first class region
plot(Xtest(1, classes == 1), Xtest(2, classes == 1), 'y.');
%// Add transparency
alpha(0.1);

%// Plot the second class region
plot(Xtest(1, classes == 2), Xtest(2, classes == 2), 'g.');
%// Add transparency
alpha(0.1);

%// Now add the points
plot(circles(:, 1), circles(:, 2), 'ro');
plot(crosses(:, 1), crosses(:, 2), 'b+');
前两行代码生成一组测试
(x,y)
点,并确保它们位于两行输入矩阵中,因为这是网络输入所需的。我使用它来生成这些点。接下来,我们使用模拟或将输入输入到神经网络中。一旦我们这样做了,我们将有两个输出神经元神经网络响应每个输入点,我们看看哪个输出神经元给了我们最大的响应。如果第一个输出给了我们最大的响应,我们认为输入属于第一类。如果不是,那就是二等舱。通过独立地使用和查看每个列(每个输入样本一列)以及查看哪个位置为我们提供了最大值,可以简化这一过程

一旦我们这样做了,我们创建一个新的图形,并用黄色绘制属于类别1的点,这是圆,第二个类别是十字,这是绿色。我增加了一些透明度,以确保我们可以看到带有点的区域。之后,我使用您的代码按正常方式绘制点


通过上面的代码,我得到了这个数字:


如您所见,您的模型存在一些分类错误。具体来说,有三个十字架可能会被误分类为圆圈。你将不得不在隐藏层中使用大量的神经元,也可能使用不同的激活功能,但这肯定足以让你开始


祝你好运

首先,你没有正确训练你的神经网络。您必须同时使用
交叉
作为神经网络的输入样本,并且输出必须是两个神经元的输出,其中
[10]
,因为输出将表示圆类是分类应该是什么,而
[01]
是交叉分类应该是什么

此外,每一列都是一个输入样本,而每一行都是一个特征。因此,您必须转换这两个,并生成一个更大的输入矩阵。您还需要按照我们刚才讨论的内容制作输出标签:

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. 在神经网络中运行,看看最大输出神经元是什么,然后在你的图形上相应地标记

我想到了这样的事情:

%// Generate test data
[ptX,ptY] = meshgrid(1:0.01:5, 1:0.01:5);
Xtest = [ptX(:).'; ptY(:).'];

%// See what the output labels are
out = sim(net, Xtest);
[~,classes] = max(out,[],1);

%// Now plot the regions
figure;
hold on;
%// Plot the first class region
plot(Xtest(1, classes == 1), Xtest(2, classes == 1), 'y.');
%// Add transparency
alpha(0.1);

%// Plot the second class region
plot(Xtest(1, classes == 2), Xtest(2, classes == 2), 'g.');
%// Add transparency
alpha(0.1);

%// Now add the points
plot(circles(:, 1), circles(:, 2), 'ro');
plot(crosses(:, 1), crosses(:, 2), 'b+');
前两行代码生成一组测试
(x,y)
点,并确保它们位于两行输入矩阵中,因为这是网络输入所需的。我使用它来生成这些点。接下来,我们使用模拟或将输入输入到神经网络中。一旦我们这样做了,我们将有两个输出神经元神经网络响应每个输入点,我们看看哪个输出神经元给了我们最大的响应。如果第一个输出给了我们最大的响应,我们认为输入属于第一类。如果不是,那就是二等舱。通过独立地使用和查看每个列(每个输入样本一列)以及查看哪个位置为我们提供了最大值,可以简化这一过程

一旦我们这样做了,我们创建一个新的图形,并用黄色绘制属于类别1的点,这是圆,第二个类别是十字,这是绿色。我增加了一些透明度,以确保我们可以看到带有点的区域。之后,我使用您的代码按正常方式绘制点


通过上面的代码,我得到了这个数字:


如您所见,您的模型存在一些分类错误。具体来说,有三个交叉会被错误分类为ci