使用Matlab对如下输入、输出样本采用感知器算法、BP神经网络算法进行多神经元分类,要求画出最后的线形图。 P=[0.1 0.7 0.8 0.8 1.0 0.3 0.0 -0.3 -0.5 -1.5; 1.2 1.8 1.6 0.6 0.8 0.5 0.2 0.8 -1.5 -1.3]; T=[ 1 1 1 0 0 1 1 1 0 0; 0 0 0 0 0 1 1 1 1 1] 。不使用工具箱。
时间: 2023-06-10 19:08:49 浏览: 124
Matlab编程用感知器算法实现样本分类
5星 · 资源好评率100%
感知器算法和BP神经网络算法都可以用来进行多神经元分类,不同之处在于BP神经网络算法可以处理非线性可分问题,而感知器算法只能处理线性可分问题。以下是使用Matlab代码实现的感知器算法和BP神经网络算法,并画出最后的线形图。
感知器算法:
```matlab
% 输入输出样本
P=[0.1 0.7 0.8 0.8 1.0 0.3 0.0 -0.3 -0.5 -1.5; 1.2 1.8 1.6 0.6 0.8 0.5 0.2 0.8 -1.5 -1.3];
T=[1 1 1 0 0 1 1 1 0 0; 0 0 0 0 0 1 1 1 1 1];
% 初始化权重和偏置
w = rand(2,10);
b = rand(10,1);
% 学习率
eta = 0.1;
% 迭代次数
max_epochs = 100;
% 训练
for epochs = 1:max_epochs
for i = 1:size(P,2)
x = P(:,i);
d = T(:,i);
v = w * x + b;
y = hardlim(v);
e = d - y;
delta_w = eta * e * x';
delta_b = eta * e;
w = w + delta_w;
b = b + delta_b;
end
end
% 测试
for i = 1:size(P,2)
x = P(:,i);
v = w * x + b;
y = hardlim(v);
fprintf('Input: %s, Output: %s\n', mat2str(x), mat2str(y));
end
% 画线形图
figure;
hold on;
plot(P(1,T(1,:)==1),P(2,T(1,:)==1),'ro');
plot(P(1,T(2,:)==1),P(2,T(2,:)==1),'bx');
xlim([-2,2]);
ylim([-2,2]);
x = -2:0.1:2;
y = -(b(1)/w(1,2)) - (w(1,1)/w(1,2)) * x;
plot(x,y);
y = -(b(2)/w(2,2)) - (w(2,1)/w(2,2)) * x;
plot(x,y);
legend('Class 1', 'Class 2', 'Boundary 1', 'Boundary 2');
```
BP神经网络算法:
```matlab
% 输入输出样本
P=[0.1 0.7 0.8 0.8 1.0 0.3 0.0 -0.3 -0.5 -1.5; 1.2 1.8 1.6 0.6 0.8 0.5 0.2 0.8 -1.5 -1.3];
T=[1 1 1 0 0 1 1 1 0 0; 0 0 0 0 0 1 1 1 1 1];
% 初始化权重
w1 = rand(3,2);
w2 = rand(2,10);
% 初始化偏置
b1 = rand(2,1);
b2 = rand(10,1);
% 学习率
eta = 0.1;
% 迭代次数
max_epochs = 100;
% 训练
for epochs = 1:max_epochs
for i = 1:size(P,2)
x = P(:,i);
d = T(:,i);
% 前向传播
v1 = w1 * x + b1;
y1 = logsig(v1);
v2 = w2 * y1 + b2;
y2 = hardlim(v2);
% 反向传播
e2 = d - y2;
delta_w2 = eta * e2 * y1';
delta_b2 = eta * e2;
e1 = w2' * e2;
delta_w1 = eta * e1 .* y1 .* (1 - y1) * x';
delta_b1 = eta * e1 .* y1 .* (1 - y1);
w2 = w2 + delta_w2;
b2 = b2 + delta_b2;
w1 = w1 + delta_w1(2:3,:);
b1 = b1 + delta_b1(2:3,:);
end
end
% 测试
for i = 1:size(P,2)
x = P(:,i);
v1 = w1 * x + b1;
y1 = logsig(v1);
v2 = w2 * y1 + b2;
y2 = hardlim(v2);
fprintf('Input: %s, Output: %s\n', mat2str(x), mat2str(y2));
end
% 画线形图
figure;
hold on;
plot(P(1,T(1,:)==1),P(2,T(1,:)==1),'ro');
plot(P(1,T(2,:)==1),P(2,T(2,:)==1),'bx');
xlim([-2,2]);
ylim([-2,2]);
x = -2:0.1:2;
y = -(b1(1)/w1(1,2)) - (w1(1,1)/w1(1,2)) * x;
plot(x,y);
y = -(b1(2)/w1(2,2)) - (w1(2,1)/w1(2,2)) * x;
plot(x,y);
y = -(b2(1)/w2(1,2)) - (w2(1,1)/w2(1,2)) * x;
plot(x,y);
y = -(b2(2)/w2(2,2)) - (w2(2,1)/w2(2,2)) * x;
plot(x,y);
legend('Class 1', 'Class 2', 'Boundary 1', 'Boundary 2', 'Boundary 3', 'Boundary 4');
```
阅读全文