模式识别:非参数估计法之Parzen窗估计和k最近邻估计

本实验的目的是学习Parzen窗估计和k最近邻估计方法。在之前的模式识别研究中,我们假设概率密度函数的参数形式已知,即判别函数J(.)的参数是已知的。本节使用非参数化的方法来处理任意形式的概率分布而不必事先考虑概率密度的参数形式。在模式识别中有躲在令人感兴趣的非参数化方法,Parzen窗估计和k最近邻估计就是两种经典的估计法。

参考书籍:《模式分类》

作者:RichardO.Duda,PeterE.Hart,DavidG.Stork

一、基本原理

1.非参数化概率密度的估计

对于未知概率密度函数的估计方法,其核心思想是:一个向量x落在区域R中的概率可表示为:

其中,P是概率密度函数p(x)的平滑版本,因此可以通过计算P来估计概率密度函数p(x),假设n个样本x1,x2,…,xn,是根据概率密度函数p(x)独立同分布的抽取得到,这样,有k个样本落在区域R中的概率服从以下分布:

其中k的期望值为:

k的分布在均值附近有着非常显著的波峰,因此若样本个数n足够大时,使用k/n作为概率P的一个估计将非常准确。假设p(x)是连续的,且区域R足够小,则有:

如下图所示,以上公式产生一个特定值的相对概率,当n趋近于无穷大时,曲线的形状逼近一个δ函数,该函数即是真实的概率。公式中的V是区域R所包含的体积。综上所述,可以得到关于概率密度函数p(x)的估计为:

在实际中,为了估计x处的概率密度函数,需要构造包含点x的区域R1,R2,…,Rn。第一个区域使用1个样本,第二个区域使用2个样本,以此类推。记Vn为Rn的体积。kn为落在区间Rn中的样本个数,而pn (x)表示为对p(x)的第n次估计:

欲满足pn(x)收敛:pn(x)→p(x),需要满足以下三个条件:

有两种经常采用的获得这种区域序列的途径,如下图所示。其中“Parzen窗方法”就是根据某一个确定的体积函数,比如Vn=1/√n来逐渐收缩一个给定的初始区间。这就要求随机变量kn和kn/n能够保证pn (x)能收敛到p(x)。第二种“k-近邻法”则是先确定kn为n的某个函数,如kn=√n。这样,体积需要逐渐生长,直到最后能包含进x的kn个相邻点。

2.Parzen窗估计法

已知测试样本数据x1,x2,…,xn,在不利用有关数据分布的先验知识,对数据分布不附加任何假定的前提下,假设R是以x为中心的超立方体,h为这个超立方体的边长,对于二维情况,方形中有面积V=h^2,在三维情况中立方体体积V=h^3,如下图所示。

根据以下公式,表示x是否落入超立方体区域中:

估计它的概率分布:

其中n为样本数量,h为选择的窗的长度,φ(.)为核函数,通常采用矩形窗和高斯窗。

3.k最近邻估计

在Parzen算法中,窗函数的选择往往是个需要权衡的问题,k-最近邻算法提供了一种解决方法,是一种非常经典的非参数估计法。基本思路是:已知训练样本数据x1,x2,…,xn而估计p(x),以点x为中心,不断扩大体积Vn,直到区域内包含k个样本点为止,其中k是关于n的某一个特定函数,这些样本被称为点x的k个最近邻点。

当涉及到邻点时,通常需要计算观测点间的距离或其他的相似性度量,这些度量能够根据自变量得出。这里我们选用最常见的距离度量方法:欧几里德距离。

最简单的情况是当k=1的情况,这时我们发现观测点就是最近的(最近邻)。一个显著的事实是:这是简单的、直观的、有力的分类方法,尤其当我们的训练集中观测点的数目n很大的时候。可以证明,k最近邻估计的误分概率不高于当知道每个类的精确概率密度函数时误分概率的两倍。

二、实验基本步骤

第一部分,对表格中的数据,进行Parzen 窗估计和设计分类器,本实验的窗函数为一个球形的高斯函数,如下:

1) 编写程序,使用Parzen 窗估计方法对一个任意的测试样本点x 进行分类。对分类器的训练则使用表格 3中的三维数据。同时,令h =1,分类样本点为(0.5,1.0,0.0),(0.31,1.51,-0.50),(-0.3,0.44,-0.1)进行实验。

2) 可以改变h的值,不同的h将导致不同的概率密度曲线,如下图所示。

h=0.1时:

h=0.5时:

h=1时:

第二部分的实验目的是学习和掌握非参数估计:k-近邻概率密度估计方法。对前面表格中的数据进行k-近邻概率密度估计方法和设计分类器。

编写程序,对表格中的3个类别的三维特征,使用k-近邻概率密度估计方法。并且对下列点处的概率密度进行估计:(-0.41,0.82,0.88),(0.14,0.72, 4.1) ,(-0.81,0.61,-0.38)。

实验代码如下:

% Parzen窗算法
% w:c类训练样本
% x:测试样本
% h:参数
% 输出p:测试样本x落在每个类的概率
function p = Parzen(w,x,h)

[xt,yt,zt] = size(w);

p = zeros(1,zt);

for i = 1:zt
    hn = h;
    for j = 1:xt
        hn = hn / sqrt(j);
        p(i) = p(i) + exp(-(x - w(j,:,i))*(x - w(j,:,i))‘/ (2 * power(hn,2))) / (hn * sqrt(2*3.14));
    end
    p(i) = p(i) / xt;
end
% k-最近邻算法
% w:c类训练样本
% x:测试样本
% k:参数
function p = kNearestNeighbor(w,k,x)

% w = [w(:,:,1);w(:,:,2);w(:,:,3)];

[xt,yt,zt] = size(w);

wt = [];%zeros(xt*zt, yt);

if nargin==2
p = zeros(1,zt);
    for i = 1:xt
        for j = 1:xt
        dist(j,i) = norm(wt(i,:) - wt(j,:));
        end
        t(:,i) = sort(dist(:,i));
        m(:,i) = find(dist(:,i) <= t(k+1,i)); % 找到k个最近邻的编号
    end
end  

if nargin==3
    for q = 1:zt
    wt = [wt; w(:,:,q)];
    [xt,yt] = size(wt);
    end
        for i = 1:xt
        dist(i) = norm(x - wt(i,:));
        end
        t = sort(dist); % 欧氏距离排序
        [a,b] = size(t);

        m = find(dist <= t(k+1)); % 找到k个最近邻的编号

        num1 = length(find(m>0 & m<11));
        num2 = length(find(m>10 & m<21));
        num3 = length(find(m>20 & m<31));
if yt == 3
        plot3(w(:,1,1),w(:,2,1),w(:,3,1), ‘r.‘);
        hold on;
        grid on;
        plot3(w(:,1,2),w(:,2,2),w(:,3,2), ‘g.‘);
        plot3(w(:,1,3),w(:,2,3),w(:,3,3), ‘b.‘);

if (num1 > num2) || (num1 > num3)
    plot3(x(1,1),x(1,2),x(1,3), ‘ro‘);
    disp([‘点:[‘,num2str(x),‘]属于第一类‘]);
elseif (num2 > num1) || (num2 > num3)
    plot3(x(1,1),x(1,2),x(1,3), ‘go‘);
    disp([‘点:[‘,num2str(x),‘]属于第二类‘]);
elseif (num3 > num1) || (num3 > num2)
    plot3(x(1,1),x(1,2),x(1,3), ‘bo‘);
    disp([‘点:[‘,num2str(x),‘]属于第三类‘]);
else
    disp(‘无法分类‘);
end
end

if yt == 2
        plot(w(:,1,1),w(:,2,1), ‘r.‘);
        hold on;
        grid on;
        plot(w(:,1,2),w(:,2,2), ‘g.‘);
        plot(w(:,1,3),w(:,2,3), ‘b.‘);

if (num1 > num2) || (num1 > num3)
    plot(x(1,1),x(1,2), ‘ro‘);
    disp([‘点:[‘,num2str(x),‘]属于第一类‘]);
elseif (num2 > num1) || (num2 > num3)
    plot(x(1,1),x(1,2), ‘go‘);
    disp([‘点:[‘,num2str(x),‘]属于第二类‘]);
elseif (num3 > num1) || (num3 > num2)
    plot(x(1,1),x(1,2), ‘bo‘);
    disp([‘点:[‘,num2str(x),‘]属于第三类‘]);
else
    disp(‘无法分类‘);
end
end

end
title(‘k-最近邻分类器‘);
legend(‘第一类数据‘,...
       ‘第二类数据‘,...
       ‘第三类数据‘,...
       ‘测试样本点‘);
clear;
close all;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Parzen窗估计和k最近邻估计
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
w1(:,:,1) = [ 0.28  1.31  -6.2;...
             0.07  0.58  -0.78;...
             1.54  2.01  -1.63;...
            -0.44  1.18  -4.32;...
            -0.81  0.21   5.73;...
             1.52  3.16   2.77;...
             2.20  2.42  -0.19;...
             0.91  1.94   6.21;...
             0.65  1.93   4.38;...
            -0.26  0.82  -0.96];

w1(:,:,2) = [0.011  1.03  -0.21;...
             1.27  1.28   0.08;...
             0.13  3.12   0.16;...
            -0.21  1.23  -0.11;...
            -2.18  1.39  -0.19;...
             0.34  1.96  -0.16;...
            -1.38  0.94   0.45;...
            -0.12  0.82   0.17;...
            -1.44  2.31   0.14;...
             0.26  1.94   0.08];

w1(:,:,3) = [ 1.36  2.17  0.14;...
             1.41  1.45 -0.38;...
             1.22  0.99  0.69;...
             2.46  2.19  1.31;...
             0.68  0.79  0.87;...
             2.51  3.22  1.35;...
             0.60  2.44  0.92;...
             0.64  0.13  0.97;...
             0.85  0.58  0.99;...
             0.66  0.51  0.88];

x(1,:) = [0.5 1 0];
x(2,:) = [0.31 1.51 -0.5];
x(3,:) = [-0.3 0.44 -0.1];

% 验证h的二维数据
w2(:,:,1) = [ 0.28  1.31  ;...
             0.07  0.58  ;...
             1.54  2.01  ;...
            -0.44  1.18  ;...
            -0.81  0.21  ;...
             1.52  3.16  ;...
             2.20  2.42  ;...
             0.91  1.94  ;...
             0.65  1.93  ;...
            -0.26  0.82  ];

w2(:,:,2) = [0.011  1.03 ;...
             1.27  1.28  ;...
             0.13  3.12  ;...
            -0.21  1.23  ;...
            -2.18  1.39  ;...
             0.34  1.96  ;...
            -1.38  0.94  ;...
            -0.12  0.82  ;...
            -1.44  2.31  ;...
             0.26  1.94  ];

w2(:,:,3) = [1.36  2.17 ;...
             1.41  1.45 ;...
             1.22  0.99 ;...
             2.46  2.19 ;...
             0.68  0.79 ;...
             2.51  3.22 ;...
             0.60  2.44 ;...
             0.64  0.13 ;...
             0.85  0.58 ;...
             0.66  0.51 ];

y(1,:) = [0.5 1];
y(2,:) = [0.31 1.51];
y(3,:) = [-0.3 0.44];

h = .1; % 重要参数

p = Parzen(w1,x(1,:),h);
num = find(p == max(p));
disp([‘点:[‘,num2str(x(1,:)),‘]落在三个类别的概率分别为:‘,num2str(p)]);
disp([‘点:[‘,num2str(x(1,:)),‘]落在第‘,num2str(num),‘类‘]);

% 给定三类二维样本,画出二维正态概率密度曲面图验证h的作用
num =1; % 第num类的二维正态概率密度曲面图,取值为1,2,3
draw(w2,h,num);
str1=‘当h=‘;str2=num2str(h);str3=‘时的二维正态概率密度曲面‘;
SC = [str1,str2,str3];
title(SC);

% k近邻算法设计的分类器
% x1和y1为测试样本
x1 = [-0.41,0.82,0.88];
x2 = [0.14,0.72, 4.1];
x3 = [-0.81,0.61,-0.38];
y(1,:) = [0.5 1];
y(2,:) = [0.31 1.51];
y(3,:) = [-0.3 0.44];
w = w1;
%w = w1(:,1,3);
k = 5;
kNearestNeighbor(w,k,x1);
kNearestNeighbor(w,k,x2);
kNearestNeighbor(w,k,x3);
时间: 2024-11-18 03:49:04

模式识别:非参数估计法之Parzen窗估计和k最近邻估计的相关文章

机器学习 —— 基础整理(三):非参数方法——Parzen窗估计、k近邻估计;k近邻分类器

本文简述了以下内容: (一)非参数方法 (二)Parzen窗估计 (三)k近邻估计 (四)k近邻算法(k-nearest neighbor,kNN) (一)非参数方法(Non-parametric method) 对于生成模型来说,重要的地方在于类条件概率密度 $p(\textbf x|\omega_i)$ 的估计.上一篇介绍的参数方法,假定其是一个固定的分布密度形式,然后估计这个显式表达的函数中未知的参数.但这里存在两个问题:首先,假定的形式可能是不准确的,实际数据并不符合这个假设:其次,经典

非参数估计——Parzen窗与k近邻估计

? ? ? ?在做分类问题时,有时候需要使用样本的概率密度函数来求其后验概率.但是很多情况下并不知道其概率密度函数的形式(即样本的分布未知),此时就需要对样本进行非参数估计,来求解其概率密度函数. ? ? ? ?求解未知分布样本的概率密度函数的一种方法是:\(n\)个样本点中,在某点周围取一个区间\(R_{n}\),计算区间\(R_{n}\)的体积\(V_{n}\)以及落在\(R_{n}\)中的样本的个数\(k_{n}\),然后就可以求出该点处的概率密度: \[p(\boldsymbol{x})

【中途相遇法】【STL】BAPC2014 K Key to Knowledge

题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11674&courseid=0 题目大意: N个学生M道题(1<=N<=12,1<=M<=30),每道题只有正误两种选项(0 1),每个学生的答题情况和正确题数已知,求标准答案可能有多少种. 如果标准答案只有一种则输出标准答案,否则输出解的个数. 题目思路: [

模式识别:k-均值聚类的研究与实现

本实验的目的是学习和掌握k-均值聚类算法.k-均值算法是一种经典的无监督聚类和学习算法,它属于迭代优化算法的范畴.本实验在MATLAB平台上,编程实现了k-均值聚类算法,并使用20组三维数据进行测试,比较分类结果.实验中初始聚类中心由人为设定,以便于实验结果的比较与分析. 一.技术论述 1.无监督学习和聚类 在之前设计分类器的时候,通常需要事先对训练样本集的样本进行标定以确定类别归属.这种利用有标记样本集的方法称为"有监督"或"有教师"方法.这一类方法的使用固然十分

《机器学习实战》学习笔记:k-近邻算法实现

上一学期主要的学习和研究任务是模式识别.信号理论和图像处理,实际上这些领域都与机器学习有或多或少的交集.因此,仍在继续深入阅读<机器学习>.观看斯坦福大学的机器学习课程.在此过程中因为未来课题组项目的要求,需要接触Python,因此选择了<机器学习实战>这本书,同时参考教材和视频一起学习.事实上该书的理论研究不够深入,只能算是练习Python并验证一些著名的机器学习算法的工具书了. 在介绍k-近邻算法之前,对机器学习算法进行简单的分类和梳理:简单来说,机器学习主要分为两大类,有监督

简单易学的机器学习算法——Mean Shift聚类算法

一.Mean Shift算法概述 Mean Shift算法,又称为均值漂移算法,Mean Shift的概念最早是由Fukunage在1975年提出的,在后来由Yizong Cheng对其进行扩充,主要提出了两点的改进: 定义了核函数: 增加了权重系数. 核函数的定义使得偏移值对偏移向量的贡献随之样本与被偏移点的距离的不同而不同.权重系数使得不同样本的权重不同.Mean Shift算法在聚类,图像平滑.分割以及视频跟踪等方面有广泛的应用. 二.Mean Shift算法的核心原理 2.1.核函数 在

模式识别(Pattern Recognition)学习笔记(六)——概率密度函数的非参估计

上篇学习了PDF的参数估计方法,主要有最大似然估计和贝叶斯估计,他们主要对有确定形式的PDF进行参数估计,而在实际情况下,并不能知道PDF的确切形式,只能通过利用所有样本对整个PDF进行估计,而且这种估计只能是利用数值方法求解.通俗的说,如果参数估计是从指定的某一类函数中选择一个作为目标估计,那么非参数估计就是从所有可能的函数中找到一个合适的选择. 非参数估计主要有三种方法:直方图法.kn近邻法.核函数法,其中核函数法又叫Parzen窗法或核密度法. 1.直方图法 这是一种最简单也最直观的一种非

模式识别---贝叶斯分类

1.数据库 Dataset1.txt:328个同学的身高.体重.性别数据(78个女生250个男生) Dataset2.txt:124个同学的数据(40女.84男) Dataset3.txt:90个同学的数据(16女,74男) 数据集:提取码:e8ph 2.需要完成的工作 (1)以dataset1为训练数据库,假设身高与体重满足高斯分布,进行高斯分布的参数估计,并进行基于最小错误率的贝叶斯分类,分别考虑男女的先验概率,0.5-0.5:0.6-0.4:0.7-0.3,0.8-0.2,并以datase

fir 窗口设计法

加窗的原因.对于理想的低通滤波器H(exp(jw)),其h(n)是无限长序列.这是可以证明的.因此为了得到有限长的h(n)就需要截断,而这个过程就是加窗.由于h(n)截断即其频率响应就和理想的低通滤波器有差别.从感性上分析,h(n)越长,Hw(exp(jw))也就越接近理想低通滤波器,这就对应确定序列的长度.还有就是如何截断即加什么窗,对Hw(exp(jw))也是有影响.这就是对应的窗的设计. 窗口设计法:H(exp(jw)) = F(h(n)), W(exp(jw)) = F(w(n)). F