matlab实现srt,[matlab]单层感知器实现逻辑与、或

%用单层感知器实现逻辑"与"

%"或"逻辑也可以采取同样的方法得到

%异或、同或此方法无解,调教不出来

%权值初始化:任意

%学习方式:有导师

%变换函数:二进制

%清理环境

clear;

close all;

clc;

%设置参数

fun_handle = @sgn; %变换函数的句柄

%四个样本

X = [ -1,0,0;-1,0,1;-1,1,0;-1,1,1];%样本值

d = [ 0,0,0,1 ]; %导师信号

eta = 0.1;%学习率

T = 0.1; %阈值初始值

W = rand(1,3); %权值向量初始值

W(1) = T;

W1 = []; %用于存放历次迭代调教调整后的权值w1

W2 = []; %用于存放历次迭代调教调整后的权值w2

deviation= []; %用于存放历次调教调整后的误差值

k = 0;%全样本迭代调教次数

%迭代调教直到误差为0

while(1)

s = 0;

for j = 1:length(d)

net_j = W*X(:,j);

o_j = fun_handle(net_j,1);

W = W + eta*(d(j)-o_j)*X(:,j)';

s = s + abs(d(j)-o_j);

end

deviation = [ deviation s];

k = k + 1;

W1 = [ W1 W(2)];

W2 = [ W2 W(3)];

if( s == 0)

break;

end

end

%绘图:画出调教过程中相关量的变化

figure(1);

subplot(3,1,1);

x = 1:k;

plot(x,deviation,'b-');

xlabel('迭代次数');

ylabel('误差');

title('误差的收敛曲线');

subplot(3,1,2);

plot(x,W1,'r-');

xlabel('迭代次数');

ylabel('W_1');

title('权值W_1的变化过程');

subplot(3,1,2);

plot(x,W2,'r-');

xlabel('迭代次数');

ylabel('W_2');

title('权值W_2的变化过程');

figure(2);

x1 = -1:4;

x2 = (W(1)-W(2)*x1)/W(3);

plot(x1,x2,'b--');

xlabel('x_1');

ylabel('x_2');

grid on;

hold on;

title('样本分布及分界线');

x = [0 0 1 1];

y = [0 1 0 1];

plot(x(1:3),y(1:3),'bo'); %直线下方

plot(x(4),y(4),'b*'); %直线上方

%打印:调教终值

display(["the final deviation",num2str(s)]);

display(['the epoch is:',num2str(k)]);

display(['the final W is ',num2str(W(2)),' ',num2str(W(3))]);

display(['the final T is:',num2str(W(1))]);

%sgn.m

function [ output ] = sgn( x , type )

%神经元变换函数-阈值型变换函数

%x:自变量值

%type:函数类型

%type == 1 单极性符号函数

%type ~= 1 双极性符号函数

if( type == 1)

output = ( x>=0);

else %双极性

if( x >= 0 )

output = 1;

else

output = -1;

end

end

end

运行效果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值