是在概率论中用来估计未知的密度函数,属于非参数检验方法之一,由Rosenblatt (1955)和Emanuel Parzen(1962)提出,又名Parzen窗(Parzen window)。
Parzen窗估计方法是一种能够利用已知样本对总体分布密度函数进行估计的非参数估计方法。其基本思想是利用一定范围内各点密度的平均值对总体密度函数进行估计。
Parzen 窗闷派方法是一种具有坚实理论基础和优秀性能的非参数估计方法, 能够较好地描述数据的分布状态。
密度函数的估计公式如下:
其中K(x)是d维的核函数(窗口函数),且
hn是窗口大小。
公式理解源帆:假设我们要预测x点的概率密度函数pdf,我们可以在x处放置一个窗口大小为h的雹罩雹窗口,看有多少个xi的观测落在这个窗口里面,pdf的值就是这些落在这个窗口里的观测的平均
给你一个具体应用的例子(matlab程序):
我们的数据X由标准正太分布和均值为3.5,方差为1的正太分布各采样50个组成,预测X的pdf的代码如下,kde实现parzen-window estimator方法,kde这个函数包你可以在http://www.mathworks.com/matlabcentral/fileexchange/14034下载:
randn('seed',8192)
x = [randn(50,1)randn(50,1)+3.5]
[h, fhat, xgrid] = kde(x, 401)
figure
hold on
plot(xgrid, fhat, 'linewidth', 2, 'color', 'black')
plot(x, zeros(100,1), 'b+')
xlabel('x')
ylabel('Density function')
hold off
用randn命令生成标准正态分布随机数(均值为0,方差为1):R = randn(N) returns an N-by-N matrix containing pseudorandom values drawn from the standard normal distribution.
均值为1方差告纯为0.2正态分布的500个随机数,如友历语句如下渣搜:
r=1+0.2.*randn(1,500)
在写《用Matlab演示Parzen窗法》的时候,不知道怎样在m中设计可变参数函数可以阅读一些m自带函数源码,只要将最后一个参数设置为varargin,就可以实现。
例如写了一个函数:function test(varargin)
那么在这个函数里,varargin就是一个cell数组,它包含了用户输入的参数。下面是一个例子:function test(varargin)
disp(['nargin is ' num2str(nargin)])
for v=1:numel(varargin)
disp(['varargin{' num2str(v) '} class is ' class(varargin{v})])
en
完全就是使用cell数组的方法来处理用户输入的个数不定的参数,如果我们这样调用这个函数
>>test()
会得到结果:
nargin is 0
表示用户输入参数个数为0个,就信戚是没有输入参数。
如果这样调用:
>>test(1,'a',uint8(32),'123456')
会得到结果:
nargin is 4
varargin{1} class is double
varargin{2} class is char
varargin{3} class is uint8
varargin{4} class is char
表示用户输入了4个参数,第一个是double类型,第二个是char类型,第三个是uint8类型,第四个也是char类型。
也就是说,只要把函数的参数列表的最后一个参数写成varargin,就可以在函数内部以访问cell数组的滑睁陵方式来获取可变参数的信息。
有了这个varargin,我们就可以改写原来那个Parzen函数了。原来的Parzen函早棚数的最后一个参数是函数句柄,用来传入窗函数,但是也可不指定窗函数,那么Parzen会自动使用正态窗,但是那时不知道使用varargin,于是在使用默认的正态窗时,最后一个参数依然得指定,输入一个[ ]。这样也凑合,能用,但毕竟不优雅。
做最简单的雷达信号仿真,需要使用Parzen窗法估计接收信号的概率密度函数,以使用贝叶斯来确定门限。趁此机会把Parzen函数改写了,如下:
function p=Parzen(xi,x,h1,varargin)
%xi为样本,x为概率密度函数的自变量的取值,%h1为样本数为1时的窗宽,%最后一个参数为窗函数句柄,%不指定则使用正态窗,%返回x对应的概率密度函数值。
n=numel(varargin)
if 0==n
%若没有指定窗的类型,就使用正态窗函数
f=@(u)(1/sqrt(2*pi))*exp(-0.5*u.^2)
elseif 1==n
if isa(varargin{1},'function_handle')
f=varargin{1}
else
disp('The last param must be function handle')
p=[]
return
end
else
disp('too many param')
p=[]
return
end
N=size(xi,2)
hn=h1/sqrt(N)
[X Xi]=meshgrid(x,xi)
p=sum(f((X-Xi)/hn)/hn)/N
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)