Halcom 发表于 2017-2-4 21:23:27

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






cfbgsx 发表于 2017-8-17 00:08:56

不错,支持下!
页: [1]
查看完整版本: K最近邻密度估计法