模式识别实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模式识别实验
实验一贝叶斯决策实验 (1)
实验二FISHER准则实验 (9)
实验三线性分类器设计 (15)
实验四BP网络分类器 (23)
实验五HOPFIELD网络分类器 (29)
实验六SVM分类器 (33)
实验七DCT变换及其应用 (39)
实验八基本KL变换法特征提取 (41)
实验九基本PCA法分析 (42)
实验十K近邻法分类器设计 (45)
实验十一层次聚类分析 (49)
实验十二PARZEN窗法分析 (52)
实验一 贝叶斯决策实验
一、实验目的
1、 学习贝叶斯决策模式识别;
2、 学习正态分布数据集合的获取;
3、 学习应用MATLAB 语言作模式识别的仿真设计。
二、相关知识
1、 正态分布
已知N 个样本的数据集合
{}N x x x ,,,21 =X
服从正态分布,单变量正态分布的概率密度函数为
()⎥⎥⎦⎤⎢⎢⎣
⎡⎪⎭⎫ ⎝⎛--=221exp 21
σμσπx x p (1.1)
这里,均值为
[]()⎰∞
∞-==dx x xp x E μ (1.2)
方差为
()[]
()()⎰
∞
∞
--=-=dx x p x x E 2
2
2
μμσ (1.3) 均值为0,方差为1的正态分布的概率密度函数如图1.1所示。
从图中可以看到, 尽管正态变量的取值范围是()+∞∞-,,但它的值落在()σμσμ3,3+-内几乎是肯定的事。
这就是“σ3”法则。
图1.1 均值为0,方差为1的正态分布的概率密度函数
2、 参数估计
已知样本集X 及其总体分布,估计分布参数称有监督参数估计。
单变量正态分布的未知参数为均值μ
和方差2
σ,设均值μθ=1,方差22σθ=,构成未知参数向量
⎥⎦
⎤⎢⎣⎡=⎥⎦⎤⎢⎣⎡=221σμθθθ
对于正态分布),(2σμN ,由极大似然估计可以得到μ
ˆ和2
ˆσ: ∑===N
i i x N 1
1
1ˆˆμθ (1.4) ()∑=-==N i i x N 1
222ˆ1ˆˆμσ
θ (1.5) 3、 贝叶斯决策
设两类样本1ω和2ω,已知:(1)先验概率()1ωP ,()2ωP ;(2)类条件概率密度()1|ωx p ,()2|ωx p ,这里x 为d 维特征向量
⎪⎪⎪⎪⎪⎭
⎫
⎝⎛=d x x x 21x 。
A. 最小错误率贝叶斯决策 利用贝叶斯公式计算后验概率
()()()
()()
2,1,|||2
1
==
∑=i P p P p P j j
j
i i i ωωωωωx x x (1.6)
最小错误率贝叶斯决策规则为 若()()x x |max |2
,1i i k P P ωω==,则k ω∈x ,
即 ()()x x ||21ωωP P >,x 归类为1ω;
()()x x ||21ωωP P <,x 归类为2ω。
B. 最小风险贝叶斯决策
利用计算出的后验概率及决策表,计算出采用决策,1,2i i α=的条件风险()x |i R α:
()()()2,1,|||2
1==∑=i P R j j j i i x x ωωαλα (1.7)
最小风险贝叶斯决策规则为
若()()x x |min |2
,1i i k R R αα==,则k ω∈x ,
即
()()x x ||21ωωR R <,x 归类为1ω;
()()x x ||21ωωR R >,x 归类为2ω。
三、实验内容
以下是一个(虚构的)医疗诊断问题。
正常人的一种生化化验的值接近0,而感染病人的化验值接近1。
它们的类条件密度函数分别为:
()()3.0,0|1===σμωN x p ()()1.0,1|2===σμωN x p
假定平均每10个人中有1人感染。
假定诊断正确时的代价为0。
误诊的代价为:
1) 将健康人诊断为感染病人时,其代价为$20,000, 2) 将感染病人诊断为健康人时,其代价为$1000,000。
根据下面不同的准则函数: 1、 最小错误率 2、 最小风险
确定决策规则,并讨论结果。
1、 最小错误率贝叶斯分类 程序名称:pattern1_1.m 程序清单: clear
%构造实验数据 n=20; %样本数
a=(round(100*rand(n,1))/100)*2.2-0.9; %样本数为n ,特征数为1,数据在-0.9与1.3之间 figure
plot(1:n,a,'rx') xlabel('样本数'); ylabel('生化化验值');
title('样本数据:生化化验值'); pause;
%先验概率 P=[0.9 0.1];
%作类条件概率密度曲线p(x|wi) x=-0.9:0.01:1.3;
px(1,:)=(1/(sqrt(2*pi)*0.3))*exp(-0.5*(x/0.3).^2); px(2,:)=(1/(sqrt(2*pi)*0.1))*exp(-0.5*((x-1)/0.1).^2); figure;
plot(x,px(1,:),'b',x,px(2,:),'r--'); xlabel('生化化验值'); ylabel('概率密度');
title('类条件概率密度曲线')
axis tight
pause;
%作后验概率曲线
for i=1:2
pwx(i,:)=px(i,:)*P(i)./(px(1,:)*P(1)+px(2,:)*P(2));
end
figure;
plot(x,pwx(1,:),'b',x,pwx(2,:),'r--');
xlabel('生化化验值');
ylabel('后验概率');
title('后验概率曲线')
axis tight
pause
%计算给定生化化验值的类条件概率密度
for j=1:n
s=a(j);
PXW1=spline(x,px(1,:),s);
PXW2=spline(x,px(2,:),s);
PXW=[PXW1,PXW2];
disp('样本')
s
%计算后验概率,判别输出
for i=1:2
Pwx(i)=PXW(i)*P(i)/(PXW(1)*P(1)+PXW(2)*P(2));
end
disp('后验概率P(wi|x)=')
Pwx
plot(x,pwx(1,:),'b',x,pwx(2,:),'r--');
xlabel('生化化验值');
ylabel('后验概率');
title('后验概率曲线')
hold on
plot(s,Pwx(1),'or',s,Pwx(2),'ob');
axis tight
hold off
if Pwx(1)>Pwx(2)
w(j,1)=s;
disp('正常人')
else
w(j,2)=s;
disp('感染病人')
end pause; end
disp('=============================') disp(' 正常人 感染病人') w
本实验中的样本数据由均匀分布的随机函数生成,两类样本1ω和2ω的特征服从正态分布,它们的类条件概率密度函数如图1.2所示,1ω类和2ω类的类条件概率密度函数分别用实线和虚线表示。
图1.3为两类样本的后验概率曲线,图中所示样本的特征属于1ω类的后验概率大于属于2ω类的后验概率,所以在基于最小错误率的贝叶斯决策规则下,该样本属于正常人1ω类。
图1.2 类条件概率密度曲线
图1.3 后验概率曲线
2、最小风险贝叶斯分类
程序名称:pattern1_2.m
程序清单:
clear
%构造实验数据
n=20; %样本数
a=(round(100*rand(n,1))/100)*2.2-0.9; %样本数是n,特征数是1 figure
plot(1:n,a,'rx')
xlabel('样本数');
ylabel('生化化验值');
title('样本数据:生化化验值');
pause;
%先验概率
P=[0.9 0.1];
%作类条件概率密度曲线p(x|wi)
x=-0.9:0.01:1.3;
px(1,:)=(1/(sqrt(2*pi)*0.3))*exp(-0.5*(x/0.3).^2);
px(2,:)=(1/(sqrt(2*pi)*0.1))*exp(-0.5*((x-1)/0.1).^2);
figure;
plot(x,px(1,:),'b',x,px(2,:),'r--');
xlabel('生化化验值');
ylabel('概率密度');
title('类条件概率密度曲线')
axis tight
pause;
%作后验概率曲线
for i=1:2
pwx(i,:)=px(i,:)*P(i)./(px(1,:)*P(1)+px(2,:)*P(2));
end
figure;
plot(x,pwx(1,:),'b',x,pwx(2,:),'r--');
xlabel('生化化验值');
ylabel('后验概率');
title('后验概率曲线')
axis tight
pause
%损失函数
r=[0,1000,000;200,000,0];
%作条件风险曲线
for i=1:2
R(i,:)=r(i,1)*pwx(1,:)+r(i,2)*pwx(2,:);
end
figure;
plot(x,R(1,:),'b',x,R(2,:),'r--');
xlabel('生化化验值');
ylabel('条件风险');
title('条件风险曲线')
axis tight
pause
%计算给定生化化验值的条件风险
for j=1:n
s=a(j);
PXW1=spline(x,px(1,:),s);
PXW2=spline(x,px(2,:),s);
PXW=[PXW1,PXW2];
disp('样本')
s
%计算后验概率
for i=1:2
Pwx(i)=PXW(i)*P(i)/(PXW(1)*P(1)+PXW(2)*P(2));
end
%计算条件风险,判别输出
for i=1:2
Rx(i)=r(i,1)*Pwx(1)+r(i,2)*Pwx(2);
end
disp('条件风险R(ai|x)=')
Rx
plot(x,R(1,:),'b',x,R(2,:),'r--');
xlabel('生化化验值');
ylabel('条件风险');
title('条件风险曲线')
hold on
plot(s,Rx(1),'or',s,Rx(2),'ob');
axis tight
hold off
if Rx(1)<Rx(2)
w(j,1)=s;
disp('正常人')
else
w(j,2)=s;
disp('感染病人') end pause; end
disp('=============================') disp(' 正常人 感染病人') w
本实验中的样本数据由均匀分布的随机函数生成,两类样本1ω和2ω的特征服从正态分布,它们的类条件概率密度函数如图1.2所示,1ω类和2ω类的类条件概率密度函数分别用实线和虚线表示。
图1.4是两类样本的条件风险曲线,图中所示样本的特征属于2ω类的条件风险小于属于1ω类的条件风险,所以在基于最小风险的贝叶斯决策规则下,该样本属于感染病人2ω类。
图1.4 条件风险曲线
四、实验报告要求
1、 小样本实验数据清单;
2、 作出类条件概率曲线;
3、 分类器程序清单;
4、 分类器应用结果验证。
实验二 Fisher 准则实验
一、实验目的
1、 理解Fisher 线性判别的基本原理;
2、 学习Fisher 线性分类器的设计方法;
3、 分类器检验。
二、相关知识
已知N 个d 维样本数据集合
{}N x x x ,,,21 =X ,
其中,1N 个属于1ω类,2N 个属于2ω类。
Fisher 线性判别的基本原理是:把d 维空间的样本投影到一条直线上,形成一维空间。
找到某个最好的、最易于分类的投影方向,使在这个方向的直线上,样本的投影能分开得最好。
这就是Fisher 法所要解决的基本问题。
对n x 的分量作线性组合
N n y n T n ,,2,1, ==x w (2.1) 从几何意义上看,若1=w ,则每个n y 就是相对应的n x 到方向为w 的直线上的投影。
w 的方向不同,将使样本投影后的可分离程度不同,从而直接影响识别效果。
寻找最好投影方向*
w ,Fisher 准则函数为
()w
w w
w w w T
b T F S S J = (2.2) 式中,b S 为样本类间离散度矩阵,w S 为样本总类内离散度矩阵。
使()w F J 取极大值时的*
w 即为d 维空
间到一维空间的最好投影方向:
()211
m m w -=-*w
S (2.3) 式中,,1,2i i =m 为在d 维空间的两类样本的均值向量。
利用先验知识选定分界阈值点0y ,例如选择
()
2
~~2
110m m y += (2.4)
()m
N N m N m N y ~~~2
12
21120=++= (2.5)
()
()()()2
/ln 2~~21212
130
-++
+=N N P P m m y ωω (2.6) 式中,,1,2i m i =为投影到一维空间的两类样本的均值,(),1,2i P i ω=为两类样本的先验概率。
对于任意
未知类别的样本x ,计算它的投影点y :
x w T y *= (2.7)
决策规则为
0y y >,1ω∈x ; 0y y <,2ω∈x 。
三、实验内容
由均匀分布的随机函数构造两类近似线性可分的样本数据集合1ω和2ω,对于任意给定的未知样本x ,判断x 属于什么类别。
1、 寻找最好投影方向*
w
程序名称:pattern2_1.m
程序清单: clear;
%构造两类二维近似线性可分的样本数据集合w1和w2 w1=rand(15,2)*20; w2=rand(18,2)*20+15; figure;
plot(w1(:,1),w1(:,2),'g+'); hold on;
plot(w2(:,1),w2(:,2),'bo'); xlabel('x(1)'); ylabel('x(2)');
title('Fisher 准则分类');
%调用fisher 判别函数,返回最优投影方向w 和分界阈值点y0 [w,y0]=fisher1(w1,w2);
%作图:两类样本在最优投影方向上的投影
o1=(w*(w'*w1'))'; %第一类的样本向量在最优方向w 上的投影 for i=1:length(o1)
h=line([o1(i,1),w1(i,1)],[o1(i,2),w1(i,2)]); set(h,'Color','g','LineStyle','--') end
o2=(w*(w'*w2'))'; %第二类的样本向量在最优方向w 上的投影 for i=1:length(o2)
h=line([o2(i,1),w2(i,1)],[o2(i,2),w2(i,2)]); set(h,'Color','b','LineStyle','--') end
th=(w*y0)';
plot(th(1),th(2),'rx','LineWidth',2,'MarkerSize',8)
axis tight
axis equal
h=gca;
XLim=get(h,'XLim');
YLim=get(h,'YLim');
l=(w*(w'*[XLim(1),YLim(1)]'))';
r=(w*(w'*[XLim(2),YLim(2)]'))';
h=line([l(1),r(1)],[l(2),r(2)]);
set(h,'color','k')
函数fisher1.m的程序清单:
function [w,y0]=fisher1(w1,w2)
%两类问题的Fisher线性判别
training=[w1;w2];
group=[ones(length(w1),1);ones(length(w2),1)*2];
[row,col]=size(training); %row表示样本数; col表示特征数
sum=zeros(col,1,2);
count=zeros(1,2);
m=zeros(col,1,2);
S=zeros(col,col,2);
for i=1:row
if group(i)==1
sum(:,1,1)=sum(:,1,1)+training(i,:)';
count(1,1)=count(1,1)+1;
elseif group(i)==2
sum(:,1,2)=sum(:,1,2)+training(i,:)';
count(1,2)=count(1,2)+1;
end
end
%计算d维空间的两类样本的均值向量。
m(:,1,1)=sum(:,1,1)/count(1,1);
m(:,1,2)=sum(:,1,2)/count(1,2);
for i=1:row
if group(i)==1
S(:,:,1)=S(:,:,1)+(training(i,:)'-m(:,1,1))*(training(i,:)'-m(:,1,1))';
elseif group(i)==2
S(:,:,2)=S(:,:,2)+(training(i,:)'-m(:,1,2))*(training(i,:)'-m(:,1,2))';
end
end
%计算样本总类内离散度矩阵
Sw=S(:,:,1)+S(:,:,2);
%计算样本类间离散度矩阵
Sb=(m(:,1,1)-m(:,1,2))*(m(:,1,1)-m(:,1,2))';
w=inv(Sw)*(m(:,1,1)-m(:,1,2));
w=w/norm(w);
y=(w'*training')';
sum1=0;sum2=0;
for i=1:row
if group(i)==1
sum1=sum1+y(i);
elseif group(i)==2
sum2=sum2+y(i);
end
end
%计算投影到一维空间的两类样本的均值
m1=sum1/count(1,1);
m2=sum2/count(1,2);
%利用先验知识选定分界阈值点y0
y0=(count(1,1)*m1+count(1,2)*m2)/(count(1,1)+count(1,2));
以两类问题、二维样本空间的Fisher线性判别为例,直观地理解Fisher准则分类的原理。
如图2.1所示,+表示1ω类样本, 表示2ω类样本,d维空间的样本投影到一条直线上,形成一维空间,投影直线上的⨯为选定的分界阈值点。
图2.1 Fisher准则分类的基本原理
2、对任意待测样本x的判别
程序名称:pattern2_2.m
程序清单:
clear;
%构造两类二维近似线性可分的样本数据集合w1和w2
w1=rand(15,2)*20;
w2=rand(18,2)*20+15;
figure;
plot(w1(:,1),w1(:,2),'gx');
hold on;
plot(w2(:,1),w2(:,2),'bo');
xlabel('x(1)');
ylabel('x(2)');
title('Fisher准则分类');
%随机生成5个待测样本
sample=rand(5,2)*35;
disp('5个待测样本:')
sample
plot(sample(:,1),sample(:,2),'rp');
%调用fisher判别函数,判别待测样本的类别
disp('5个待测样本分别属于的类别:')
class=fisher2(w1,w2,sample);
class'
函数fisher2.m的程序清单:
function class=fisher2(w1,w2,sample)
%两类问题的Fisher线性判别
training=[w1;w2];
group=[ones(length(w1),1);ones(length(w2),1)*2];
[row,col]=size(training); %row表示样本数; col表示特征数
sum=zeros(col,1,2);
count=zeros(1,2);
m=zeros(col,1,2);
S=zeros(col,col,2);
for i=1:row
if group(i)==1
sum(:,1,1)=sum(:,1,1)+training(i,:)';
count(1,1)=count(1,1)+1;
elseif group(i)==2
sum(:,1,2)=sum(:,1,2)+training(i,:)';
count(1,2)=count(1,2)+1;
end
end
%计算d维空间的两类样本的均值向量。
m(:,1,1)=sum(:,1,1)/count(1,1);
m(:,1,2)=sum(:,1,2)/count(1,2);
for i=1:row
if group(i)==1
S(:,:,1)=S(:,:,1)+(training(i,:)'-m(:,1,1))*(training(i,:)'-m(:,1,1))';
elseif group(i)==2
S(:,:,2)=S(:,:,2)+(training(i,:)'-m(:,1,2))*(training(i,:)'-m(:,1,2))';
end
end
%计算样本总类内离散度矩阵
Sw=S(:,:,1)+S(:,:,2);
%计算样本类间离散度矩阵
Sb=(m(:,1,1)-m(:,1,2))*(m(:,1,1)-m(:,1,2))';
w=inv(Sw)*(m(:,1,1)-m(:,1,2));
w=w/norm(w);
y=(w'*training')';
sum1=0;sum2=0;
for i=1:row
if group(i)==1
sum1=sum1+y(i);
elseif group(i)==2
sum2=sum2+y(i);
end
end
%计算投影到一维空间的两类样本的均值
m1=sum1/count(1,1);
m2=sum2/count(1,2);
%利用先验知识选定分界阈值点y0
y0=(count(1,1)*m1+count(1,2)*m2)/(count(1,1)+count(1,2));
%判别待测样本的类别
cy=w'*sample';
for j=1:length(cy)
if cy(j)>=y0
class(j)=1;
else class(j)=2;
end
end
四、实验报告要求
1、小样本实验数据清单;
2、作图显示待测样本投影到直线上的位置;
3、分类器程序清单;
4、分类器应用结果验证。
实验三 线性分类器设计
一、实验目的
1、 学习线性分类器设计方法;
2、 学习感知准则分类器设计;
3、 学习最小平方误差准则分类器设计;
4、 分类器检验。
二、相关知识
1、 感知准则分类器
已知N 个d
ˆ维规范化增广样本向量的数据集合 {}N y y y ,,,21 =Y
寻找一个解向量*
a ,使得
N n n T ,,2,1,0 =>*y a
显然,对于线性可分情况,问题才有解。
感知准则函数为
()()∑∈-=
k
T
p J Y
y y a a (3.1)
式中,k
Y 是被权向量a 错分的样本集合。
使()a p J 达到极小值的*
a 就是要寻找的解向量。
采用梯度下降
法求解解向量*
a ,计算准则函数()a p J 的梯度
()()()∑∈-=
∂∂=
∇k
y p p J J Y
y a
a a a (3.2)
梯度下降法的迭代公式为
()()()a a a a p k k k J ∇-=+ρ1 (3.3) 将式(3.2)代入式(3.3),可得
()()∑∈++=k
y k
k k Y y a a ρ1 (3.4)
式中,k ρ为步长,k
Y 是被权向量()
k a 错分的样本集。
可以证明,对于线性可分的样本集,经过有限次修
正,一定可以找到一个解向量*
a 。
经过简化的单样本修正的梯度下降法可以写成
()()k k k y a a +=+1 (3.5)
其中,对任何k 都有()0≤k T
k y a。
2、 最小平方误差准则分类器
已知N 个d
ˆ维规范化增广样本向量的数据集合 {}N y y y ,,,21 =Y
寻找一个解向量*
a ,满足
N n b n n T ,,2,1,0 =>=*y a (3.6) 其中,n b 是任意给定的正常数。
将上式写成方程组的形式即为
b Ya = (3.7)
式中,
⎪⎪
⎪
⎪
⎪
⎭
⎫
⎝
⎛=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=d N N N d d T N T T
y y y y y y y y y ˆ,2,1,ˆ,22221ˆ,1121121
y y y Y
是一个大小为d
N ˆ⨯的矩阵,样本数N 通常大于维数d ˆ,因此Y 是长方阵,一般为列满秩。
()T
N b b b ,,,21 =b
是一个N 维向量,N n b n ,,2,1,0 =>。
式(3.7)为超定方程组,通常没有精确解存在,定义误差向量
b Ya e -= (3.8) 平方误差准则函数()a s J 为
()()
∑=-=-==N
n n n T s b J 1
2
2
2
y a b Ya e a (3.9)
使()a s J 取得极小值的*
a 就是问题的解,即方程组(3.7)的最小二乘解,也称伪逆解。
用解析方法求出它的伪逆解:
b Y a +*= (3.10)
式中,()
T T Y Y
Y Y 1
-+=是Y 的Moore-Penrose 逆矩阵。
直接求+
Y 时计算量大,实际上往往采用数值方法如梯度下降法来求解。
计算目标函数()a s J 的梯度:()()
∑=-=-=∇N
n n n n T T
s b J 122)(y y a b Ya Y a a (3.11)
则梯度下降法的迭代公式可写成
()()()b Ya Y a a --=+T k k k ρ1 (3.12)
式中,k
k 1
ρρ=为步长。
经过简化的单样本修正的梯度下降法可写成
()()()k k T k k k k k b y y a a a )(1-+=+ρ (3.13)
其中,k y 为使()k k T k b ≠y a 的样本。
三、实验设计
1、 感知准则单样本迭代解 程序名称:pattern3_1.m 程序清单: clear
%构造实验数据 n=10;
x=round(10*random('norm',5,5,n,2))/10; figure;
xlabel('x(1)') ylabel('x(2)')
title('感知准则函数') box on hold on
%构造两类样本 n1=0; n2=0; for i=1:n
if x(i,2)>2*x(i,1)-5 n1=n1+1;
w1(n1,:)=x(i,:);
plot(x(i,1),x(i,2),'g+') else
n2=n2+1;
w2(n2,:)=x(i,:);
plot(x(i,1),x(i,2),'bo') end end
%规范化的增广样本向量 y1=[ones(n1,1)';w1']'; y2=[ones(n2,1)';w2']'; y=[y1;-y2];
%采用梯度下降法的迭代 a=[0,0,0]'; %初始解向量
while isequal(a'*y'<=0,zeros(1,n))==0 %当有错分样本时,进入while循环
for i=1:n
if dot(a,y(i,:)')<=0
a0=a;
a=a+y(i,:)';
arrowline([a0(2),a(2)],[a0(3),a(3)],'Color','m','LineStyle','--');
end
end
end
arrowline([0,a(2)],[0,a(3)],'Color','r'); %作解向量
text(0,0,'O','VerticalAlignment','top'); %标记坐标原点
axis tight
%axis equal
%作出分类线
h=gca;
XLim=get(h,'XLim');
YLim=(-a(1)-a(2)*XLim)/a(3);
h=line([XLim(1),XLim(2)],[YLim(1),YLim(2)]);
set(h,'color','k')
图3.1展示了采用感知准则函数梯度下降算法求解两类二维样本集的解向量*a的过程,+表示1ω类样ω类样本,算法经过有限次迭代,收敛到一个解向量*a,求得的分类线将两类样本完全正确本, 表示
2
地分开。
图中的虚线直观地说明了梯度下降算法的收敛过程,对于线性可分样本集,算法在有限步内收敛。
图3.1 感知准则函数梯度下降算法收敛过程
2、最小平方误差准则伪逆解
程序名称:pattern3_2.m
程序清单:
clear
%构造实验数据
n=10;
x=round(10*random('norm',5,5,n,2))/10;
figure;
xlabel('x(1)')
ylabel('x(2)')
title('最小二乘准则分类')
box on
hold on
%构造两类样本
n1=0;
n2=0;
for i=1:n
if x(i,2)>2*x(i,1)-5
n1=n1+1;
w1(n1,:)=x(i,:);
plot(x(i,1),x(i,2),'g+')
else
n2=n2+1;
w2(n2,:)=x(i,:);
plot(x(i,1),x(i,2),'bo')
end
end
%规范化的增广样本向量
y1=[ones(n1,1)';w1']';
y2=[ones(n2,1)';w2']';
y=[y1;-y2];
%最小二乘解,也称为伪逆解
b=ones(n,1); %选取向量b
a=pinv(y)*b;
w=a(2:3);
w=w/norm(w);
arrowline([0,w(1)],[0,w(2)],'Color','r'); %作解向量text(0,0,'O','VerticalAlignment','top'); %标记坐标原点axis tight
axis equal
%作出分类线
XLim=get(h,'XLim');
YLim=(-a(1)-a(2)*XLim)/a(3);
h=line([XLim(1),XLim(2)],[YLim(1),YLim(2)]);
set(h,'color','k')
图3.2为最小二乘准则分类示意图,+表示1ω类样本, 表示2ω类样本,带箭头的直线表示求得的解向量*a,*a依赖于向量b的选取。
最小二乘准则不是基于最小错分样本数的,而是基于最小平方误差的。
因此,对于线性可分样本集,求得的分类线并不一定能将两类样本完全正确地分开。
图3.2 最小二乘准则分类示意图
3、最小平方误差准则单样本迭代解
程序名称:pattern3_3.m
程序清单:
clear
% 1 构造实验数据
n=15;
x=round(10*random('norm',5,5,n,2))/10;
figure;
xlabel('x(1)')
ylabel('x(2)')
title('最小二乘准则分类')
box on
hold on
%构造两类样本
n2=0;
for i=1:n
if x(i,2)>2*x(i,1)-5
n1=n1+1;
w1(n1,:)=x(i,:);
plot(x(i,1),x(i,2),'g+')
else
n2=n2+1;
w2(n2,:)=x(i,:);
plot(x(i,1),x(i,2),'bo')
end
end
%规范化的增广样本向量
y1=[ones(n1,1)';w1']';
y2=[ones(n2,1)';w2']';
y=[y1;-y2];
%单样本修正的梯度下降法迭代
b=0.1*ones(n,1);
a0=[1,1,1]';
a=[0,0,0]'; %初始解向量
rho=0.1;
k=0;
th=1e-3;
while norm(a-a0)>=th %连续两次迭代结果之间的距离小于预定的阈值,迭代终止for i=1:n
if dot(a,y(i,:)')~=b(i)
k=k+1;
a0=a;
a=a+(rho/k)*(b(i)-dot(a,y(i,:)'))*y(i,:)';
d(k)=norm(a-a0); %连续两次迭代结果之间的距离
end
end
end
d
a1=pinv(y)*b;
w=a(2:3);
w=w/norm(w);
arrowline([0,w(1)],[0,w(2)],'Color','r'); %画出解向量
text(0,0,'O','VerticalAlignment','top'); %标记坐标原点
axis tight
%作出分类线
XLim=get(h,'XLim');
YLim=(-a(1)-a(2)*XLim)/a(3);
h=line([XLim(1),XLim(2)],[YLim(1),YLim(2)]);
set(h,'color','k')
四、实验报告要求
1、实验分类结果;
2、分析实验结果,及不理想的原因;
3、修改参数后的实验结果;
4、讨论线性分类器的有效性。
实验四BP网络分类器
一、实验目的
1、学习基于随机梯度下降法的两层sigmoid神经元的BP算法;
2、学习用MatLab神经网络工具箱提供的函数设计BP网络;
3、分类器检验。
二、相关知识
BP网络是一种单向传播的多层前向网络,输入信号依次传过各隐层神经元,然后传到输出神经元。
BP网络是一种映射表示方法,它是对简单的非线性函数进行复合,经过少数几次复合后,就可以实现复杂的函数,
BP网络的学习过程由正向和反向传播两部分组成。
在正向传播过程中,从输入层开始向后逐层计算输出,产生最终输出,并计算实际输出与目标输出间的误差,在反向传播过程中,从输出层开始向前逐层传播误差信号,修正权值,再经过正向传播过程,反复这两个过程,直到网络输出值和目标值之间的误差小于给定精度要求。
三、实验设计
1、基于随机梯度下降法的两层sigmoid单元的BP算法
函数BPnn.m的程序清单:
function O=BPnn(X,Y)
%基于随机梯度下降法的两层sigmoid单元的前向网络的BP算法。
%X为输入样本,行表示特征,列表示样本;Y为目标向量
[i,t]=size(X); %i表示输入层神经元个数
[k,t]=size(Y); %k表示输出层神经元个数
j=5; %j表示隐层神经元个数
%训练参数
alpha=0.005; %学习速率
epochs=50000; %训练步数
goal=0.02; %精度要求
err=1; %误差初始值
iter=0;
%初始化网络权值
IW=(rand(j,i+1)-0.5)*0.1; %输入层和隐层之间的网络权值
LW=(rand(k,j+1)-0.5)*0.1; %隐层和输出层之间的网络权值
%初始化权值变化量矩阵
dLW=zeros(size(LW));
dIW=zeros(size(IW));
%初始化误差矩阵
ErrArray=zeros(1,epochs);
while err>goal & iter<epochs
%检查退出循环条件
for m=1:t
%前向计算过程
Inet=IW*[X(:,m);1];
%获得隐层输出
IO=1./(1+exp(-Inet));
%获得输出层输出
Lnet=LW*[IO;1];
LO=1./(1+exp(-Lnet));
O(:,m)=LO;
%计算误差
E(:,m)=Y(:,m)-O(:,m);
%误差反向传播过程
%对于输出单元
deltaj=O(:,m).*(1-O(:,m)).*E(:,m);
%输出层权值调整
dLW=alpha*deltaj*[IO;1]';
%对于隐层单元
deltai=IO.*(1-IO).*(LW(:,1:j)'*deltaj);
%隐层权值调整
dIW=alpha*deltai*[X(:,m);1]';
%更新权值
LW=LW+dLW;
IW=IW+dIW;
end
%每步的误差
total=0;
for m=1:t
total=total+sum(E(:,m).*E(:,m));
end
err=0.5*total;
iter=iter+1;
time(iter)=iter;
ErrArray(iter)=err;
End
%显示结果
figure;
plot(time,ErrArray(1:iter));
title('网络误差');
xlabel('迭代次数');
ylabel('误差');
2、用MatLab神经网络工具箱提供的函数设计BP网络
采用BP网络的方法来设计一个能完成模式识别任务的网络。
设计一个BP网络并训练它来识别字母
7 的矩阵,例如理想的字母A如图4.1表中的26个字母,这些字母已经数字化了,每一个字母表示为5
所示。
然而,实际的数字成像系统总会存在一些随机噪声的干扰,图4.2显示了实际可能得到的字母的一
个例子。
图4.1 字母A
图4.2 含噪声的字母A 程序名称:pattern4_2.m
程序清单:
clear
%网络初始化
[alphabet,targets]=prprob;
[R,Q]=size(alphabet);
[S2,Q]=size(targets);
S1=40;
mu=0;
sigma=0.1;
P=[alphabet,alphabet+random('norm',mu,sigma,R,Q)];
net=newff(minmax(P),[S1 S2],{'logsig','purelin'},'trainlm');
%newff(): MatLab神经网络工具箱提供的函数,建立一个多层前馈网络并自动初始化网络的连接权和阈值
%minmax(): MatLab函数,规定输入向量中各元素的范围
%[S1 S2]: S1表示隐层神经元个数,S2表示输出层神经元个数
%logsig, purelin: 表示隐层激活函数采用logsig(S型)函数,输出层激活函数采用purelin(线性型)函数%trainlm(): MatLab提供trainlm()函数实现Levenberg-Marquardt快速训练算法
%网络训练参数设置
net.performFcn='sse'; %误差平方和函数
net.trainParam.goal=0.1; %误差限
%net.trainParam.show=20;
net.trainParam.epochs=5000; %最大学习次数
%用理想的字母表和加入噪声的字母表训练网络
T=[targets,targets];
[net,tr]=train(net,P,T);
%测试网络的性能,对于10组实际含噪声的字母计算正确识别率
err=0;
max_test=10;
for n=1:max_test
test=alphabet+random('norm',mu,sigma,R,Q);
o=sim(net,test);
o=compet(o);
for i=1:Q
if isequal(o(:,i),targets(:,i))==0
err=err+1;
end
end
end
ratio=1-err/(Q*max_test);
%对实际含噪声的字母进行识别并绘制图像
test=alphabet+random('norm',mu,sigma,R,Q);
o=sim(net,test);
o=compet(o);
for index=1:5:Q
figure;
plotchar(test(:,index));
name=sprintf('%d加入噪声的字母.png',index);
pathname=strcat('D:\MATLAB6p1\work\Pattern Recognition\Alphabet\',name);
print(gcf,'-dpng',pathname);
figure;
answer=find(o(:,index)==1);
plotchar(alphabet(:,answer));
name=sprintf('%d 识别的字母.png',index);
pathname=strcat('D:\MATLAB6p1\work\Pattern Recognition\Alphabet\',name); print(gcf,'-dpng',pathname); end
本实验的目的是识别这些含噪声的字母。
输入向量为35(57 )维,目标向量为26维。
若目标向量代表某个字母,则其对应位置的分量为1,其他分量为0。
例如,A 是字母表中的第一个字母,它对应的目标向量的第一个分量为1,第2~26个分量均为0。
设计一个两层BP 网络,隐层传递函数采用对数S 型函数,输出层传递函数采用线性函数,隐层神经元的个数设置为40,输出层神经元的个数为26,训练算法选择数值优化中的Levenberg-Marquardt 算法。
用理想的字母表和加了均值为0,标准差为0.1的随机高斯噪声的字母表作为训练样本集训练网络。
最后,为了测试网络的分类性能,对实际的字母A 、F 、K 、P 、U 、Z ,加入随机噪声,然后将它们输入到经过训练的网络中,观察网络输出,如图4.3(a )~(l )所示。
图4.3(a )~(l )分别绘出了含噪声的输入字母图和网络识别后的输出字母图,可以看到,网络正确识别出了这些字母。
(a )
(b )
(c )
(d )
(e )
(f )
(g )
(h )
(i )
(j )
(k )
(l )
图4.3 含噪声的输入字母及识别结果
四、实验报告要求
1、识别其他含噪声的字母;
2、加入标准差为0.2的高斯噪声的实验结果;
3、分析实验结果,及不理想的原因;
4、讨论BP网络的有效性。
实验五 Hopfield 网络分类器
一、实验目的
1、 学习用MatLab 神经网络工具箱提供的函数设计Hopfield 神经网络;
2、 理解Hopfield 神经网络的联想记忆功能;
3、 分类器检验。
二、相关知识
Hopfield 神经网络常用于存储一个或者多个稳定的目标向量,可以把网络的稳定点视为一个记忆,被记忆的样本向量对应于网络能量函数的极小值。
给定网络一个初始向量后,网络状态向能量函数减小的方向变化,最后达到离初始向量最近的稳定点。
由于具备这种对一个初始输入能够找到其最近的存储值的能力,Hopfield 网络可用于模式识别。
三、实验设计
1、 两神经元的Hopfield 神经网络设计
设计一个只具有两个神经元的Hopfield 网络,定义存储在网络中的稳定点为两个二维向量,它们是
()T 1,11-=x 和()T
1,12-=x ,给网络输入15个随机向量,运行网络20次,观察其输出结果。
程序名称:pattern5_1.m 程序清单: clear
%两个稳定点,并绘出 T=[1 -1;-1 1]';
plot(T(1,:),T(2,:),'r*','MarkerSize',10,'LineWidth',1.5); axis([-1.1 1.1 -1.1 1.1]);
title('Hopfield 网络状态空间'); xlabel('x(1)'); ylabel('x(2)'); hold on
%建立一个Hopfield 网络,函数自动设计好连接权,使网络的稳定点为向量T net=newhop(T); W=net.LW{1,1}; b=net.b{1,1};
%给定10个随机初始向量,绘出这些初始点到达网络存储的稳定点的轨迹 color='rgbm'; for i=1:15
a={rands(2,1)};
[y,Pf,Af]=sim(net,{1 20},{},a); %运行网络 record=[cell2mat(a) cell2mat(y)]; start=cell2mat(a);
plot(start(1,1),start(2,1),'kx',record(1,:),record(2,:),color(rem(i,4)+1)); drawnow; end
图5.1的网络状态空间中绘出了这些点到达网络存储的稳定点的轨迹,可以看出这些点都能收敛到其接近的稳定点。
图中的稳定点用*表示,初始点用⨯表示。
当初始点离左上角的稳定点较近时,其最终收敛到左上角的稳定点;当初始点离右下角的稳定点较近时,就会收敛到右下角的稳定点。
图5.1 多个随机初始点到达稳定点的轨迹
2、多神经元的Hopfield神经网络设计
设计一个Hopfield神经网络,记忆两种字母Y和J(见图5.2),将有噪声干扰的这两种字母(见图5.3,噪声服从均值为0,标准差为0.2的高斯分布)输入网络,网络能够输出完整的信息,如图5.4所示。
(a)字母Y (b)字母J
图5.2 网络记忆的两种字母
(a)字母Y(b)字母J
图5.3 有噪声干扰的字母
(a)字母Y (b)字母J
图5.4 网络输出的字母
程序名称:pattern5_2.m
程序清单:
clear
%网络初始化
[alphabet,targets]=prprob;
[R,Q]=size(alphabet);
T1=alphabet(:,10); %向量表示字母J
T2=alphabet(:,25); %向量表示字母Y
T=[T1 T2];
net=newhop(T); %建立一个Hopfield网络,函数自动设计好连接权,使网络的稳定点为向量T1,T2. mu=0;
sigma=0.2;
P1=alphabet(:,10)+random('norm',mu,sigma,R,1); %初始向量
P2=alphabet(:,25)+random('norm',mu,sigma,R,1); %初始向量
figure;
plotchar(P1);
figure;
plotchar(P2);
%运行网络,对含噪声的字母进行识别
O=sim(net,2,[],[P1 P2]); %获取网络响应,2表示有两个输入向量
%Hopfield网络没有训练过程而只有运行过程,若网络输出与期望值不符时,则可多次运行网络epochs=100;
for i=1:epochs
O=sim(net,2,[],O);
end
figure;
plotchar(O(:,1));
figure;
plotchar(O(:,2));
四、实验报告要求
实验六 SVM 分类器
一、实验目的
1、 理解统计学习理论的核心内容;
2、 理解SVM 分类的基本原理;
3、 学习用MatLab 的SVM 工具箱提供的函数设计SVM 分类器。
二、相关知识
已知数据
()()(){}1,,,,,,2211±⨯∈X y y y x x x
其中,{},1,2,
,
n
i i ==⊂
x X 表示 个n 维样本集,{} ,,2,1,==i y i Y ,1=i y 或1-标记两类样
本。
对于一个新的数据x ,判别x 属于哪一类,即判断()y ,x 中的y 是1+还是1-。
支撑向量机可表示为如下的二次规划问题:
().
,,2,1,
0,
0.
.,21min 1
1
11
=≤≤=-∑∑∑∑====i C y t s K y y i i i
i i i i j i j i j j i αα
ααααx x (6.1)
而相应的判别函数式为
()⎪⎭
⎫
⎝⎛+=+⋅=∑=***
*
1),(sgn )sgn()(i i i i b K y b f x x x w x αφ (6.2)
其中,()()∑∑>*
=*
*
*==
1
i i i i i i i i y y αφαφαx x w
,
()()⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛+⎪⎪⎭⎫ ⎝⎛-=∑∑>*=<<>*-=<<****0100
10,min ,max 21j i i j i
i j
i j j y C j i j j y C K y K y b ααααααx x x x 。
不同的核函数表现为不同的支撑向量机算法,常用的内积函数有以下几类:
(1) d 阶非齐次多项式核函数和d 阶齐次多项式核函数
()()[]d i i K 1,+⋅=x x x x 和()()d
i i K x x x x ⋅=, (6.3)
(2) 高斯径向基核函数
()⎥⎥⎦
⎤
⎢⎢⎣
⎡--=2
2
exp ,σi
i K x x x x (6.4)
(3) S 型核函数
()()[]c K i i +⋅=x x x x νtanh , (6.5)
(4) 指数型径向基核函数
()⎥⎦
⎤
⎢⎣⎡--=2
exp ,σi i K x x x x (6.6) (5) 线性核函数
()i i K x x x x ⋅=, (6.7)
线性核函数是核函数的一个特例。
三、实验设计
用MatLab 的SVM 工具箱提供的函数设计SVM 分类器,将三种类型的数据集分类,观察分类结果。
1、 线性可分样本集的SVM 分类 数据集名称:linsep.mat 数据内容:
>> load linsep %加载数据 >> X X =
1.0000 1.0000 3.0000 3.0000 1.0000 3.0000 3.0000 1.0000
2.0000 2.5000
3.0000 2.5000
4.0000 3.0000 >> Y Y = -1 1 1 -1 1 -1 -1
程序名称:pattern6_1.m 程序清单: clear
%加载数据 load linsep
%设置参数,用SVM 将线性可分的两类样本分开 C=Inf; %惩罚因子 ker='linear'; %核函数
[nsv alpha bias] = svc(X,Y ,ker,C); %SVM 分类,返回支撑向量数、Lagrange 乘子和偏置项 svcplot(X,Y ,ker,alpha,bias) %绘出分类示意图 print -dpng 'linsep.png' 图6.1展示了线性可分样本集的SVM 分类示意图,图中的直线为两类样本的分类线,虚线上的样本
为支撑向量。
对于线性可分的样本集,一条直线很容易将训练样本集正确地分开。
图6.1 线性可分样本集的SVM分类示意图
2、近似线性可分样本集的SVM分类
数据集名称:nlinsep1.mat
数据内容:
>> load nlinsep1
>> X
X =
1.0000 1.0000
3.0000 3.0000
1.0000 3.0000
3.0000 1.0000
2.0000 2.5000
3.0000 2.5000
4.0000 3.0000
1.5000 1.5000
1.0000
2.0000
>> Y
Y =
-1
1
1
-1
1
-1
-1
1
-1
程序名称:pattern6_2.m
程序清单:
clear
%加载数据
load nlinsep1
%设置参数,用SVM将近似线性可分的两类样本分开
C=100; %惩罚因子
ker='linear'; %核函数
[nsv alpha bias] = svc(X,Y,ker,C); %SVM分类,返回支撑向量数、Lagrange乘子和偏置项
svcplot(X,Y,ker,alpha,bias) %绘出分类示意图
print -dpng 'nlinsep1.png'
图6.2展示了近似线性可分样本集的SVM分类示意图,图中的直线为两类样本的分类线,虚线上的样本为支撑向量。
对于近似线性可分的样本集,一条直线能大体上将训练样本集正确分开,本实验中有两个错分样本。
图6.2 近似线性可分样本集的SVM分类示意图
3、线性不可分样本集的SVM分类
数据集名称:nlinsep1.mat
数据内容:
>> load nlinsep2
>> X
X =
0.5000 2.0000
1.0000 1.0000
1.0000
2.5000
2.0000 4.0000
2.0000 0.5000
3.0000 0.5000
3.0000 3.5000
4.0000 1.5000
4.0000 0.5000
1.5000 1.5000
1.5000
2.5000
2.5000 1.5000
2.5000 2.5000
2.5000
3.5000
3.0000 2.5000
>> Y
Y =
1
1
1
1
1
1
1
1
1
-1
-1
-1
-1
-1
-1
程序名称:pattern6_3.m
程序清单:
clear
%加载数据
load nlinsep2
%设置参数,用SVM将线性不可分的两类样本分开
C=100; %惩罚因子
ker='poly'; %核函数
global p1
p1=2; %多项式核函数的阶
[nsv alpha bias] = svc(X,Y,ker,C); %SVM分类,返回支撑向量数、Lagrange乘子和偏置项svcplot(X,Y,ker,alpha,bias) %绘出分类示意图
print -dpng 'nlinsep2.png'
对于线性不可分的样本集,用直线划分会产生很大的误差,所以必须使用非线性函数,本实验用二次。