matlab-线性分类器的设计doc

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

线性分类器设计

1 问题描述

对“data1.m ”数据,分别采用感知机算法、最小平方误差算法、线性SVM 算法设计分类器,分别画出决策面,并比较性能。(注意讨论算法中参数设置的影响。)

2 方法描述

2.1 感知机算法

线性分类器的第一个迭代算法是1956年由Frank Rosenblatt 提出的,即具有自学习能力的感知器(Perceptron )神经网络模型,用来模拟动物或者人脑的感知和学习能力。这个算法被提出后,受到了很大的关注。感知器在神经网络发展的历史上占据着特殊的位置:它是第一个从算法上完整描述的神经网络,是一种具有分层神经网络结构、神经元之间有自适应权相连接的神经网络的一个基本网络。

感知器的学习过程是不断改变权向量的输入,更新结构中的可变参数,最后实现在有限次迭代之后的收敛。感知器的基本模型结构如图1所示:

图1 感知器基本模型

其中,X 输入,Xi 表示的是第i 个输入;Y 表示输出;W 表示权向量;w0是阈值,f 是一个阶跃函数。

感知器实现样本的线性分类主要过程是:特征向量的元素x1,x2,……,xk 是网络的输入元素,每一个元素与相应的权wi 相乘。,乘积相加后再与阈值w0相加,结果通过f 函数执行激活功能,f 为系统的激活函数。因为f 是一个阶跃函数,故当自变量小于0时,f= -1;当自变量大于0时,f= 1。这样,根据输出信号Y ,把相应的特征向量分到为两类。

然而,权向量w 并不是一个已知的参数,故感知器算法很重要的一个步骤即是寻找一个合理的决策超平面。故设这个超平面为w ,满足:

12

*0,*0,T T

w x x w x x ωω>∀∈<∀∈ (1)

引入一个代价函数,定义为:

()**T x x Y

J w w x

δ∈=∑ (2)

其中,Y 是权向量w 定义的超平面错误分类的训练向量的子集。变量x δ定义为:当

1x ω∈时,x δ= -1;当2x ω∈时,x δ= +1。显然,J(w)≥0。当代价函数J(w)达到最小值0

时,所有的训练向量分类都全部正确。为了计算代价函数的最小迭代值,可以采用梯度下降法设计迭代算法,即:

()

()(1)()n

w w n J w w n w n w

ρ=∂+=-∂ (3)

其中,w(n)是第n 次迭代的权向量,n ρ有多种取值方法,在本设计中采用固定非负值。由J(w)的定义,可以进一步简化(3)得到:

(1)()*n x x Y

w n w n x

ρδ∈+=-∑ (4)

通过(4)来不断更新w ,这种算法就称为感知器算法(perceptron algorithm )。可以证明,这种算法在经过有限次迭代之后是收敛的,也就是说,根据(4)规则修正权向量w ,可以让所有的特征向量都正确分类。

采用感知器算法实现data1.m 的数据分类流程如图2所示:

图2 单层感知器算法程序流程

MATLAB程序源代码如下:

function Per1()

clear all;

close all;

%样本初始化

x1(1,1)= 0.1; x1(1,2)= 1.1;

x1(2,1)= 6.8; x1(2,2)= 7.1;

x1(3,1)= -3.5; x1(3,2)= -4.1;

x1(4,1)= 2.0; x1(4,2)= 2.7;

x1(5,1)= 4.1; x1(5,2)= 2.8;

x1(6,1)= 3.1; x1(6,2)= 5.0;

x1(7,1)= -0.8; x1(7,2)= -1.3;

x1(8,1)= 0.9; x1(8,2)= 1.2;

[8.4 4.1; 4.2 -4.3 0.0 1.6 1.9 -3.2 -4.0 -6.1 3.7 -2.2]

x2(1,1)= 7.1; x2(1,2)=;

x2(2,1)= -1.4; x2(2,2)=;

x2(3,1)= 4.5; x2(3,2)=;

x2(4,1)= 6.3; x2(4,2)=;

x2(5,1)= 4.2; x2(5,2)=;

x2(6,1)= 1.4; x2(6,2)=;

x2(7,1)= 2.4; x2(7,2)=;

x2(8,1)= 2.5; x2(8,2)=;

for i=1:8 r1(i)=x1(i,1);end;

for i=1:8 r2(i)=x1(i,2);end;

for i=1:8 r3(i)=x2(i,1);end;

for i=1:8 r4(i)=x2(i,2);end;

figure(1);

plot(r1,r2,'*',r3,r4,'o');

hold on;%保持当前的轴和图像不被刷新,在该图上接着绘制下一图

x1(:,3) = 1;%考虑到不经过原点的超平面,对x进行扩维

x2(:,3) = 1;%使x'=[x 1],x为2维的,故加1扩为3维

%进行初始化

w = rand(3,1);%随机给选择向量,生成一个3维列向量

p = 1; %p0非负正实数

ox1 = -1;%代价函数中的变量

ox2 = 1;%当x属于w1时为-1,当x属于w2时为1

s = 1;%标识符,当s=0时,表示迭代终止

n = 0;%表示迭代的次数

w1 = [0;0;0];

while s %开始迭代

J = 0; %假设初始的分类全部正确

j = [0;0;0]; %j=ox*x

for i = 1:45

if (x1(i,:)*w)>0 %查看x1分类是否错误,在x属于w1却被错误分类的情况下,w'x<0

w1 = w; %分类正确,权向量估计不变

else%分类错误

j = j + ox1*x1(i,:)';%j=ox*x。进行累积运算

J = J + ox1*x1(i,:)*w;%感知器代价进行累积运算

end

end

for i = 1:55

if (x2(i,:)*w)<0%查看x2分类是否错误,在x属于w2却被错误分类的情况下,w'x>0

w1 = w; %分类正确,权向量估计不变

else%分类错误

j = j + ox2*x2(i,:)';%j=ox*x。进行累积运算

J = J + ox2*x2(i,:)*w;%感知器代价进行累积运算

end

end

if J==0 %代价为0,即分类均正确

s = 0; %终止迭代

else

w1 = w - p*j;%w(t+1)=w(t)-p(ox*x)进行迭代

p=p+0.1;%调整p

n = n+1; %迭代次数加1

end

w = w1;%更新权向量估计

end

x = linspace(0,10,5000);%取5000个x的点作图

y = (-w(1)/w(2))*x-w(3)/w(2);%x*w1+y*w2+w0=0,w=[w1;w2;w0]

plot(x,y,'r');%用红线画出分界面

disp(n);%显示迭代的次数

axis([1,12,0,8])%设定当前图中,x轴范围为1-12,为y轴范围为0-8

end

所得的结果如图3所示:

相关文档
最新文档