【MATLAB】Parzen窗与K近邻算法原理与代码详解

文章目录

  • 1.非参数估计原理
  • 2.Parzen窗
    • 2.1.算法原理
    • 2.2.Matlab实现与参数探究
  • 3.K近邻
    • 3.1.算法原理
    • 3.2.Matlab实现与参数探究

1.非参数估计原理

\qquad已知一个样本的概率分布时,我们只需要对概率分布中的参数进行估计即可得到该样本的概率密度函数。例如已知样本X服从正态分布N(μ,σ)N(\mu,\sigma)N(μ,σ),通过样本对μ,σ\mu,\sigmaμ,σ进行估计。然而并不是每个样本的概率分布都是已知的,很多情况下我们只有样本但是没有概率分布模型。这个时候我们仍然要知道每个点的概率密度,这该怎么办呢?
\qquad概率密度函数p(x)p(x)p(x)实际上是概率分布函数F(x)F(x)F(x)的导数,概率分布函数是样本在一定范围内分布的总概率,我们可以利用这个思想去求取每个点的概率密度。首先,我们以我们想求概率密度的点x0x_0x0为中心,作超球体S(因为可能超过三维,因此称为超球体,广义的超球也包括了线段、圆、球),设S包含的体积为V,总样本数为N,有k个样本包含在超球体V中。则概率分布函数
F(x0,V)=P(X∈S)=k/NF(x_0,V)=P(X∈S)=k/NF(x0,V)=P(XS)=k/N
V→0,N→+∞V \rightarrow 0,N\to +\inftyV0,N+时,p^(x0)=F(x0,V)V=kVN\widehat{p}(x_0)=\frac{F(x_0,V)}{V}=\frac{k}{VN}p(x0)=VF(x0,V)=VNk
事实上,这个取极限的过程没有那么简单,还需要满足以下三个极限等式才能用这个式子表示概率密度:
lim⁡N→+∞VN=0lim⁡N→+∞KN=∞lim⁡N→+∞kNN=0\lim_{N \to +\infty} V_N=0 \\ \lim_{N \to +\infty}K_N=\infty \\ \lim_{N \to +\infty}\frac{k_N}{N}=0 N+limVN=0N+limKN=N+limNkN=0
\qquad为了满足上述三个极限等式,可以取VN=hN/NV_N=h_N/\sqrt{N}VN=hN/NKN=kNNK_N=k_N\sqrt{N}KN=kNN,这样衍生出的两种方法分别是Parzen窗法和KNK_NKN近邻法。注意因为VNV_NVNKNK_NKN是相互约束的,因此两种设定只能选其一,否则会得到荒谬的结果。

2.Parzen窗

2.1.算法原理

\qquadParzen窗法是指定VNV_NVN,求取包含在以待估计点x0x_0x0为中心,区域RNR_NRN内的(体积VNV_NVN)内的样本数kNk_NkN,从而得到该点概率密度的方法。区域RNR_NRN的函数就叫做窗函数。窗函数的形式有多种,主要分为4种:①超球窗②超立方体窗③正态分布窗④指数分布窗。在这里我们只介绍最常用的正态分布窗。样本点计为x,待求点中心记为x0x_0x0,令d=x−x0d=x-x_0d=xx0,设球半径为h,距离尺度u=d/hu=d/hu=d/h。其窗函数ϕ(u)\phi(u)ϕ(u)如下:
ϕ(u)=12πe−12u2\phi(u)=\frac{1}{\sqrt{2\pi}}e^{-\frac{1}{2}u^2}ϕ(u)=2π1e21u2
\qquad我们可以认为每个样本对于空间上的每个点的概率密度都有一定的贡献,但是随着空间点距离样本点的距离增大,这个贡献率会减小。一个样本点对其所在位置的概率密度贡献最大,随着距离样本点的距离会依次减小,这个贡献率分布函数就是由窗函数定量给出的。将每个样本点对所有空间点的概率密度贡献累加,就是空间上的概率密度分布函数,这便是Parzen窗的算法原理。
\qquad注意将每个样本的窗函数累加只是代表kkk的值,即距离空间点最近的k个元素,要想求出概率密度,还需要知道R区域的体积(样本数N是已知的)。在Parzen窗法中,体积V是正比于1N\frac{1}{\sqrt{N}}N1的一个函数,它需要跟距离尺度u保持一致,使估计概率密度的极限与窗函数系数h无关。因此V=hNV=\frac{h}{\sqrt{N}}V=Nh,这样对于空间点x0x_0x0
k=∑i=1Nϕ(Xi−x0h)k=\sum_{i=1}^{N}\phi(\frac{X_i-x_0}{h})k=i=1Nϕ(hXix0)
p^(x0)=kVN=∑i=1Nϕ(Xi−x0h)hNN=∑i=1N1h2πNe−12(Xi−x0)2h\widehat{p}(x_0)=\frac{k}{VN}=\frac{\sum_{i=1}^{N}\phi(\frac{X_i-x_0}{h})}{\frac{h}{\sqrt{N}}N}=\sum_{i=1}^{N}\frac{1}{h\sqrt{2\pi N}}e^{-\frac{1}{2}\frac{(X_i-x_0)^2}{h}}p(x0)=VNk=NhNi=1Nϕ(hXix0)=i=1Nh2πN1e21h(Xix0)2
利用上式求出每个空间点的概率密度即可,当然这个空间点选取的密度是认为定的,当样本数目N趋向于∞时,p^(x0)→p(x0)\widehat{p}(x_0)→p(x_0)p(x0)p(x0)。注意体积V为什么是正比于1N\frac{1}{\sqrt{N}}N1而不是其他什么关于N的表达式是根据三个极限表达式推导出来的,理论证明部分不再赘述。

2.2.Matlab实现与参数探究

\qquad我们的思路是使用一个已知分布的样本去测试Parzen窗,观察Parzen窗与其概率密度的相似度。我们选用的样本X服从N(0,1)N(0,1)N(0,1)分布,需要测试的参数有两个,样本数N和窗宽参数h。我们需要分析随着样本数的变化,Parzen窗的概率密度估计效果,我们选取了N=24,28,216N=2^4,2^8,2^{16}N=24,28,216;另一方面,我们还需分析窗宽参数对拟合效果的影响,这里我们选取了h=0.5,1,4h=0.5,1,4h=0.5,1,4,相关的MATLAB代码如下所示:

N=[2^4,2^8,2^16]';
x=-4:0.01:4;
y=1/sqrt(2*pi)*exp(-0.5*x.^2);
h1=[0.5,1,4];
h=h1./sqrt(N);
figure
for Ni=1:length(N) %按照指定样本数序列进行仿真X=normrnd(0,1,1,N(Ni));%生成指定数目特定分布的样本for hi=1:length(h1)  %取指定的h值subplot(length(N),length(h1),(Ni-1)*length(h1)+hi)p=zeros(1,length(x));%一维概率密度矩阵for xi=1:length(x) %概率密度网格遍历%根据parezen窗的叠函数求取概率密度Xi=x(xi)*ones(1,N(Ni));%Xi中心向量p(xi)=1/(sqrt(2*pi)*h(Ni,hi)*N(Ni))*sum(exp(-0.5*((X-Xi)/h(Ni,hi)).^2));endplot(x,p,'k-')   %估计的概率密度hold on plot(x,y,'r--')  %真实的概率密度title(['N=',num2str(N(Ni)),'  h1=',num2str(h1(hi))])end
end

效果图如下所示
在这里插入图片描述
\qquad真实概率密度曲线用红色虚线表示,Parzen窗的估计概率密度用黑色实现表示,可以看出h=4时估计效果最好,随着样本数的增大,估计概率密度曲线逼近于真实概率密度曲线。事实上我们可以认为h标志着每个样本点的影响范围,h小的时候,样本点的影响范围小,但在小范围内的贡献率高;h大的时候样本点的影响范围大,在大范围内的贡献率会变小。当h大时,估计概率密度曲线会较为平滑,当h小时,估计概率密度曲线会较为尖锐。
\qquad但是这个h的选取并不是绝对的,就正态分布的样本而言,h的选择和方差有很大关系。试看下一个例子:其余参数均不变,样本服从N(0,0.3)N(0,0.3)N(0,0.3)的正态分布。

N=[2^4,2^8,2^16]';
x=-4:0.01:4;
y=1/(sqrt(2*pi)*0.3)*exp(-0.5*x.^2/0.09);
h1=[0.5,1,4];
h=h1./sqrt(N);
figure
for Ni=1:length(N) %按照指定样本数序列进行仿真X=normrnd(0,0.3,1,N(Ni));%生成指定数目特定分布的样本for hi=1:length(h1)  %取指定的h值subplot(length(N),length(h1),(Ni-1)*length(h1)+hi)p=zeros(1,length(x));%一维概率密度矩阵for xi=1:length(x) %概率密度网格遍历%根据parezen窗的叠函数求取概率密度Xi=x(xi)*ones(1,N(Ni));%Xi中心向量p(xi)=1/(sqrt(2*pi)*h(Ni,hi)*N(Ni))*sum(exp(-0.5*((X-Xi)/h(Ni,hi)).^2));endplot(x,p,'k-')   %估计的概率密度hold on plot(x,y,'r--')  %真实的概率密度title(['N=',num2str(N(Ni)),'  h1=',num2str(h1(hi))])end
end

效果图如下:
在这里插入图片描述
\qquad我们可以发现这一次,在N=16时,h=0.5的估计效果最好,h=4就显得过于平滑,均值附近不够集中;在N=256时,h=1的估计效果最好,h=0.5次之,h=4仍然是最差的,原因同上;在N=65536时,h=4的估计效果最好,因为样本数增多之后,h=4的估计仍然会收敛,而它的估计是最平滑的,因此毛刺最少,效果最好。由此可见,当方差较小、样本较少时,选取较小的h值具有优势,当方差较大、样本数较多时,选取较大的h值具有优势。

3.K近邻

3.1.算法原理

\qquad和Parzen窗法正好相反,Parzen窗法中体积V是样本数N的函数,而KNK_NKN近邻法中落入区域R的样本数kkk是N的函数。一般情况下,可以预先选定区域R包含的样本数kkk,然后不断增大体积,直到包含kkk个样本数为止。
\qquad我们规定KN=kNK_N=k\sqrt{N}KN=kN,k是邻近系数,k越大代表越多的样本点可以影响到观测点的概率密度,但每个样本点的影响也会降低。如何计算包含k个样本的最小体积呢?我们可以计算出离观测点最近的k个样本,这k个样本中离观测点最远的距离就是体积尺度s,最后所计算的概率密度为:
p^(x0)=KN2Ns=k2Ns\widehat{p}(x_0)=\frac{K_N}{2Ns}=\frac{k}{2\sqrt{N}s}p(x0)=2NsKN=2Nsk
\qquad虽然这个表达式没有累加了,看起来比Parzen窗法复杂,实际上它的计算量毫不亚于Parzen窗法,原因在于每次计算观测点都需要对所有样本距离观测点的距离进行排序,排序需要消耗大量计算资源,若不采取改进措施,付出的时间代价和空间代价将是致命的。

3.2.Matlab实现与参数探究

\qquad同样,我们采用已知的N(0,1)N(0,1)N(0,1)分布样本对KNK_NKN近邻法进行测试,需要测试的参数仍然是样本数N和近邻系数kkk。选择N=24,28,216N=2^4,2^8,2^{16}N=24,28,216,选择k=0.5,1,2k=0.5,1,2k=0.5,1,2,这里需要额外注意的是kN<Nk\sqrt{N}<NkN<N必须恒成立,否则会出现KN>NK_N>NKN>N的谬论,这个式子只需要在N取最小值的时候满足即可。

N=[2^4,2^8,2^16]';
x=-4:0.01:4;
k1=[0.5,1,2];
k=k1.*sqrt(N);
figure
for Ni=1:length(N) %按照指定样本数序列进行仿真X=normrnd(0,1,1,N(Ni));%生成指定数目特定分布的样本for ki=1:length(k1)  %取指定的h值subplot(length(N),length(k1),(Ni-1)*length(k1)+ki)p=zeros(1,length(x));%一维概率密度矩阵for xi=1:length(x) %概率密度网格遍历%根据parezen窗的叠函数求取概率密度Xi=x(xi)*ones(1,N(Ni));%Xi中心向量si=sort(abs(Xi-X));%对距离中心点的距离排序,排在第k个的时的距离为最小距离(体积)p(xi)=k(Ni,ki)/(N(Ni)*2*si(floor(k(Ni,ki))));%可能k不是整数,这里需要取整,因为排序只能是整数个排序endplot(x,p)title(['N=',num2str(N(Ni)),'  k1=',num2str(k1(ki))])end
end

效果图如下:
在这里插入图片描述
\qquad本次代码的运行时间大概是Parzen窗法的5~10倍左右,然而拟合效果远远不如Parzen窗法,即使是样本数最多,k值最合适的情况下,毛刺仍然相当多。其关键原因还是在于曲线不够平滑,说明单个观测点参考的数目还不够多,但是要增大k值,为了满足kN<Nk\sqrt{N}<NkN<N,我们必须同时增大样本数。我们取样本数N=210,212,216N=2^{10},2^{12},2^{16}N=210,212,216,k=5,10,20k=5,10,20k=5,10,20再作观察:

N=[2^10,2^12,2^16]';
x=-4:0.01:4;
y=1/(sqrt(2*pi))*exp(-0.5*x.^2);
k1=[5,10,20];
k=k1.*sqrt(N);
figure
for Ni=1:length(N) %按照指定样本数序列进行仿真X=normrnd(0,1,1,N(Ni));%生成指定数目特定分布的样本for ki=1:length(k1)  %取指定的h值subplot(length(N),length(k1),(Ni-1)*length(k1)+ki)p=zeros(1,length(x));%一维概率密度矩阵for xi=1:length(x) %概率密度网格遍历%根据parezen窗的叠函数求取概率密度Xi=x(xi)*ones(1,N(Ni));%Xi中心向量si=sort(abs(Xi-X));%对距离中心点的距离排序,排在第k个的时的距离为最小距离(体积)p(xi)=k(Ni,ki)/(N(Ni)*2*si(floor(k(Ni,ki))));%可能k不是整数,这里需要取整,因为排序只能是整数个排序endplot(x,p,'k-') %估计概率密度hold onplot(x,y,'r--') %真实概率密度title(['N=',num2str(N(Ni)),'  k1=',num2str(k1(ki))])end
end

在这里插入图片描述
可以发现,现在的拟合效果比刚刚要好很多,可以和Parzen窗法的拟合相媲美了,但是算法运算速度上仍然要慢,原因还是在于排序法拖慢了运算速度,其算法复杂度和样本数是成平方关系的。
我们再来让K近邻法估计一组服从N(0,0.09)N(0,0.09)N(0,0.09)的样本作比较,其效果图如下:
在这里插入图片描述
\qquad通过上图我们也可看出k值选取和样本数和方差也是有关系的,有意思的是,在方差为1时,N=210N=2^{10}N=210N=212N=2^{12}N=212的情况下都是k=10比较好,N=216N=2^{16}N=216时k=20比较好。然而当方差为0.09时,随着N的增大,k=5几乎总是最好的。然而k=10和k=20随着样本数的增大,逼近程度也在增加,考虑到k值越大曲线越平滑,因此选择k值也是需要在方差和样本数之间做权衡的。
\qquad最后感谢您的阅读,希望本文对您有帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Lambda 表达式实现超强的排序功能

我们在系统开发过程中&#xff0c;对数据排序是很常见的场景。一般来说&#xff0c;我们可以采用两种方式&#xff1a;借助存储系统&#xff08;SQL、NoSQL、NewSQL 都支持&#xff09;的排序功能&#xff0c;查询的结果即是排好序的结果查询结果为无序数据&#xff0c;在内存中…

【mongodb系统学习之四】查看mongodb进程

四、查看mongodb进程&#xff08;可以配合启动和关闭使用&#xff09;&#xff1a; 1&#xff09;、方法一&#xff1a;直接查看mongodb进程是否已经存在&#xff08;用上面的方式启动后&#xff0c;需要另开一个窗口操作&#xff09;&#xff1a;ps –ef|grep mongodb, 如图&a…

【Simulink】粒子群算法(PSO)整定PID参数(附代码和讲解)

目录0.背景1.粒子群算法1.1.算法简介1.2.算法步骤1.3.算法举例2.PID自整定2.1.基于M文件编写的PID参数自整定*2.2.复杂系统的PID自整定&#xff08;基于simulink仿真&#xff09;2.2.1.PSO优化PID的过程详解2.2.2.在PSO优化过程中修改参数价值权重阅读前必看&#xff1a;本代码…

SpringBoot 使用注解实现消息广播功能

背景在开发工作中&#xff0c;会遇到一种场景&#xff0c;做完某一件事情以后&#xff0c;需要广播一些消息或者通知&#xff0c;告诉其他的模块进行一些事件处理&#xff0c;一般来说&#xff0c;可以一个一个发送请求去通知&#xff0c;但是有一种更好的方式&#xff0c;那就…

【Matlab】模式识别——聚类算法集锦

文章目录0.聚类分析简介0.1.简单的聚类样本生成器1.静态聚类算法1.1.最近邻聚类算法1.1.1.算法原理1.1.2.参考代码1.1.3.参数选择及运行结果1.2.最大最小距离法1.2.1.算法原理1.2.2.参考代码1.2.3.参数选择及运行结果2.动态聚类算法2.1.C均值聚类算法2.1.1.算法原理2.1.2.参考代…

【MATLAB】混合粒子群算法原理、代码及详解

目录1.算法1.1.原理1.2.性能比较1.3.步骤2.代码2.1.源码及注释2.2.执行与效果1.算法 1.1.原理 \qquad建议没接触过粒子群算法的朋友先看较为基础的全局粒子群算法原理及介绍&#xff0c;以下博文链接有详细的讲解、代码及其应用举例&#xff1a; 【Simulink】粒子群算法&#…

MVC HtmlHelper用法大全

HtmlHelper用来在视图中呈现 HTML 控件。 以下列表显示了当前可用的一些 HTML 帮助器。 本主题演示所列出的带有星号 (*) 的帮助器。 ActionLink - 链接到操作方法。 BeginForm * - 标记窗体的开头并链接到呈现该窗体的操作方法。 CheckBox * - 呈现复选框。 DropDownList *…

基于 MyBatis 手撸一个分表插件

背景事情是酱紫的&#xff0c;上级leader负责记录信息的业务&#xff0c;每日预估数据量是15万左右&#xff0c;所以引入sharding-jdbc做分表。上级leader完成业务的开发后&#xff0c;走了一波自测&#xff0c;git push后&#xff0c;就忙其他的事情去了。项目的框架是SpringB…

密码学哈希函数_哈希函数在密码学中的应用

密码学哈希函数A Hash Function is a mathematical function that converts a numerical value into another compressed numeric value. The input value for the hash functions can be of arbitrary length, but the output text that it will produce will always be of fi…

C语言图形化界面——含图形、按钮、鼠标、进度条等部件制作(带详细代码、讲解及注释)

目录0.引言1.素材准备2.编程2.1.创建你的界面2.2.创建按钮2.3.鼠标操作2.3.1.单击特效2.3.2.光标感应2.3.3.进度条3.完整代码及效果0.引言 \qquad看了CSDN上很多关于C程序图形化界面的介绍&#xff0c;有的代码繁琐难解&#xff0c;不方便调试修改&#xff1b;有的不够详细。本…

【MATLAB】无人驾驶车辆的模型预测控制技术(精简讲解和代码)【运动学轨迹规划】

文章目录<font color#19C>0.友情链接<font color#19C>1.引言<font color#19C>2.预测模型<font color#19C>3.滚动优化<font color#08CF>3.1.线性化3.2.UrU_rUr​的求取<font color#08CF>3.3.离散化与序列化<font color#08CF>3.4.实现…

顶级Javaer,常用的 14 个类库

作者&#xff1a;小姐姐味道&#xff08;微信公众号ID&#xff1a;xjjdog&#xff09;昨天下载下来Java16尝尝鲜。一看&#xff0c;好家伙&#xff0c;足足有176MB大。即使把jmc和jvisualvm给搞了出去&#xff0c;依然还是这么大&#xff0c;真的是让人震惊不已。但即使JDK足够…

单层神经网络线性回归_单层神经网络| 使用Python的线性代数

单层神经网络线性回归A neural network is a powerful tool often utilized in Machine Learning because neural networks are fundamentally very mathematical. We will use our basics of Linear Algebra and NumPy to understand the foundation of Machine Learning usin…

面试官:说一下 final 和 final 的 4 种用法?

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;重要说明&#xff1a;本篇为博主《面试题精选-基础篇》系列中的一篇&#xff0c;查看系列面试文章请关注我。Gitee 开源地址…

面试官:int和Integer有什么区别?为什么要有包装类?

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;重要说明&#xff1a;本篇为博主《面试题精选-基础篇》系列中的一篇&#xff0c;查看系列面试文章请关注我。Gitee 开…

innodb是如何存数据的?yyds

前言如果你使用过mysql数据库&#xff0c;对它的存储引擎&#xff1a;innodb&#xff0c;一定不会感到陌生。众所周知&#xff0c;在mysql5以前&#xff0c;默认的存储引擎是&#xff1a;myslam。但mysql5之后&#xff0c;默认的存储引擎已经变成了&#xff1a;innodb&#xff…

【MATLAB】卡尔曼滤波器的原理及仿真(初学者专用)

文章目录0.引言1.场景预设2.卡尔曼滤波器3.仿真及效果0.引言 \qquad本文参考了Matlab对卡尔曼滤波器的官方教程及帮助文档&#xff08;Kalman Filter&#xff09;。官方教程的B站链接如下&#xff0c;在此对分享资源的Up主表示感谢。(如不能正常播放或需要看中文字幕&#xff0…

Go实现查找目录下(包括子目录)替换文件内容

为什么80%的码农都做不了架构师&#xff1f;>>> 【功能】 按指定的目录查找出文件&#xff0c;如果有子目录&#xff0c;子目录也将进行搜索&#xff0c;将其中的文件内容进行替换。 【缺陷】 1. 没有过滤出文本文件 2. 当文件过大时&#xff0c;效率不高 【代码】…

卡诺模板_无关条件的卡诺地图

卡诺模板Till now, the Boolean expressions which have been discussed by us were completely specified, i.e., for each combination of input variable we have specified a minterm by representing them as 1 in the K-Map. But, there may arise a case when for a giv…

面试官:final、finally、finalize 有什么区别?

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;重要说明&#xff1a;本篇为博主《面试题精选-基础篇》系列中的一篇&#xff0c;查看系列面试文章请关注我。Gitee 开…