Parzen窗估计与KN近邻估计实验报告.docx
《Parzen窗估计与KN近邻估计实验报告.docx》由会员分享,可在线阅读,更多相关《Parzen窗估计与KN近邻估计实验报告.docx(16页珍藏版)》请在冰点文库上搜索。
Parzen窗估计与KN近邻估计实验报告
Parzen窗估计与KN近邻估计实验报告
模式识别实验报告
题目:
Parzen窗估计与KN近邻估计
学院计算机科学与技术
专业xxxxxxxxxxxxxxxx
学号xxxxxxxxxxxx
姓名xxxx
指导教师xxxx
20xx年xx月xx日
Parzen窗估计与KN近邻估计
一、实验目的
本实验的目的是学习Parzen窗估计和k最近邻估计方法。
在之前的模式识别研究中,我们假设概率密度函数的参数形式已知,即判别函数J(.)的参数是已知的。
本节使用非参数化的方法来处理任意形式的概率分布而不必事先考虑概率密度的参数形式。
在模式识别中有躲在令人感兴趣的非参数化方法,Parzen窗估计和k最近邻估计就是两种经典的估计法。
二、实验原理
1.非参数化概率密度的估计
对于未知概率密度函数的估计方法,其核心思想是:
一个向量x落在区域R中的概率可表示为:
其中,P是概率密度函数p(x)的平滑版本,
有两种经常采用的获得这种区域序列的途径,如下图所示。
其中“Parzen窗方法”就是根据某一个确定的体积函数,比如Vn=1/√n来逐渐收缩一个给定的初始区间。
这就要求随机变量kn和kn/n能够保证pn(x)能收敛到p(x)。
第二种“k-近邻法”则是先确定kn为n的某个函数,如kn=√n。
这样,体积需要逐渐生长,直到最后能包含进x的kn个相邻点。
2.Parzen窗估计法
已知测试样本数据x1,x2,…,xn,在不利用有关数据分布的先验知识,对数据分布不附加任何假定的前提下,假设R是以x为中心的超立方体,h为这个超立方体的边长,对于二维情况,方形中有面积V=h^2,在三维情况中立方体体积V=h^3,如下图所示。
根据以下公式,表示x是否落入超立方体区域中:
估计它的概率分布:
其中n为样本数量,h为选择的窗的长度,φ(.)为核函数,通常采用矩形窗和高斯窗。
3.k最近邻估计
在Parzen算法中,窗函数的选择往往是个需要权衡的问题,k-最近邻算法提供了一种解决方法,是一种非常经典的非参数估计法。
基本思路是:
已知训练样本数据x1,x2,…,xn而估计p(x),以点x为中心,不断扩大体积Vn,直到区域内包含k个样本点为止,其中k是关于n的某一个特定函数,这些样本被称为点x的k个最近邻点。
当涉及到邻点时,通常需要计算观测点间的距离或其他的相似性度量,这些度量能够根据自变量得出。
这里我们选用最常见的距离度量方法:
欧几里德距离。
最简单的情况是当k=1的情况,这时我们发现观测点就是最近的(最近邻)。
一个显著的事实是:
这是简单的、直观的、有力的分类方法,尤其当我们的训练集中观测点的数目n很大的时候。
可以证明,k最近邻估计的误分概率不高于当知道每个类的精确概率密度函数时误分概率的两倍。
三、实验基本步骤
第一部分,对表格中的数据,进行Parzen窗估计和设计分类器,本实验的窗函数为一个球形的高斯函数,如下:
1)编写程序,使用Parzen窗估计方法对一个任意的测试样本点x进行分类。
对分类器的训练则使用表格3中的三维数据。
同时,令h=1,分类样本点为(0.5,1.0,0.0),(0.31,1.51,-0.50),(-0.3,0.44,-0.1)进行实验。
2)可以改变h的值,不同的h将导致不同的概率密度曲线,如下图所示。
h=0.1时:
h=0.5时:
h=1时:
第二部分的实验目的是学习和掌握非参数估计:
k-近邻概率密度估计方法。
对前面表格中的数据进行k-近邻概率密度估计方法和设计分类器。
编写程序,对表格中的3个类别的三维特征,使用k-近邻概率密度估计方法。
并且对下列点处的概率密度进行估计:
(-0.41,0.82,0.88),(0.14,0.72,4.1),(-0.81,0.61,-0.38)。
四、实验代码如下:
%Parzen窗算法
%w:
c类训练样本
%x:
测试样本
%h:
参数
%输出p:
测试样本x落在每个类的概率
functionp=Parzen(w,x,h)
[xt,yt,zt]=size(w);
p=zeros(1,zt);
fori=1:
zt
hn=h;
forj=1:
xt
hn=hn/sqrt(j);
p(i)=p(i)+exp(-(x-w(j,:
i))*(x-w(j,:
i))'/(2*power(hn,2)))/(hn*sqrt(2*3.14));
end
p(i)=p(i)/xt;
end
%k-最近邻算法
%w:
c类训练样本
%x:
测试样本
%k:
参数
functionp=kNearestNeighbor(w,k,x)
%w=[w(:
:
1);w(:
:
2);w(:
:
3)];
[xt,yt,zt]=size(w);
wt=[];%zeros(xt*zt,yt);
ifnargin==2
p=zeros(1,zt);
fori=1:
xt
forj=1:
xt
dist(j,i)=norm(wt(i,:
)-wt(j,:
));
end
t(:
i)=sort(dist(:
i));
m(:
i)=find(dist(:
i)<=t(k+1,i));%找到k个最近邻的编号
end
end
ifnargin==3
forq=1:
zt
wt=[wt;w(:
:
q)];
[xt,yt]=size(wt);
end
fori=1:
xt
dist(i)=norm(x-wt(i,:
));
end
t=sort(dist);%欧氏距离排序
[a,b]=size(t);
m=find(dist<=t(k+1));%找到k个最近邻的编号
num1=length(find(m>0&m<11));
num2=length(find(m>10&m<21));
num3=length(find(m>20&m<31));
ifyt==3
plot3(w(:
1,1),w(:
2,1),w(:
3,1),'r.');
holdon;
gridon;
plot3(w(:
1,2),w(:
2,2),w(:
3,2),'g.');
plot3(w(:
1,3),w(:
2,3),w(:
3,3),'b.');
if(num1>num2)||(num1>num3)
plot3(x(1,1),x(1,2),x(1,3),'ro');
disp(['点:
[',num2str(x),']属于第一类']);
elseif(num2>num1)||(num2>num3)
plot3(x(1,1),x(1,2),x(1,3),'go');
disp(['点:
[',num2str(x),']属于第二类']);
elseif(num3>num1)||(num3>num2)
plot3(x(1,1),x(1,2),x(1,3),'bo');
disp(['点:
[',num2str(x),']属于第三类']);
else
disp('无法分类');
end
end
ifyt==2
plot(w(:
1,1),w(:
2,1),'r.');
holdon;
gridon;
plot(w(:
1,2),w(:
2,2),'g.');
plot(w(:
1,3),w(:
2,3),'b.');
if(num1>num2)||(num1>num3)
plot(x(1,1),x(1,2),'ro');
disp(['点:
[',num2str(x),']属于第一类']);
elseif(num2>num1)||(num2>num3)
plot(x(1,1),x(1,2),'go');
disp(['点:
[',num2str(x),']属于第二类']);
elseif(num3>num1)||(num3>num2)
plot(x(1,1),x(1,2),'bo');
disp(['点:
[',num2str(x),']属于第三类']);
else
disp('无法分类');
end
end
end
title('k-最近邻分类器');
legend('第一类数据',...
'第二类数据',...
'第三类数据',...
'测试样本点');
clear;
closeall;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Parzen窗估计和k最近邻估计
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
w1(:
:
1)=[0.281.31-6.2;
0.070.58-0.78;
1.542.01-1.63;
-0.441.18-4.32;
-0.810.215.73;
1.523.162.77;
2.202.42-0.19;
0.911.946.21;
0.651.934.38;
-0.260.82-0.96];
w1(:
:
2)=[0.0111.03-0.21;
1.271.280.08;
0.133.120.16;
-0.211.23-0.11;
-2.181.39-0.19;
0.341.96-0.16;
-1.380.940.45;
-0.120.820.17;
-1.442.310.14;
0.261.940.08];
w1(:
:
3)=[1.362.170.14;
1.411.45-0.38;
1.220.990.69;
2.462.191.31;
0.680.790.87;
2.513.221.35;
0.602.440.92;
0.640.130.97;
0.850.580.99;
0.660.510.88];
x(1,:
)=[0.510];
x(2,:
)=[0.311.51-0.5];
x(3,:
)=[-0.30.44-0.1];
%验证h的二维数据
w2(:
:
1)=[0.281.31;
0.070.58;
1.542.01;
-0.441.18;
-0.810.21;
1.523.16;
2.202.42;
0.911.94;
0.651.93;
-0.260.82];
w2(:
:
2)=[0.0111.03;
1.271.28;
0.133.12;
-0.211.23;
-2.181.39;
0.341.96;
-1.380.94;
-0.120.82;
-1.442.31;
0.261.94];
w2(:
:
3)=[1.362.17;
1.411.45;
1.220.99;
2.462.19;
0.680.79;
2.513.22;
0.602.44;
0.640.13;
0.850.58;
0.660.51];
y(1,:
)=[0.51];
y(2,:
)=[0.311.51];
y(3,:
)=[-0.30.44];
h=.1;%重要参数
p=Parzen(w1,x(1,:
),h);
num=find(p==max(p));
disp(['点:
[',num2str(x(1,:
)),']落在三个类别的概率分别为:
',num2str(p)]);
disp(['点:
[',num2str(x(1,:
)),']落在第',num2str(num),'类']);
%给定三类二维样本,画出二维正态概率密度曲面图验证h的作用
num=1;%第num类的二维正态概率密度曲面图,取值为1,2,3
draw(w2,h,num);
str1='当h=';str2=num2str(h);str3='时的二维正态概率密度曲面';
SC=[str1,str2,str3];
title(SC);
%k近邻算法设计的分类器
%x1和y1为测试样本
x1=[-0.41,0.82,0.88];
x2=[0.14,0.72,4.1];
x3=[-0.81,0.61,-0.38];
y(1,:
)=[0.51];
y(2,:
)=[0.311.51];
y(3,:
)=[-0.30.44];
w=w1;
%w=w1(:
1,3);
k=5;
kNearestNeighbor(w,k,x1);
kNearestNeighbor(w,k,x2);
kNearestNeighbor(w,k,x3);