完整word版模式作业设计.docx
《完整word版模式作业设计.docx》由会员分享,可在线阅读,更多相关《完整word版模式作业设计.docx(22页珍藏版)》请在冰点文库上搜索。
完整word版模式作业设计
1.1题目
给出K-均值算法的程序框图,编写程序,自选一组分别属于三类的三维模式样本(图2.13),并给它们进行聚类分析。
1.2算法原理
K-均值算法也称C-均值算法,是根据函数准则进行分类的聚类算法,基于使聚类准则最小化。
此处所用的聚类准则函数是聚类集中每一个样本点到该类聚类中心的距离平方和,对于第j个聚类集,准则函数定义为
式中,Sj表示第j个聚类集,也称聚类域,其聚类中心为
;
为第j个聚类集
中所包含的样本个数。
(1)任选K个初始聚类中心Z1
(1),Z2
(1),…,ZK
(1),
。
括号内的序号代表寻找聚类中心的迭代运算的次序号。
一般可选择样本集中前K个样本作为初始聚类中心。
(2)按最小距离原则将其余样本分配到K个聚类中心中的某一个,即:
若
,则
。
式中,k代表迭代运算次序号;K代表聚类中心的个数。
(3)计算各个聚类中心的新向量值
,
即以均值向量作为新的聚类中心。
这一步要分别计算K个聚类中心的样本均值向量,故该算法被称为K-均值算法。
(4)如果
,
,则回到
(2),将模式样本逐个重新分类,并重复迭代计算;如果
,
,算法收敛,计算完毕。
1.3程序流程图
1.4MATLAB程序代码
clearall;
clc;
data=input('请输入样本数据矩阵:
');
X=data(:
1);
Y=data(:
2);
figure
(1);
plot(X,Y,'r*','LineWidth',3);
axis([0908])
xlabel('x');ylabel('y');
holdon;
gridon;
m=size(data,1);
n=size(data,2);
counter=0;
k=input('请输入聚类数目:
');
ifk>m
disp('输入的聚类数目过大,请输入正确的k值');
k=input('请输入聚类数目:
');
end
M=cell(1,m);
fori=1:
k
M{1,i}=zeros(1,n);
end
Mold=cell(1,m);
fori=1:
k
Mold{1,i}=zeros(1,n);
end
%随机选取k个样本作为初始聚类中心
%第一次聚类,使用初始聚类中心
p=randperm(m);%产生m个不同的随机数
fori=1:
k
M{1,i}=data(p(i),:
);
end
whiletrue
counter=counter+1;
disp('第');
disp(counter);
disp('次迭代');
count=zeros(1,k);
%初始化聚类C
C=cell(1,k);
fori=1:
k
C{1,i}=zeros(m,n);
end
%聚类
fori=1:
m
gap=zeros(1,k);
ford=1:
k
forj=1:
n
gap(d)=gap(d)+(M{1,d}(j)-data(i,j))^2;
end
end
[y,l]=min(sqrt(gap));
count(l)=count(l)+1;
C{1,l}(count(l),:
)=data(i,:
);
end
Mold=M;
disp('聚类中心为:
');
fori=1:
k
disp(M{1,i});
end
disp('聚类结果为:
');
fori=1:
k
disp(C{1,i});
end
sumvar=0;
fori=1:
k
E=0;
disp('单个误差平方和为:
');
forj=1:
count(i)
forh=1:
n
E=E+(M{1,i}(h)-C{1,i}(j,h))^2;
end
end
disp(E);
sumvar=sumvar+E;
end
disp('总体误差平方和为:
');
disp(sumvar);
%计算新的聚类中心,更新M,并保存旧的聚类中心
fori=1:
k
M{1,i}=sum(C{1,i})/count(i);
end
%检查前后两次聚类中心是否变化,若变化则继续迭代;否则算法停止;
tally=0;
fori=1:
k
ifabs(Mold{1,i}-M{1,i})<1e-5*ones(1,n)
tally=tally+1;
continue;
else
break;
end
end
iftally==k
break;
end
end
1.5结果与分析
请输入聚类数目:
3
第1次迭代
聚类中心为:
22
74
36
聚类结果为:
00
11
22
00
00
00
00
00
00
00
63
73
74
00
00
00
00
00
00
00
37
36
46
57
00
00
00
00
00
00
单个误差平方和为:
10
单个误差平方和为:
3
单个误差平方和为:
7
总体误差平方和为:
20
第2次迭代
聚类中心为:
11
6.66673.3333
3.75006.5000
聚类结果为:
00
11
22
00
00
00
00
00
00
00
63
73
74
00
00
00
00
00
00
00
37
36
46
57
00
00
00
00
00
00
单个误差平方和为:
4
单个误差平方和为:
1.3333
单个误差平方和为:
3.7500
总体误差平方和为:
9.0833
程序以循环语句来实现算法中迭代的要求。
在对课本上图2.13所示的10个样本进行聚类时,考虑到实际应用中,需试探不同的K值和选择不同的聚类中心起始值,而题中K值已定,所以随机选取了k个样本作为初始聚类中心。
另一方面,这个程序不能生成聚类的结果图。
2.1题目
给出感知器算法程序框图,编写算法程序,解习题3-5,。
2.2算法原理
两类线性可分的模式类:
,设判别函数为
。
其中,
,
。
d(X)应具有以下性质:
对样本进行规范化处理,即ω2类样本全部乘以(-1),则有:
。
下面是感知器的具体步骤:
(1)选择
个分属于
和
类的模式样本构成训练样本集{
,
,
},构成增广向量形式,并进行规范化处理。
任取权向量初始值W
(1),开始迭代。
括号中的1代表迭代次数k=1。
(2)用全部训练样本进行一轮迭代,计算
的值,并修正权向量。
假设进行到第k次迭代时,输入的样本为
,计算
,分两种情况更新权向量:
①若
0,说明分类器对
的分类发生错误,权向量需要校正,且校正为:
,其中,c为校正增量系数,
。
②若
,表明分类正确,权向量不变,即
。
可统一写为
(3)分析分类结果:
只要有一个错误分类,回到
(2),直至对所有样本正确分类,结束迭代。
此时的权向量即为算法结果。
2.3程序流程图
2.4MATLAB程序代码
clearall;
clc;
disp('感知器算法求解两类训练样本的判别函数');
Data1=input('请输入第一类样本数据:
');
Data2=input('请输入第二类样本数据:
');
W=input('请输入权向量初始值W
(1)=');
Expand=cat(1,Data1,Data2);
ExpandData1=cat(2,Data1,ones(4,1));
ExpandData2=cat(2,Data2.*-1,ones(4,1).*-1);
ExpandData=cat(1,ExpandData1,ExpandData2);
X=Expand(:
1);
Y=Expand(:
2);
Z=Expand(:
3);
[ro,co]=size(ExpandData);
Step=0;
CountError=1;
whileCountError>0;
CountError=0;
fori=1:
ro
Temp=W*ExpandData(i,:
)';
ifTemp<=0
W=W+ExpandData(i,:
);
disp(W)
CounterError=CountError+1;
end
end
Step=Step+1;
end
disp(W)
figure
(1)
plot3(X,Y,Z,'ks','LineWidth',2);
gridon;holdon;
xlabel('x');ylabel('y');zlabel('z');
f=@(x,y,z)W
(1)*x+W
(2)*y+W(3)*z+W(4);
[x,y,z]=meshgrid(-1:
.2:
1,-1:
.2:
1,0:
.2:
1);
v=f(x,y,z);
h=patch(isosurface(x,y,z,v));
isonormals(x,y,z,v,h)
set(h,'FaceColor','r','EdgeColor','none');
2.5结果与分析
3.5判别界面
个人认为在这道题中需要注意的是对MATLAB绘图的阅读能力,尤其是三维图像,可以用figure窗口的Rotate3D和DataCursor工具进行多角度的观察。
3.1题目
编写两类正态分布模式的贝叶斯分类程序,并使用编写的程序求解4.3题。
3.2算法原理
正态分布模式的贝叶斯决策又称为高斯分布。
当特征空间中的某一类样本较多地分布在其均值附近,远离均值点的样本比较少时,用正态分布作为概率模型就是合理的。
最小错误率贝叶斯决策和最小风险贝叶斯决策应用范围很广,但事先必须求出
和
。
而当
呈正态分布时,只需要知道均值向量M和协方差矩阵C两个参数即可。
解决两类问题时,
3.3程序流程图
3.4MATLAB程序代码
clearall;
clc;
disp('两类正态分布模式的贝叶斯分类');
Sample1=input('样本(类别一)');
Sample2=input('样本(类别二)');
pw1=input('第一类的先验概率');
pw2=input('第二类的先验概率');
u1=mean(Sample1);
u2=mean(Sample2);
sigm1=cov(Sample1);
sigm2=cov(Sample2);
spice=(u1-u2)*(inv(sigm1));
c=-0.5*(u1*inv(sigm1)*u1')+0.5*(u2*inv(sigm1)*u2');
x=-20:
0.5:
40;
y=-20:
0.5:
20;
[X,Y]=meshgrid(x,y);
F1=mvnpdf([X(:
),Y(:
)],u1,sigm1);
F2=mvnpdf([X(:
),Y(:
)],u2,sigm2);
P1=reshape(F1,size(X));
P2=reshape(F2,size(X));
figure
(2)
surf(X,Y,P1)
holdon
surf(X,Y,P2)
shadinginterp
colorbar
title('条件概率密度函数曲线');
figure
(1)
plot(Sample1(:
1),Sample1(:
2),'rx')
holdon
plot(Sample2(:
1),Sample2(:
2),'bx')
numx1=spice(1,1);
numx2=spice(1,2);
p=-1:
1/30:
7;
q=(-c-numx1*p)/numx2;
plot(p,q,'k-')
fori=1:
5
[u,v]=ginput
(1);
plot(u,v,'m*');
P1=pw1*mvnpdf([u,v],u1,sigm1);
P2=pw1*mvnpdf([u,v],u2,sigm2);
disp([u,v]);
holdall
if(P1>P2)
disp('属于第一类');
else
disp('属于第二类');
end;
end
3.5结果与分析
程序没有完整的考虑两类问题中的每个情况,只解答了两类样本的协方差矩阵相等,即
的情况。
而且绘制判别函数的语句可读性差。
4.1题目
自己选择一幅彩色图像,选择一种分类算法,使用颜色特征对彩色图像中的像素进行分类。
最终输出彩色图像按照颜色的分割结果。
4.4程序代码
clearall;
clc;
file_name=input('输入文件图像路径');
I_rgb=imread(file_name);
figure();
image(I_rgb);
title('原始图像');
whosfile_name;
[m,n,k]=size(file_name);
new=double(reshape(file_name,m*n,k));
whosnew;
startdata=input('背景和前背景初始凝聚点');
idClass=kmeans(new,2,'Start',startdata);
idfile=(idClass==1);
result=reshape([idfile,idfile,idfile],[m,n,k]);
file1=file_name;
file1(resulet)=0;
figure
imshow(file1);
4.5结果与分析
程序运行不成功,需要改进。