资源描述:
《模式识别(knn.kmeans.fcm)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、一、K近邻算法1.算法思想取未知样本的x的k个近邻,看这k个近邻中多数属于哪一类,就把x归于哪一类。具体说就是在N个已知的样本中,找出x的k个近邻。设这N个样本中,来自类的样本有个,来自的样本有个,...,来自类的样本有个,若分别是k个近邻中属于类的样本数,则我们可以定义判别函数为:决策规则为:若,则决策2.程序代码%KNN算法程序functionerror=knn(X,Y,K)%error为分类错误率data=X;[M,N]=size(X);Y0=Y;[m0,n0]=size(Y);t=[123];%3类向量ch=randperm(M);%随机排列1—
2、Merror=0;fori=1:10Y1=Y0;b=ch(1+(i-1)*M/10:i*M/10);X1=X(b,:);X(b,:)=[];Y1(b,:)=[];c=X;[m,n]=size(X1);%m=15,n=4[m1,n]=size(c);%m1=135,n=4forii=1:mforj=1:m1ss(j,:)=sum((X1(ii,:)-c(j,:)).^2);end[z1,z2]=sort(ss);%由小到大排序hh=hist(Y1(z2(1:K)),t);[w,best]=max(hh);yy(i,ii)=t(best);%保存修改的分类结
3、果end-15-error=error+sum(Y0(b,:)~=yy(i,:)');X=data;enderror=error/M;%算法主程序:clcclearallloadiris.mat%iris.mat中存放X为150*4的iris数据,Y为150*1的分类结果,以下均使用该数据n=0;fori=1:10error=knn(X,Y,1);n=n+error;endcorrect=1-n/103.程序运行结果做十折交叉验证得到:当K=1时,正确分类概率为:0.9587当K=3时,正确分类概率为:0.9613当K=5时,正确分类概率为:0.9640
4、当K=7时,正确分类概率为:0.9653当K=10时,正确分类概率为:0.9667当K=30时,正确分类概率为:0.9480当K=60时,正确分类概率为:0.90274.结果分析从以上的结果我们可以看出当k较小时,随着k的增加,其正确分类的概率也逐渐增加;然而当k增加到一定的值时,即k取较大的值时,随着k的增加,其正确率并没有随之增加,反而大大降低了。因此在实际中选择K的值时应慎重考虑,结合实际结果,选取合适的K值。二、K均值算法1.算法思想K-means算法是将各个聚类子集内的所有数据样本的均值作为该聚类的代表点,通过迭代过程把数据集划分为不同的类别,
5、使得评价聚类性能的准则函数达到最优,从而使生成的每个聚类内紧凑,类间独立。在下面的算法中,在计算数据样本之间的距离时,采用的欧式距离。其步骤如下:(1)为每一个聚类确定一个初始的聚类中心,这样就有K个聚类中心。(2)将样本集中的样本按照最小距离准则分配到最临近聚类(3)使用每个聚类中的样本均值作为新的聚类中心(4)重复步骤2,3直到聚类中心不再变化。(5)结束,得到K个聚类2.程序代码-15-%K均值算法程序function[class,num,center]=kmeans(x,k,start)[n,d]=size(x);class=zeros(1,n)
6、;%设置class为分类结果显示矩阵num=zeros(1,k);%num保存每一类的个数maxgn=10000;iter=1;whileiter7、um(i)=length(ind);%统计每一类的数据个数enditer=iter+1;endmaxiter=2;iter=1;move=1;whileiter8、类中心移动class(i)=ind;%将新的聚类结果送给classic=find