核密度估计Kernel Density Estimation(KDE)

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

参数估计又可分为参数回归分析和参数判别分析。在参数回归分析中,人们假定数据分布符合某种特定的性态,如线性、可化线性或指数性态等,然后在目标函数族中寻找特定的解,即确定回归模型中的未知参数。在参数判别分析中,人们需要假定作为判别依据的、随机取值的数据样本在各个可能的类别中都服从特定的分布。经验和理论说明,参数模型的这种基本假定与实际的物理模型之间常常存在较大的差距,这些方法并非总能取得令人满意的结果。

由于上述缺陷,Rosenblatt和Parzen提出了非参数估计方法,即核密度估计方法。由于核密度估计方法不利用有关数据分布的先验知识,对数据分布不附加任何假定,是一种从数据样本本身出发研究数据分布特征的方法,因而,在统计学理论和应用领域均受到高度的重视。

因此,一句话概括,核密度估计Kernel Density Estimation(KDE)是在概率论中用来估计未知的密度函数,属于非参数检验方法之一。

在密度函数估计中有一种方法是被广泛应用的——直方图。如下图中的第一和第二幅图(名为Histogram和Histogram, bins shifted)。直方图的特点是简单易懂,但缺点在于以下三个方面:

  1. 密度函数是不平滑的;
  2. 密度函数受子区间(即每个直方体)宽度影响很大,同样的原始数据如果取不同的子区间范围,那么展示的结果可能是完全不同的。如下图中的前两个图,第二个图只是在第一个图的基础上,划分区间增加了0.75,但展现出的密度函数却看起来差异很大;
  3. 直方图最多只能展示2维数据,如果维度更多则无法有效展示。


核密度估计有多种内核,图3(Tophat Kernl Density)为不平滑内核,图4(Gaussian Kernel Density,bandwidth=0.75)为平滑内核。在很多情况下,平滑内核(如高斯核密度估计,Gaussian Kernel Density)使用场景较多。

虽然采用不同的核函数都可以获得一致性的结论(整体趋势和密度分布规律性基本一致),但核密度函数也不是完美的。除了核算法的选择外,带宽(bandwidth)也会影响密度估计,过大或过小的带宽值都会影响估计结果。如上图中的最后三个图,名为Gaussian Kernel Density,bandwidth=0.75、Gaussian Kernel Density,bandwidth=0.25、Gaussian Kernel Density,bandwidth=0.55.

上图为使用Python的sklearn实现,算法为KernelDensity。代码如下:

  1. #coding:utf-8
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. from sklearn.neighbors import KernelDensity
  5. np.random.seed(1)
  6. N = 20
  7. X = np.concatenate((np.random.normal(0, 1, 0.3 * N),
  8. np.random.normal(5, 1, 0.7 * N)))[:, np.newaxis]
  9. X_plot = np.linspace(-5, 10, 1000)[:, np.newaxis]
  10. bins = np.linspace(-5, 10, 10)
  11. fig, ax = plt.subplots(2, 2, sharex=True, sharey=True)
  12. fig.subplots_adjust(hspace=0.05, wspace=0.05)
  13. # 直方图 1 'Histogram'
  14. ax[0, 0].hist(X[:, 0], bins=bins, fc='#AAAAFF', normed=True)
  15. ax[0, 0].text(-3.5, 0.31, 'Histogram')
  16. # 直方图 2 'Histogram, bins shifted'
  17. ax[0, 1].hist(X[:, 0], bins=bins + 0.75, fc='#AAAAFF', normed=True)
  18. ax[0, 1].text(-3.5, 0.31, 'Histogram, bins shifted')
  19. # 核密度估计 1 'tophat KDE'
  20. kde = KernelDensity(kernel='tophat', bandwidth=0.75).fit(X)
  21. log_dens = kde.score_samples(X_plot)
  22. ax[1, 0].fill(X_plot[:, 0], np.exp(log_dens), fc='#AAAAFF')
  23. ax[1, 0].text(-3.5, 0.31, 'Tophat Kernel Density')
  24. # 核密度估计 2 'Gaussian KDE'
  25. kde = KernelDensity(kernel='gaussian', bandwidth=0.75).fit(X)
  26. log_dens = kde.score_samples(X_plot)
  27. ax[1, 1].fill(X_plot[:, 0], np.exp(log_dens), fc='#AAAAFF')
  28. ax[1, 1].text(-3.5, 0.31, 'Gaussian Kernel Density')
  29. for axi in ax.ravel():
  30.     axi.plot(X[:, 0], np.zeros(X.shape[0]) – 0.01, '+k')
  31.     axi.set_xlim(-4, 9)
  32.     axi.set_ylim(-0.02, 0.34)
  33. for axi in ax[:, 0]:
  34.     axi.set_ylabel('Normalized Density')
  35. for axi in ax[1, :]:
  36.     axi.set_xlabel('x')
  37. plt.show()


 

KernelDensity算法包括kd_tree和ball_tree,默认自动选择。核模型包括gaussian、tophat、epanechnikov、exponential、linear、cosine,默认是gaussian模型。可调整的参数如下:

  1. class sklearn.neighbors.KernelDensity(bandwidth=1.0, algorithm='auto', kernel='gaussian', metric='euclidean', atol=0, rtol=0, breadth_first=True, leaf_size=40, metric_params=None)


 

核密度估计的应用场景:

  • 股票、金融等风险预测;

 

尾巴

密度估计中应用较多的算法是高斯混合模型以及基于近邻的核密度估计。高斯混合核密度估计模型更多会在聚类场景中应用。


====================【好书推荐,我为自己代言】====================

《Python数据分析与数据化运营》第二版上市啦!

50+数据流工作知识点
14个数据分析与挖掘主题
8个综合性运营分析案例
涵盖会员、商品、流量、内容4大主题
360°把脉运营问题并贴合数据场景落地


本书主要基于Python实现,其中主要用到的计算库是numpy、pandas和sklearn,其他相关库还包括:
  • 标准库:re、time、datetime、json、 base64、os、sys、cPickle、tarfile
  • Python调用R的rpy2
  • 统计分析:Statsmodels
  • 中文处理:结巴分词
  • 文本挖掘:Gensim
  • 数据挖掘和算法:XGboost、gplearn、TPOT
  • 爬虫和解析:requests、Beautiful Soup、xml
  • 图像处理:OpenCV和PIL/Pollow
  • 数据读取:xlrd、pymongo、pymysql
  • 数据预处理:imblearn
  • 展示美化类:Matplotlib、pyecharts、graphviz、prettytable、wordcloud、mpl_toolkits、pydotplus
如果你对以下内容感兴趣,那么本书将值得一看:
  • KMeans聚类的自动K均值的确立方法
  • 基于软方法的多分类模型组合评估模型的应用
  • 基于自动下探(下钻、细分)的应用
  • 基于增量学习的多项式贝叶斯分类
  • pipeline管道技术的应用
  • 基于超参数的自动参数值的优化方法
  • 特征自动选择
  • 文本分类、文本主题挖掘
  • 基于自动时间序列ARIMA的P、D、Q的调整
  • python决策树规则输出
  • 基于自定义图像的文本标签云
  • 非结构化数据,例如图像、音频、文本等处理
  • 对象持久化处理
  • 如何使用Python调用R实现数据挖掘
  • 自动化学习:增加了对于自动化数据挖掘与机器学习的理论、流程、知识和应用库介绍,并基于TPOT做自动化回归和分类学习案例演示
有关这本书的写作感受、详细内容介绍、附件(含数据和代)下载、关键知识和方法以及完整书稿目录,请访问《Python数据分析与数据化运营》第二版出版了!要购买此书,可以去京东当当天猫等查看。

《核密度估计Kernel Density Estimation(KDE)》有1个想法

  1. 非常感谢这篇文章,最近在学习统计方面的只是,有幸看到这篇文章。
    另外对于KNN算法有具体实现的函数吗,对于python不是特别的熟悉,谢谢指教。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>