非参数检验方法,考虑有N个数据点,x属于R ,i=1,2,……,N ,采用Parzen窗来估计未知的密度函数,具体的表达式如下:
p(x) = sum(fai( (x-xi)/h )) / N/ h
其中N足够大,h充分小,通常由用户自己设定。fai( x ) 函数为核密度估计函数。通常核密度估计函数采用高斯分布函数,因此有:p(x) = 1/N * sum( exp(-(x-xi)^2/2/h/h )/h/sqrt(2*pi) )
MATLAB代码如下:
- clc,clear,close all % 清屏、清工作区、关闭窗口
- warning off % 消除警告
- feature jit off % 加速代码执行
- % 概率密度函数实际是一个混合高斯分布函数
- % 采用 generate_gauss_classes函数产生所需要的数据
- m=[1; 4]'; % 初始化
- S(:,:,1)=[0.3];
- S(:,:,2)=[0.3];
- P=[2/3 1/3];
- N=1000;
- randn('seed',0);
- [X]=generate_gauss_classes(m,S,P,N);
- % 绘图pdf
- x=-5:0.1:5;
- pdfx=(2/3)*(1/sqrt(2*pi*0.2))*exp(-.5*((x-1).^2)/0.2)+(1/3)*(1/sqrt(2*pi*0.2))*exp(-.5*((x-4).^2)/0.2);
- plot(x,pdfx); hold on;
- %Parzon窗计算,h = 0.1 and x in [-5, 5]
- h=0.1;
- pdfx_approx=Parzen_gauss_kernel(X,h,-5,5);
- plot(-5:h:5,pdfx_approx,'r');
- legend('原始分布函数','Parzen窗逼近效果')
复制代码 相应的函数如下:
- function [px]=Parzen_gauss_kernel(X,h,xleftlimit,xrightlimit)
- % 函数调用格式
- % [px]=Parzen_gauss_kernel(X,h,xleftlimit,xrightlimit)
- % Parzen 使用高斯基逼近一维PDF
- %输入:
- % X: 数据点
- % h: 步长
- % xleftlimit: x的最小估计值
- % xrightlimit: x的最大估计值
- %输出:
- % px: p(x)的估计值
-
- [l,N]=size(X);
- xstep=h;
- k=1;
- x=xleftlimit;
- while x<xrightlimit+xstep/2
- px(k)=0;
- for i=1:N
- xi=X(:,i);
- px(k)=px(k)+exp(-(x-xi)'*(x-xi)/(2*h^2));
- end
- px(k)=px(k)*(1/N)*(1/(((2*pi)^(l/2))*(h^l)));
- k=k+1;
- x=x+xstep;
- end
复制代码 产生服从高斯分布的数据集
- function [X,y]=generate_gauss_classes(m,S,P,N)
- % 产生服从高斯PDF分布的数据集
- %输入:
- % m: 均值向量
- % S: 正态分布的协方差矩阵
- % P: 先验概率密度
- % N: 总数据个数
- %输出:
- % X: 待分类的数据
- % y: 分类的标签,对应于X
- [l,c]=size(m);
- X=[]; % 初始化
- y=[];
- for j=1:c
- % 产生每一个分布下的 the [p(j)*N] 向量
- t=mvnrnd(m(:,j),S(:,:,j),fix(P(j)*N))';
- % 由于采用的是fix函数,总数据数可能小于N
- X=[X t];
- y=[y ones(1,fix(P(j)*N))*j];
- end
复制代码
|