模式识别基础 概率密度函数非参数估计
小组成员:201211211056 黄心钤 201211211046 刘妙莹 201211211038 卢浩然
一、Parzen 窗估计程序:
我们小组使用 matlab 来实现书上的算法。
首先建立文件 parzen1.m
下面是函数的代码:
function p=parzen1(xi,x,h1,f)
%xi 为样本,x 为概率密度函数的自变量的取值,
%h1 为样本数为 1 时的窗宽,f 为窗函数句柄
%返回 x 对应的概率密度函数值
if isempty(f)
%若没有指定窗的类型,就使用正态窗函数
f=@(u)(1/sqrt(2*pi))*exp(-0.5*u.^2);
end;
N=size(xi,2);%N 为 xi 样本的列数
hn=h1/sqrt(N);
[X,Y]=meshgrid(x,xi);%生成采样点的 X,Y 坐标
p=sum(f((X-Y)/hn)/hn)/N;%书上公式
我们使用均匀分布的样本数据来检查我们的函数是否正确。
>> xi=rand(1,2000); %生成均匀分布的样本
>> x=linspace(-2,2,2000); %生成-2~2 递增的 2000 个数据。
>> p=parzen1(xi,x,1,[]);%调用函数,窗函数使用默认的正态窗
>> plot(x,p);
1.4
1.2
1
0.8
0.6
0.4
0.2
0
-1
-0.5
0
0.5
1
1.5
2
再使用正态分布的样本数据检查是否正确。
>> clear;%清除刚才的所有数据
>> xi=randn(1,2000);%生成正态分布的样本
>> x=linspace(-2,2,2000);%生成-2~2 递增的 2000 个数据。
>> p=parzen1(xi,x,1,[]); %调用函数,窗函数使用默认的正态窗
>> plot(x,p);
0.5
0.45
0.4
0.35
0.3
0.25
0.2
0.15
0.1
0.05
0
-2
-1.5
-1
-0.5
0
0.5
1
1.5
2
将窗宽增大后曲线明显平滑了许多(窗宽为 4 的情况):
0.45
0.4
0.35
0.3
0.25
0.2
0.15
0.1
0.05
-2
-1.5
-1
-0.5
0
0.5
1
1.5
2
二、 Kn-近邻估计程序:
首先建立函数文件 knjinlin.m
下面是函数的代码:
function p=knjinlin(xi)
N=size(xi,2);%获取
kn=sqrt(N);%取 kn 为 N^½
x=linspace(-2,2,1000);%生成图像横坐标
p=zeros(1,1000);%初始化概率密度值
for i=1:1000
y=sort(abs(x(i)-xi));%在一维情况下计算两点的距离作为体积
V=y(kn);%包含 Kn 个样本所需要的体积
p(i)=(kn/N)/V;%循环迭代计算
end
plot(x,p);
首先使用均匀分布验证函数是否正确:
>> x=rand(1,1024);%生成 1024 个样本使 kn 为整数,方便使用 kn 作为下标访问数组
>> p=knjinlin(x);
4
3.5
3
2.5
2
1.5
1
0.5
0
-2
-1.5
-1
-0.5
0
0.5
1
1.5
2
再使用正态分布验证函数:
>> x=randn(1,1024);
>> p=knjinlin(x);
1.4
1.2
1
0.8
0.6
0.4
0.2
0
-2
-1.5
-1
-0.5
0
0.5
1
1.5
2
图像都基本符合预期,就是噪声有点大。