matlab-线性分类器的设计doc
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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所示: