K最近邻密度估计法
考虑有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=';
S(:,:,1)=;
S(:,:,2)=;
P=;
N=1000;
randn('seed',0);
=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 =knn_density_estimate(X,knn,xleftlimit,xrightlimit,xstep)
% 函数调用格式
% =knn_density_estimate(X,knn,xleftlimit,xrightlimit,xstep)
%k-nn最近邻密度估计
%输入:
% X: 数据点
% knn: 最近邻个数.
% xleftlimit: x的最小估计值
% xrightlimit: x的最大估计值
% xstep: 步长
%输出:
% px: p(x)的估计值
=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
不错,支持下!
页:
[1]