文档库 最新最全的文档下载
当前位置:文档库 › 使用MATLAB编写单层感知器

使用MATLAB编写单层感知器

使用MATLAB编写单层感知器
使用MATLAB编写单层感知器

采用感知器学习规则,训练步骤如下:

Step 1:

对各权值w0j(0), w2j(0), …, w nj(0), j=1, 2, …, m (m 为计算层的节点数)赋予较小的

非零随机数,设置p=1;

Step 2:

输入样本对{X p,d p},其中X p = (-1, x1

p, x2

p , …, x n

p), d p = (d1

p, d2

p , …, d n

p)为期望

的输出向量(教师信号),上标p 表示样本对的模式序号,设样本总数为P,则p = 1, 2, …, P;

Step 3:

计算各节点的实际输出p ( ) sgn( T ( ) p ), 1,2,...,

j j o t W t X j m

Step 4:

调整各节点对应的权值,( 1) ( ) [ p p ( )] p

j j j j W t W t d o t X

η为学习率,用于控制调整速度,η值太大会影响训练的稳定性,太小则使训练的1 2 ( , ,..., ..., )T

j m 输出层O o o o o

输入层 1 2 ( , ,..., ,..., ) j m W W W W W

0 1 2 ( , , ,..., ,..., )T

i n X x x x x x

单层感知器模型

1 ... ... j m o o o

1 j m W W W

0 1 2 ... ... i n x x x x x

2

收敛速度变慢,一般取0<η≤1;

Step 5:

p=p+1,如果p ≤P,返回到Step2 ,否则转到Step 6 ;

Step 6:

如果感知器对所有样本的实际输出与期望输出相等,则停止;否则设置p=1,返回Step2。

四、实验步骤:

1. 用单层感知器实现“与”运算

“与”运算真值表:

x1 x2 y

0 0 0

0 1 0

1 0 0

1 1 1

得到输入样本和对应的期望输出:

X1=[-1, 0, 0] d1=0

X2=[-1, 0, 1] d2=0

X3=[-1, 1, 0] d3=0

X4=[-1, 1, 1] d4=1

(1) 打开Matlab

双击桌面,打开Matlab 主程序

(2) 建立新文件

通过菜单选择File New M-File 或者点击左上角建立一个新文件

(3) 编程

*提示,在Matlab 主窗口输入help+空格+命令,可以看到关于该命令使用方法即作用的的具体说明

流程:

Step1:

function main() %建立函数,可用其他名字

close all %关闭所有figure

rand('state',sum(100*clock)) %随机数种子用时钟进行初始化

Step 2:

设置样本数量P,对输入样本和期望输出赋值

设置感知器参数(输入样本维数,输出维数,最大训练次数,学习率%%%%%%%%%%%%%%%%%%%%%%%%%%%

3

%关于赋值的例程(黑色字体为程序,蓝色字体为Matlab 运行结果):

a=1; %单值赋值(注意:A 与a 是两个不同变量)

A=2;%分号:只运算不显示逗号或者结尾没有符号:即运算又显示

M=[1,2;3,4]; %矩阵赋值

>> M=[1,2;3,4];

>> M,

M =

1 2

3 4

>> M(1,:)%矩阵的第一行

ans =

1 2

>> M(:,1)%矩阵的第一列

ans =

3

>> M(:,1)=[0 0];%可单独操作一列一行或者一个元素(如M(1,1)=0;)>> M

M =

0 2

0 4

>> Err=[];%Err 初始为空

Err=[Err 1];%加入新的元素

Err=[Err 2];%再次加入

Err=[Err 4];%向量的元素可以以这种方式不断增加

Err

Err =

1 2 4 %%%%%%%%%%%%%%%%%%%%%%%%%%%

Step 3:感知器训练

权值初始化

设置阈值

合并阈值与权值得到扩展权值

从1 到最大迭代次数,不断迭代计算

每次均依次输入样本1-4,由o p-d p 得到误差,计算新的权向量

使用单极点二值变换函数

1 0

( )

0 0

x

f x

x

记录下每次调整后的权值

每次迭代计算后,计算并记录总误差,如果总误差为0,则停止迭代%%%%%%%%%%%%%%%%%%%%%%%%%%%

%关于循环和矩阵运算和其他一些涉及到运算的例程:

>>M=[];

for i=1:5

M=[M;[i,i.^2]];

4

end

M

M =

1 1

3 9

4 16

5 25

>> M.*M %点乘

ans =

1 1

4 16

9 81

16 256

25 625

>> M' %“' ”为转置运算

ans =

1 2 3 4 5

1 4 9 16 25

>> M*M' %叉乘,

ans =

2 6 12 20 30

6 20 42 72 110

12 42 90 156 240

20 72 156 272 420

30 110 240 420 650

>> a=1:5;

for i=1:5

i

if a(i)==3,break,end %如果a(i)=3 则跳出循环end

i =

1

i =

2

i =

3

>> x=0.1;

if x>=0

f=1;

5

else

f=0;

end

f,

f =

1

>> x=0.1;

f=(x>=0)%逻辑运算

f =

1

>> x=-0.1;

f=(x>=0)

f =

>> rand(1,5)%产生一个一行5 列的随机数矩阵

ans =

0.1576 0.9706 0.9572 0.4854 0.8003

>> sum([1,2,3]) %求和运算

ans =

6

>> abs(-5) %绝对值运算

ans =

5 %%%%%%%%%%%%%%%%%%%%%%%%%%% Step 4:显示结果

画出收敛曲线,即每次迭代后的总误差

画出权值的变化曲线

画出样本的分布和分界线w1x1+w2x2-T=0 %%%%%%%%%%%%%%%%%%%%%%%%%%% %关于结果显示和画图的例程

>> figure%画图

hold on%每次画图都画在同一个图上,不覆盖

grid on%显示网格

x=1:10;

f=x.^2;

plot(x,f,'b--');%具体看help plot

axis([0 10 0 120]);%设置轴的范围

xlabel('Inputx')%设置x 轴的标签

ylabel('Outputy')%设置y 轴的标签

disp(['f=[',num2str(f),']'])

f=[1 4 9 16 25 36 49 64 81 100]

6

0 1 2 3 4 5 6 7 8 9 10

20

40

60

80

100

120

Inputx

Outputy %%%%%%%%%%%%%%%%%%%%%%%%%%% 关于本题的显示示例:

The final Error is: 0.

The curren Epoch is: 3.

The Final W is:

0.72157

0.48814

The Final T is: 0.8.

The Result is:

x1 x2 y

0 0 0

0 1 0

1 0 0

1 1 1

0 2 4 6 8 10 12 14

0.65

0.7

0.75

0.8

0.85

W1

0 2 4 6 8 10 12 14

0.55

0.6

0.65

0.7

0.75

W2

权值的收敛曲线

7

1 1.5

2 2.5 3

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1

Epoch

Error

误差的收敛曲线

-1 -0.5 0 0.5 1 1.5 2

-1

-0.5

0.5

1

1.5

2

Inputx

Outputy

样本分布及分界线示意

(4) 保存文件

通过菜单选择File Save,或者点击左上角,或者使用快捷键Ctrl+S

(5) 运行及调试程序

点击上方,或者使用快捷键F5。

针对提示的错误的位置修改程序,直到正确运行。

*注意检查变量矩阵的字母大小写,矩阵叉乘是否需要转置。

(6) 存储图像

在图上通过菜单选择File Save,或者使用快捷键Ctrl+S

再Edit Copy Figure,将图粘贴到word 上作为实验报告的依据。

(7) 设置阈值T=0.1,改变学习率观察收敛曲线的收敛情况,对每个不同的学习率,分别运行程序10 次,将所用迭代次数的平均值填入下表:

学习率η0.01 0.05 0.1 0.5 1 2 10

迭代次数

*提示:可以利用for 循环直接接到该表结果

(8) 设置学习率η=0.1,改变学习率观察收敛曲线的收敛情况,对每个不同的阈值T,分别运行程序10 次,将所用迭代次数的平均值填入下表:

阈值T 0.01 0.05 0.1 0.5 1 2 10

迭代次数

(9) 设置学习率η=0.1, 设置阈值T=0.1,运行程序10 次,记录下迭代次数平均值,再将变换函数改为单极点Sigmoid 函数,再运行程序10 次,记录下迭代次数平均值。

变换__

相关文档