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
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
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
实验结果:
阅读全文
1 0
- K近邻估计
- 非参数估计-parzen窗估计和k近邻估计
- parzen窗方法和k近邻方法估计概率密度
- 模式识别:非参数估计法之Parzen窗估计和k最近邻估计
- K 近邻
- k近邻
- k近邻
- k-近邻
- k-近邻
- k-近邻
- k近邻
- 最近邻与K近邻
- k最近邻(k-nn)
- K-NN(k近邻算法)
- k-近邻算法(k-nn)
- K近邻算法
- K近邻算法
- K近邻算法
- vb.net 教程 11-1 打印组件 5 PrintPreviewDialog
- 算法导论 思考题 16-2b 最小平均完成时间调度问题
- hibernate中get()和load()的区别
- leetcode152. Maximum Product Subarray
- 编译内核时错误处理
- K近邻估计
- C语言三种算法求解最大公约数与最小公倍数
- 图片
- iOS 算法~二分法(好处、特点、思路)
- VIM代码自动补全
- Hydra7.3安装
- Pycon 2017: Python可视化库大全
- 复习笔记(1)
- Linux initrd的解压与压缩