在概率密度估计过程中,如果我们队随机变量的分布是已知的,那么可以直接使用参数估计的方法进行估计,如最大似然估计方法。

然而在实际情况中,随机变量的参数是未知的,因此需要进行非参数估计.核密度估计是非参数估计的一种方法,也就是大家经常听见的parzen 窗方法了.

本文主要介绍 非参数估计的过程以及 parzen窗方法估计概率密度的过程.

非参数估计

过程

如图1所示,对于一个未知的概率密度函数p(x)p(x)p(x),某一个随机变量xxx落在区域RRR里的概率可以表示成如下形式:

P=∫RP(x′)dx′(1)P = \int_{R} P(x^{'}) dx^{'} \tag{1}P=∫R​P(x′)dx′(1)

如果RRR足够窄,我们可以用PPP来表示p(x)p(x)p(x)的一个平均后的结果。假设我们现在有nnn个样本,
且他们服从独立同分布,那么nnn个样本中的kkk个落在区域RRR中的概率可以表示成下面的公式:

Pk=CnkPk(1−P)n−k(2)P_k = C_n^k P^k (1-P)^{n-k}  \tag{2}Pk​=Cnk​Pk(1−P)n−k  (2)

由上面的公式我们可以得到kkk的期望为:

E(k)=n⋅P(3)E(k) = n \cdot P \tag{3}E(k)=n⋅P (3)

同时,当nnn足够大时,我们可以近似地认为kn\frac{k}{n}nk​可以作为PPP的一个近似值。

然后,假设nnn足够大,RRR足够小,并且假设p(x)p(x)p(x)是连续的,那么我们可以得到:

∫RP(x′)dx′≈p(x)⋅V(4)\int_{R} P(x^{'}) dx^{'} \approx p(x) \cdot V  \tag{4}∫R​P(x′)dx′≈p(x)⋅V (4)

其中xxx是区域RRR中的一个点,VVV是RRR的面积(体积),结合上述4个式子,得:

p(x)V=∫Rp(x′)dx′=P=E(k)n(5)p(x)V = \int_{R} p(x^{'}) dx^{'} = P = \frac{E(k)}{n} \tag{5}p(x)V=∫R​p(x′)dx′=P=nE(k)​(5)
∴p(x)=E(k)n⋅V≈kn⋅V(6)\therefore p(x) = \frac{E(k)}{n \cdot V} \approx \frac{k}{n \cdot V} \tag{6}∴p(x)=n⋅VE(k)​≈n⋅Vk​ (6)

因此,某一小区域内的概率密度函数就可以用上述公式表示了。

问题

我们再看一下公式(6):

p(x)≈k/nV≈PV=∫Rp(x′)dx′∫Rdx′(7)p(x) \approx \frac{k/n}{V} \approx \frac{P}{V} = \frac{\int_{R} p(x^{'})d{x^{'}}}{\int_{R}dx{'}}  \tag{7}p(x)≈Vk/n​≈VP​=∫R​dx′∫R​p(x′)dx′​  (7)

显然我们估计的这个概率密度是一个平滑的结果,即当VVV选择的越大,估计的结果和真实结果相比就越平滑;因此看起来我们需要把VVV设置的小一点,然而如果我们把VVV选择的过小,也会出现问题:太小的VVV会导致这块小区域里面没有一个点落在里面,因此就会得到该点的概率密度为0;另外,假设刚好有一个点落在了这个小区域里,那由于V过于小,我们计算得到的概率密度可能也会趋近于无穷,两个结果对于我们来说都是没有太大意义的.

实际的角度来看,我们获取的数据量一定是有限的,因此体积VVV不可能取到无穷小,我们可以总结下,使用非参数概率密度估计有以下两方面限制,且是不可避免的:

  1. 在有限数据下,使用非参数估计方法计算的概率密度一定是真实概率密度平滑后的结果.
  2. 在有限数据下,体积趋于无穷小计算的概率密度没有意义.

理论的角度来看,我们希望知道如果有无限多的采样数据,那么上述两个限制条件应该怎样克服?假设我们使用下面的方法来估计点 xxx 处的概率密度: 构造一系列包含 xxx 的区域 R1,R2,...RnR_1, R_2, ... R_nR1​,R2​,...Rn​, 其中 R1R_1R1​ 中包含一个样本,RnR_nRn​中包含 nnn 个样本.则:

pn(x)=kn/nVn(8)p_n(x) = \frac{k_n / n}{V_n} \tag{8}pn​(x)=Vn​kn​/n​(8)

其中pn(x)p_n(x)pn​(x)表示第nnn次估计结果,如果要求pn(x)p_n(x)pn​(x)能够收敛到p(x)p(x)p(x),则需要满足下面三个条件:

  • lim⁡n→∞Vn=0\lim_{n \rightarrow \infty} V_n = 0limn→∞​Vn​=0

  • lim⁡n→∞kn=∞\lim_{n \rightarrow \infty} k_n = \inftylimn→∞​kn​=∞

  • lim⁡n→∞kn/n=0\lim_{n \rightarrow \infty} k_n / n = 0limn→∞​kn​/n=0

parzen窗法

原理

假设RnR_nRn​是一个ddd维的超立方体(hypercube),且其边长为hhh, 那么我们可以用如下公式表示VnV_nVn​:

Vn=hnd(9)V_n = h_n^d \tag{9}Vn​=hnd​(9)

然后我们再定义一个窗函数(window function):

φ(u)={1∣uj∣≤1/20otherwise(10)\varphi (u) = \begin{cases} 1 \quad |u_j| \leq 1/2 \\ 0 \quad otherwise \end{cases} \quad \tag{10}φ(u)={1∣uj​∣≤1/20otherwise​(10)

φ\varphiφ 定义了一个以圆点为中心的单位超立方体,这样我们就可以用φ\varphiφ来表示体积VVV内的样本个数:

kn=∑i=1nφ(x−xihn)(11)k_n = \sum_{i=1}^{n} \varphi(\frac{x - x_i}{h_n}) \tag{11}kn​=i=1∑n​φ(hn​x−xi​​)(11)

好了,有了knk_nkn​和VnV_nVn​,直接把他们带入公式(6),我们可以得到parzen窗法的计算公式:
pn(x)=1n∑i=1n1Vnφ(x−xihn)(12)p_n(x) = \frac{1}{n} \sum_{i=1}^{n} \frac{1}{V_n} \varphi(\frac{x - x_i}{h_n}) \tag{12}pn​(x)=n1​i=1∑n​Vn​1​φ(hn​x−xi​​)(12)

我们发现这个φ\varphiφ不仅可以是上述的单位超立方体的形式,只要其满足如下两个约束就可以,因此也就出现了各种各样更能表现样本属性的窗函数,比如用的非常多的高斯窗.

  1. φ(x)≥0\varphi(x) \geq 0φ(x)≥0
  2. ∫φ(u)du=1\int \varphi(u)du = 1∫φ(u)du=1

解释

网上经常会见到这样的解释: 某一点的概率密度是其他样本点在这一点的概率密度分布的平均值.还有这样一张图:

上面一句话可以这样解释:
我们定义核函数:
δ(x)=1Vnφ(xhn)(13)\delta(x) = \frac{1}{V_n} \varphi(\frac{x}{h_n}) \tag{13}δ(x)=Vn​1​φ(hn​x​)(13)

那么某一点xxx的概率密度可以用如下函数来表示:
pn(x)=1n∑i=1nδn(x−xi)(14)p_n(x) = \frac{1}{n} \sum_{i=1}^{n} \delta_{n}(x - x_i) \tag{14}pn​(x)=n1​i=1∑n​δn​(x−xi​)(14)

从公式(13)(14)我们可以看出,当hnh_nhn​很大的时候,δn(x)\delta_n(x)δn​(x)就是一个 矮胖的函数,由公式(14)将每个样本点在点xxx处的贡献取平均之后,点xxx处的概率密度就是一个非常平滑的结果; 当hnh_nhn​太小的时候,δn(x)\delta_n(x)δn​(x)就是一个 高瘦的函数,由公式(14)将每个样本点在点xxx处的贡献取平均之后,点xxx处的概率密度就是一个受噪声影响非常大的值,因此估计的概率密度平滑性就很差,反而和真实值差的很远.这两点和1.2节总结的两点缺陷正好吻合.

仿真实验

如下我做了两个仿真

  1. 第一个是生成了均值是0,方差是2的服从高斯分布的数据,分别使用bandwidth为0.1, 1, 5三个值进行估计
  2. 第二个是生成了100个服从高斯混合分布的数据,分别是均值为0,方差为1以及均值为5,方差为1的两个高斯混合模型,两者相互独立。

这里核函数选的是高斯核。

可以很明显得看到估计的概率密度是如何受到bandwidth影响的,当bandwidth选择的太小,则估计的密度函数受到噪声影响很大,这种结果是不能用的;当bandwidth选择过大,则估计的概率密度又太过于平滑。总之,无论bandwidth过大还是过小,其结果都和实际情况相差的很远,因此合理地选择bandwidth是很重要的。

下面是高斯混合分布密度估计的代码。

import matplotlib.pyplot as plt
import numpy as np
from sklearn.neighbors.kde import KernelDensity
from scipy.stats import normif __name__ == "__main__":np.random.seed(1)x = np.concatenate((np.random.normal(0, 1, int(0.3*100)), np.random.normal(5, 1, int(0.7*100))))[:, np.newaxis]plot_x = np.linspace(-5, 10, 1000)[:, np.newaxis]true_dens = 0.3*norm(0, 1).pdf(plot_x) + 0.7*norm(5, 1).pdf(plot_x)log_dens = KernelDensity(bandwidth=1).fit(x).score_samples(plot_x)plt.figure(),plt.fill(plot_x, true_dens, fc='#AAAAFF', label='true_density')plt.plot(plot_x, np.exp(log_dens), 'r', label='estimated_density')for _ in range(x.shape[0]):plt.plot(x[:, 0], np.zeros(x.shape[0])-0.01, 'g*') plt.legend()plt.show()

参考资料

[1.] sklearn:Simple 1D Kernel Density Estimation

[2.] Richard O. Duda, Peter E. Hart, and David G. Stork. 2000. Pattern Classification (2nd Edition). Wiley-Interscience, New York, NY, USA.

[3. ]Kernel density estimation

[4.] 边肇祺, 张学工, 2000. 模式识别. 清华大学出版社.

机器学习基础:核密度估计(Machine Learning Fundamentals: Kernel Density Estimation)相关推荐

  1. 机器学习算法(二十一):核密度估计 Kernel Density Estimation(KDE)

    目录 1 分布密度函数 1.1 参数估计方法 1.2 非参数估计 2 直方图到核密度估计 2.1 核函数 2.2 带宽的选择 2.2.1 自适应或可变带宽的核密度估计 2.3 多维 1 分布密度函数 ...

  2. 核密度估计python_核密度估计Kernel Density Estimation(KDE)

    在介绍核密度评估Kernel Density Estimation(KDE)之前,先介绍下密度估计的问题.由给定样本集合求解随机变量的分布密度函数问题是概率统计学的基本问题之一.解决这一问题的方法包括 ...

  3. Where Can Machine Learning Help Robotic State Estimation 机器学习在机器人状态估计的应用

    Where Can Machine Learning Help Robotic State Estimation Tim Barfoot 关于机器学习在机器人状态估计中应用的报告演讲.演讲时间2021 ...

  4. 【机器学习笔记】可解释机器学习-学习笔记 Interpretable Machine Learning (Deep Learning)

    [机器学习笔记]可解释机器学习-学习笔记 Interpretable Machine Learning (Deep Learning) 目录 [机器学习笔记]可解释机器学习-学习笔记 Interpre ...

  5. 基于密度的聚类(Density-based clustering)-- 核密度估计(kernel density estimation)

    In density-based clustering, clusters are defined as areas of higher density than the remainder of t ...

  6. 核密度估计Kernel Density Estimation(KDE)-代码详细解释

    在介绍核密度评估Kernel Density Estimation(KDE)之前,先介绍下密度估计的问题.由给定样本集合求解随机变量的分布密度函数问题是概率统计学的基本问题之一.解决这一问题的方法包括 ...

  7. 谷歌机器学习规则 (Rules of Machine Learning)

    机器学习规则 (Rules of Machine Learning) 往期文章: 机器学习之特征工程 机器学习之分类(Classification) 精确率.准确率.召回率 ------------- ...

  8. 吴恩达深度学习笔记——结构化机器学习项目(Structuring Machine Learning Projects)

    深度学习笔记导航 前言 传送门 结构化机器学习项目(Machine Learning Strategy) 机器学习策略概述 正交化(orthogonalization) 评价指标 数字评估指标的单一性 ...

  9. ML之Medicine:利用机器学习研发药物—《Machine Learning for Pharmaceutical Discovery and Synthesis Consortium》

    ML之Medicine:利用机器学习研发药物-<Machine Learning for Pharmaceutical Discovery and Synthesis Consortium> ...

  10. 核密度估计(Kernel Density Estimation)和累积分布函数 (Cumulative Distribution Function)

    原文链接,欢迎评论 https://dreamhomes.top/posts/202010091143.html 核密度估计 核密度估计是采用平滑的峰值函数("核")来拟合观察到的 ...

最新文章

  1. Android学习 —— 数据的存储与访问方式一: 文件存取
  2. 妙用终截者密码锁防***注入Explorer
  3. android系统应用开发_利用ADB工具免root停用Android系统应用
  4. 谈谈Koa 中的next
  5. 实战篇一 python常用模块和库介绍
  6. How does a relational database work
  7. linux主机解析虚拟机超时_Linux 内核超时导致虚拟机无法正常启动
  8. codeforces 935E Fafa and Ancient Mathematics 语法树、动态规划
  9. C++中include 与 include 的区别
  10. Oracle distinct后加as,【大话IT】为何加distinct之后就不走索引了
  11. as3代码奇怪的bug
  12. linux防火墙状态centos6一下,CentOS6.5查看防火墙的状态
  13. 猪八戒网冲刺港交所:朱明跃已奋斗16年 年营收7.68亿
  14. 分治法解决赛程安排问题
  15. 【sklearn】K-Means聚类与PCA降维实践 - 用户信用分群和分析
  16. Docker容器无法解析域名
  17. win7 防火墙开启ping
  18. Spark学习-DAY4
  19. TEC相关指标和参数20221221
  20. “数字化”主导大型商超生死局|钛媒体深度

热门文章

  1. 在Spring Boot中使用Spring Security实现权限控制
  2. 总结篇——mysql中使用sql语句操作表字段
  3. SPF邮件伪造漏洞测试脚本
  4. Rabbitmq+Nginx+keepalived高可用热备
  5. 【work】输出日期为那一年的第几天
  6. 80后智能科技公司诚聘业务人员
  7. C# 基于MySQL的数据层基类(MySQLHelper)
  8. .NET中的数据结构——表
  9. flashmx action画线方法(下)
  10. python 多个装饰器的调用顺序