考虑有N个数据点,x属于R,i=1,2,……,N,对于我们而言,这组数据统计分布未知,对于给定的x,通过k最近邻密度估计法,计算未知概率密度函数的参数值,主要的计算步骤如下: (1)选择k值; (2)计算x到所有 x属于R,i=1,2,……,N的距离(距离计算可用欧式距离或者马氏距离等); (3)找到k个离最近的点; (4)计算k个离最近的点所在的体积V(x); (5)得到概率分布函数: p(x) = k/N/V(x)
采用欧氏距离计算,在得到的k个离x最近的点找到最远的那一个点,距离记为,则体积为: q 对于一维数据点而言,V(x) = 2*ρ; q 对于二维数据点而言,V(x) = pi*ρ; q 对于三维数据点而言,V(x) = 4*pi*ρ*ρ*ρ/3。
MATLAB代码如下: - clc,clear,close all % 清屏、清工作区、关闭窗口
- warning off % 消除警告
- feature jit off % 加速代码执行
- %概率密度函数实际为混合高斯模型
- 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);
- % Plot the pdf
- x=-5:0.1:5;
- pdfx=(2/3)*(1/sqrt(2*pi))*exp(-((x-1).^2)/2)+(1/3)*(1/sqrt(2*pi))*exp(-((x-4).^2)/2);
- plot(x,pdfx); hold;
- %函数knn_density_estimate 估计概率密度函数 pdf (k=21)
- pdfx_approx=knn_density_estimate(X,21,-5,5,0.1);
- plot(-5:0.1:5,pdfx_approx,'r');
- legend('原始分布函数','K最近邻密度估计')
复制代码相应的K最近邻密度估计法函数如下: - function [px]=knn_density_estimate(X,knn,xleftlimit,xrightlimit,xstep)
- % 函数调用格式
- % [px]=knn_density_estimate(X,knn,xleftlimit,xrightlimit,xstep)
- % k-nn最近邻密度估计
- %输入:
- % X: 数据点
- % knn: 最近邻个数.
- % xleftlimit: x的最小估计值
- % xrightlimit: x的最大估计值
- % xstep: 步长
- %输出:
- % px: p(x)的估计值
- [l,N]=size(X);
- if l>1
- px=[];
- fprintf('Feature set has more than one dimensions ');
- return;
- end
-
- k=1;
- x=xleftlimit;
- while x<xrightlimit+xstep/2
- eucl=[];
- for i=1:N
- eucl(i)=sqrt(sum((x-X(:,i)).^2));
- end
- eucl=sort(eucl,'ascend'); % 升序
- ro=eucl(knn);
- V=2*ro;
- px(k)=knn/(N*V);
- k=k+1;
- x=x+xstep;
- end
复制代码
|