K近邻估计

来源:互联网 发布:数据库储存的是 编辑:程序博客网 时间:2024/05/29 11:12

Kn-----近邻估计

        KN近邻估计基本思想:预先确定n的某个函数Kn,然后再x点周围选择一个区域,调整区域体积大小,直至Kn个样本落入区域中。这些样本被称为点x的Kn个最近邻。

        如果x点附近的密度比较高,则V的体积自然就相对较小,从而可以提升分辨力;

        如果x点附近的密度比较低,则V的体积就较大,但一进入高密度区就会停止增长。

 

        固定样本数Kn,在x附近选取与之最近的Kn个样本,计算该Kn个样本的最小体积V。在x处的概率密度估计值为:

通常选择:,当n值为有限值时,Kn近邻估计十分粗糙。


一个例子:


MATLAB实现:

kn_estimate.m

clc;clear;% 数据的均值向量Mu = [0; 1]';% 协方差矩阵S(:, :, 1) = 1;S(:, :, 2) = 1;P = [1/3 2/3];% 样本数据规模N = 100;knn = fix( sqrt(N) );% 1.生成数据randn('seed', 0);[X] = generate_gauss_classes(Mu, S, P, N);%  待估计的概率密度函数x = -5:0.1:5;pdfx = (1/3)*(1/sqrt(2*pi*0.2))*exp(-.5*(x.^2)/0.2)+...    (2/3)*(1/sqrt(2*pi*0.2))*exp(-.5*((x-2).^2)/0.2);figure();hold on;plot(x, pdfx, '-b');% 使用knn估计方法pdfx_approx = knn_density_estimate(X, knn, -5, 5, 0.1);plot(x, pdfx_approx, '-r');hold off;xlabel(['N=', num2str(N), ', k=', num2str(knn)]);legend('真实概率密度函数','knn估计密度函数','Location','best');% 取不同的N和k看估计的变化range_N = [100, 1000, 10000];range_k = fix( sqrt(range_N) );figure();k = 1;for i=1:3    temp_N = range_N(i);    [temp_X] = generate_gauss_classes(Mu, S, P, temp_N);    pdfx_approx = knn_density_estimate(temp_X, range_k(i), -5, 5, 0.1);    subplot(1,3,k);    plot(x, pdfx, '-b', x, pdfx_approx, '-r');    grid on;    title(['N=', num2str(temp_N), ', k=', num2str(range_k(i))]);    k = k+1;end


generate_gauss_classes.m(生成正态分布数据)

function [ data, C ] = generate_gauss_classes( M, S, P, N )%{    函数功能:        生成样本数据,符合正态分布    参数说明:        M:数据的均值向量        S:数据的协方差矩阵        P:各类样本的先验概率,即类别分布        N:样本规模    函数返回        data:样本数据(2*N维矩阵)        C:样本数据的类别信息%}[~, c] = size(M);data = [];C = [];for j = 1:c    % z = mvnrnd(mu,sigma,n);    % 产生多维正态随机数,mu为期望向量,sigma为协方差矩阵,n为规模。    % fix 函数向零方向取整    t = mvnrnd(M(:,j), S(:,:,j), fix(P(j)*N))';        data = [data t];    C = [C ones(1, fix(P(j) * N)) * j];endend


knn_density_estimate.m(k近邻估计)

function [ px ] = knn_density_estimate( X, knn, xleftlimit, xrightlimit, xstep )%{    函数功能:        使用knn方法估计概率密度函数    参数说明:        X:样本数据        knn:k的取值大小        xleftlimit和xrightlimit:表示左右边界        xstep:前进的步长    函数返回:        px:估计得到的概率密度函数%}[l, N] = size(X);if l>1    px=[];    fprintf('Feature set has more than one dimensions');    return;endk=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;endend

实验结果:





原创粉丝点击