这次机器学习的实验是第四章非参数技术课后上机题,4.3和4.4 下面从实验报告中截取代码及部分运行结果
工具:matlab
4.3节
2. 考虑对于表格中的数据进行Parzen窗估计和设计分类器。窗函数为一个球形的高斯函数,如下所示:
(a) 编写程序,使用Parzen窗估计方法对一个任意的测试样本点x进行分类。对分类器的训练则使用表格中的三维数据。同时令h=1,分类样本点为(0.5,1.0,0.0)t,(0.31,1.51,-0.5)t,(-0.3,0.44,-0.1)t.
(b) 现在我们令h=0.1,重复(a)。
4.4节
3. 考虑不同维数的空间中,使用k-近邻概率密度估计方法的效果。
(a)编写程序。对于一维的情况,当有n个数据样本点时,进行k-近邻概率密度估计。对表格中的类别ω3中的特征,x1,用程序画出当k=1,3,5时的概率密度估计结果。
(b)编写程序,对于二维的情况,当有n个数据样本点时,进行k-近邻概率密度估计。对表格中的类别ω2中的特征(x1,x2)t用程序画出当k=1,3,5时的概率密度估计结果。
(c)对表格中的3个类别的三维特征,使用k-近邻概率密度估计方法。并且对下列点处的概率密度进行估计:(-0.41,0.82,0.88)t,(0.14,0.72,4.1)t,(-0.81,0.61,-0.38)t
同时由于所以将30个样本数据和已经给定的h带入公式,分别算出p(w1),p(w2),p(w3)即可。
function p = parzen(m,h,x)%m是30个样本点的矩阵 h是给定的边长,x是测试样本向量
p=zeros(3,1);%概率密度向量
px=0;%中间变量,用于存储结果
for i=1:10
hn=h/sqrt(i);
px=px+exp(-((x-m(i,:))*(x-m(i,:))')/2*hn*hn)/sqrt(2*pi)/(hn*hn*hn);
end
p(1,1)=px/10;
%第一维概率密度求解结束
px=0;
for i=11:20
hn=h/sqrt(i-10);
px=px+exp(-((x-m(i,:))*(x-m(i,:))')/2*hn*hn)/sqrt(2*pi)/(hn*hn*hn);
end
p(2,1)=px/10;
%第二维概率密度求解结束
px=0;
for i=21:30
hn=h/sqrt(i-20);
px=px+exp(-((x-m(i,:))*(x-m(i,:))')/2*hn*hn)/sqrt(2*pi)/(hn*hn*hn);
end
p(3,1)=px/10;
%第三维概率密度求解结束
end
4.4
Knn估计法是说对于一个样本点,我们固定它周围的样本个数k,然后从最小距离开始找,直到找出k个样本点为止。然后以第k个(也就是最远的那个)样本到测试样本的距离为体积的单位长度,可以包含这k个样本点,也就可以算出公式里的Vn。
最后把k,N,Vn全部代入公式即可求出pn
(a)function p = knn1d(m,k)
testm=sort(randn(200,1));%已经排好序的随机数据,200行 一列,共200个
dist=zeros(200,10);%距离矩阵,200个测试样本和10个训练样本的距离
for i=1:200
for j=1:10
dist(i,j)=abs(testm(i)-m(j)); %一维就是单纯的取绝对值
end
end
distsort=sort(dist,2);%每行升序排序
p=zeros(200,1);
for i=1:200
p(i)=k/200/(distsort(i,k)/2);%一维的“体积”是距离乘2
end
plot(testm,p);
End
部分实验结果:
(b)
%与knn1d基本相似,唯一不同的是Vn的计算和距离的计算。距离是欧式距离,Vn二维情况是一个圆形的计算,
function p = knn2d(m,k)
testm=sort(randn(200,2));
dist=zeros(200,10);
for i=1:200
for j=1:10
dist(i,j)=sqrt((testm(i)-m(j))*(testm(i)-m(j))');
end
end
distsort=sort(dist,2);
p=zeros(200,1);
for i=1:200
p(i)=k/200/pi/(distsort(i,k).^2);
end
plot3(testm(:,1),testm(:,2),p);
end
function p = knn3d(m,k,x)%m是30个样本矩阵,x是测试样本。
p=zeros(3,1);
dist=zeros(3,10);
for i=1:3
for j=1:10
dist(i,j)=sqrt((x-m(j+(i-1)*10,:))*(x-m(j+(i-1)*10,:))');
end
end
distsort=sort(dist,2);
for i=1:3
p(i)=k/10/(4*pi*(dist(i,k).^3)/3);
end
End
最后附上3个数据矩阵 data w1 w2 parzen函数用data,knn1d函数用w1,knn2d函数用w2,knn3d函数用data。
错误之处在所难免,欢迎指出。