4.3.2 考虑到对于表格中的数据进行Parzen窗估计和设计分类器。窗函数为一个球形的高斯函数,如下所示:
φ((x−xi)/h)∝exp[−(x−xi)t(x−xi)/(2h2)]
(a)编写程序,使用Parzen窗估计方法对任意一个的测试样本点x进行分类。对分类器的训练则使用表格中的三维数据。同时令h=1,分类样本点为为 (0.5,1.0,0.0)t , (0.31,1.51,−0.50)t , (0.3,0.44,−0.1)t .
(b)现在我们令h=0.1,重复(a).
parzen.m
%生成函数计算样本个数kn的表达式
%使用可球型的高斯函数作为窗函数,并令hn=1,
%a为使用三维数据,h为超立方体的边长,x为测试样本
function px = parzen(a, h, x)
hn = h;
[m, n] = size(a); %返回m为样本的个数,m为行,n为列
vn = 4 * pi * h^3 / 3; %求出rn空间的体积vn
px = 0;
for i = 1:m
% px为概率密度函数
px = px + exp((-(x-a(i,:))*(x-a(i,:))') / (2 * power(hn, 2))) / (vn);
end
px = px / m;
end
testParzen.m
%用于进行上机题4-3
clear
load('w1.mat');
load('w2.mat');
load('w3.mat');
%完成4-3第二题
x1=[0.5,1.0,0.0];
x2=[0.31,1.51,-0.50];
x3=[-0.3,0.44,-0.1];
p1=[];
p2=[];
p3=[];
h1=1;
p11=parzen(w1,h1,x1);
p12=parzen(w2,h1,x1);
p13=parzen(w3,h1,x1);
% 将每一个类别算出的概率放在一起
p1=[p11,p12,p13];
% find函数用于返回所需元素的所在位置
% n1,n2,n3返回的是最大概率的值,则表明样本属于那个类
n1=find(p1==max(p1));
p21=parzen(w1,h1,x2);
p22=parzen(w2,h1,x2);
p23=parzen(w3,h1,x2);
p2=[p21,p22,p23];
n2=find(p2==max(p2));
p31=parzen(w1,h1,x3);
p32=parzen(w2,h1,x3);
p33=parzen(w3,h1,x3);
p3=[p31,p32,p33];
n3=find(p3==max(p3));
disp('当h=1时');
%disp(p1);
disp(['样本点1 [ ',num2str(x1),' ] 落在类别 ',num2str(n1),' 中']);
disp(['样本点2 [ ',num2str(x2),' ] 落在类别 ',num2str(n2),' 中']);
disp(['样本点3 [ ',num2str(x3),' ] 落在类别 ',num2str(n3),' 中']);
%完成4-3第二题
h2=0.1;
k1=[];
k2=[];
k3=[];
k11=parzen(w1,h2,x1);
k12=parzen(w2,h2,x1);
k13=parzen(w3,h2,x1);
k1=[k11,k12,k13]; %将每一个类别算出的概率放在一起
m1=find(k1==max(k1)); %find函数用于返回所需元素的所在位置
%n1,n2,n3返回的是最大概率的值,则表明样本属于那个类
k21=parzen(w1,h2,x2);
k22=parzen(w2,h2,x2);
k23=parzen(w3,h2,x2);
k2=[k21,k22,k23];
m2=find(k2==max(k2));
k31=parzen(w1,h2,x3);
k32=parzen(w2,h2,x3);
k33=parzen(w3,h2,x3);
k3=[k31,k32,k33];
m3=find(k3==max(k3));
disp('当h=0.1时')
%p(k1);
disp(['样本点1 [ ',num2str(x1),' ] 落在类别 ',num2str(m1),' 中']);
disp(['样本点2 [ ',num2str(x2),' ] 落在类别 ',num2str(m2),' 中']);
disp(['样本点3 [ ',num2str(x3),' ] 落在类别 ',num2str(m3),' 中']);
clear %清除所有变量
4.3.3考虑不同维数的空间中,使用k-近邻概率密度估计方法的效果。
(a)编写程序,对于一维的情况,当有n个数据样本点时,进行k-近邻概率密度估计。对表格中的类别 w3 中的特征 x1 ,用程序画出当k=1,3,5时的概率密度估计结果。
(b)编写程序,对于二维的情况,当有n个数据样本点时,进行k-近邻概率密度估计。对表格中的类别 w2 中的特征 (x1,x2)t ,用程序画出当k=1,3,5时的概率密度估计结果。
kneighbor.m
%使用kn近邻概率密度估计方法,分别对一维,二维,三维的数据进行估计
%k为参数,a为样本
%测试数据为一维
function px = kneighbor(a, kn, x)
[m, n] = size(a);
b = x;
N = 100;
if n == 1 %当为一维向量时
px = zeros(N,1);
vn1 = zeros(N,1);
for i = 1:N
for j = 1:m
vn1(j) = abs(b(i) - a(j));%求出vn,即两个数据点的距离长度
end
vn1 = sort(vn1); %将每一列由小到大排列一遍
px(i) = kn / N / (vn1(kn)); %计算概率密度
end
%disp(px);
end
if n == 2 %当为二维向量时
px = zeros(N,1); %用于存储概率
vn2 = zeros(N,1);
for i = 1:N
for j = 1:m
vn2(j) = sqrt((b(i,1)-a(j,1))^2+(b(i,2)-a(j,2))^2); %计算出两点之间的距离
end
vn2 = sort(vn2);
px(i) = kn/N/(vn2(kn)); %计算出概率密度
end
end
end
testKneighbor.m
%用于进行上机题4-4
clear
load('w1.mat');
load('w2.mat');
load('w3.mat');
k1=1;
k2=3;
k3=5;
%完成4-4第三题
a1=w3(:,1);
N=100;
b=2*rand(N,1); %首先产生100个0-3之间的随机数
p1=kneighbor(a1,k1,b);
p2=kneighbor(a1,k2,b);
p3=kneighbor(a1,k3,b);
figure(1);
subplot(1,4,1);
plot(b,p1,'.');
subplot(1,4,2);
plot(b,p2,'.');
subplot(1,4,3);
plot(b,p3,'.');
%完成4-4第三题
b1=[];
a2=w2(:,1);
a3=w2(:,2);
b1=[a2 a3];
b2=3*rand(N,2); %产生100个0-4的二维随机数
p11=kneighbor(b1,k1,b2);
p12=kneighbor(b1,k2,b2);
p13=kneighbor(b1,k3,b2);
data1=[b2 p11];
figure(2);
plot3(b2(:,1),b2(:,2),p11,'.');
grid on;
figure(3);
plot3(b2(:,1),b2(:,2),p12,'.');
grid on;
figure(4);
plot3(b2(:,1),b2(:,2),p13,'.');
grid on;
clear