核密度估计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。代码如下:

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KernelDensity
np.random.seed(1)
N = 20
X = np.concatenate((np.random.normal(0, 1, int(0.3 * N)),np.random.normal(5, 1, int(0.7*N)) ))[:, np.newaxis]
#np.newaxis是None的意思
#前半部分的平均值是0,方差是1
#int(0.3 * N)指的是输出多少数量符合要求的数据
#---------------------------以上是创建数据集-----------------------------------------------------------------
 
 
X_plot = np.linspace(-5, 10, 1000)[:, np.newaxis]#创建等差数列,在-5和10之间取1000个数
bins = np.linspace(-5, 10, 10)#这个的作用是,在相邻两个边界时间的数据对应的y值都一样大
print("bins=",bins)
fig, ax = plt.subplots(2, 2, sharex=True, sharey=True)
fig.subplots_adjust(hspace=0.05, wspace=0.05)
# 直方图 1 'Histogram'
print("---------------------------------")
ax[0, 0].hist(X[:, 0], bins=bins, fc='#AAAAFF', normed=True)#fc指的应该是颜色的编码
#这里的ax[0,0]的意思是画在第几副图上
 
 
ax[0, 0].text(-3.5, 0.31, 'Histogram')#-3.5, 0.31的意思是每张图的logo要画在什么地方
# 直方图 2 'Histogram, bins shifted'
ax[0, 1].hist(X[:, 0], bins=bins + 0.75, fc='#AAAAFF', normed=True)#histogram的缩写
ax[0, 1].text(-3.5, 0.31, 'Histogram, bins shifted')#每个子图内画标签
 
 
#-----------------------------------------------------------------------------------
 
 
# 核密度估计 1 'tophat KDE'
kde = KernelDensity(kernel='tophat', bandwidth=0.75).fit(X)#什么是带宽
log_dens = kde.score_samples(X_plot)
#所以这里有两组数据,X和X_plot,其实是在利用X_plot对X进行采样。
#所以想要复用这段代码的时候,改X即可,X_plot不用修改
 
 
ax[1, 0].fill(X_plot[:, 0], np.exp(log_dens), fc='#AAAAFF')#fill就是用来画概率密度的
ax[1, 0].text(-3.5, 0.31, 'Tophat Kernel Density')#设置标题的位置
# 核密度估计 2 'Gaussian KDE'
kde = KernelDensity(kernel='gaussian', bandwidth=0.75).fit(X)
log_dens = kde.score_samples(X_plot)#返回的是点x对应概率的log值,要使用exp求指数还原。
ax[1, 1].fill(X_plot[:, 0], np.exp(log_dens), fc='#AAAAFF')#fill就是用来画概率密度的
#所以上面一句代码就非常清晰了,X_plot[:, 0]是具体数据,np.exp(log_dens)指的是该数据对应的概率
ax[1, 1].text(-3.5, 0.31, 'Gaussian Kernel Density')#设置标题的位置
 
print("ax.ravel()=",ax.ravel())
print("X.shape[0]=",X.shape[0])
print("X=",X)
 
 
#这个是为了在每个子图的下面画一些没用的标记,不看也罢
for axi in ax.ravel():
    axi.plot(X[:, 0], np.zeros(X.shape[0])-0.01, '+k')
    axi.set_xlim(-4, 9)#设定上下限
    axi.set_ylim(-0.02, 0.34)
 
 
 
 
##画图过程是两行两列,这里是遍历第1列,每个位置的左侧画一个“xNormalized Density”
for axi in ax[:, 0]:
    print("axi=",axi)
    axi.set_ylabel('Normalized Density')
 
 
 
 
##画图过程是两行两列,这里是遍历第2行,每个位置画一个“x”
for axi in ax[1, :]:
    axi.set_xlabel('x')
plt.show()
 
 
 
 
#ravel函数的作用如下:
# >>> x = np.array([[1, 2, 3], [4, 5, 6]])
# >>> print(np.ravel(x))
# [1 2 3 4 5 6]

 

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)


 

核密度估计的应用场景:

  • 股票、金融等风险预测;
  • 31
    点赞
  • 199
    收藏
    觉得还不错? 一键收藏
  • 43
    评论
### 回答1: 高斯核密度估计Kernel Density EstimationKDE)是一种用于估计概率密度函数的非参数方法。它通过将每个数据点周围的高斯核函数叠加起来来估计数据集的概率密度。 KDE的值是指在给定某一数据点处的概率密度估计值。计算KDE的值通常需要确定核函数的带宽(bandwidth)参数,它决定了核函数的宽度,即对数据点周围的影响范围。 在给定一组数据点和带宽参数后,KDE的值可以通过以下的计算过程获得: 1. 对于每个数据点,计算与该数据点距离在带宽范围内的所有其他数据点的核函数值。 2. 将所有核函数值求和并除以数据点数量,得到该数据点处的概率密度估计值。 基于高斯核函数的KDE通常具有较好的光滑性和连续性,适用于连续型数据的概率密度估计。通过调整带宽参数,可以控制估计值的平滑程度和准确性。 KDE的值可以用于多个应用场景,如异常检测、模式识别、分类等。在异常检测中,较低的KDE值可能表明该数据点具有较低的概率出现,从而可能被视为异常值。在模式识别中,可以利用KDE的值来区分不同的数据模式。在分类问题中,可以利用KDE的值来评估新数据点属于各个类别的概率,从而进行分类决策。 总之,高斯核密度估计KDE)提供了一种非参数方法来估计概率密度函数,通过将每个数据点周围的高斯核函数叠加起来来获得数据集的概率密度估计值。KDE的值可以用于多种应用场景,具有广泛的实际意义。 ### 回答2: 高斯核密度估计KDE)是一种用于估计随机变量分布的非参数方法。它的基本思想是将每个观测样本点视为一个高斯函数的中心,并根据每个样本点周围的邻域来估计密度函数的值。 KDE的计算过程如下: 1. 首先选择一个核函数,通常选择高斯函数作为核函数。 2. 对每个观测样本点,以该点为中心构建一个高斯函数。 3. 对每个高斯函数,计算该函数在各个自变量上的值。 4. 将所有高斯函数的值加权求和,得到估计密度函数的值。 在计算KDE的过程中,需要考虑两个重要的参数:核函数的带宽和观测样本点的数量。核函数的带宽决定了高斯函数对密度函数的贡献程度,较小的带宽会导致估计过于敏感,较大的带宽会导致估计过于平滑。观测样本点的数量影响到对密度函数的完整覆盖程度,较少的样本点可能会导致估计不准确。 KDE在实际应用中具有广泛的应用,例如在统计分析、数据挖掘和机器学习中。它可以用于分析数据的分布特征、寻找异常点、生成合成数据以及进行分类和聚类等任务。 总结来说,KDE是一种通过将每个观测样本点视为高斯函数的中心,根据每个样本点周围的邻域来估计密度函数的非参数方法。它能够通过调整核函数的带宽和观测样本点的数量来灵活地对不同的数据分布进行建模和估计。 ### 回答3: 高斯核密度估计KDE)是一种非参数的概率密度估计方法。它基于观测数据的分布情况,通过在每个数据点周围创建一个高斯核函数的方式来估计整体的概率密度函数。 KDE的值表示某个特定点的概率密度估计。具体来说,对于给定的输入点,KDE计算该点周围邻近点的贡献,并将它们的高斯核函数叠加在一起得到该点的概率密度估计值。 在计算过程中,KDE使用一个带宽参数来控制高斯核函数的宽度,带宽越小则高斯核函数的影响范围越小,估计的概率密度函数越细致;带宽越大则高斯核函数的影响范围越大,估计的概率密度函数越平滑。 KDE的值可以用来表示某个数据点在数据集中的相对重要性或罕见性。具体来说,KDE值较高的点表示该点周围有较多的数据点,因此被认为是数据集中的常见点;而KDE值较低的点表示该点周围较少的邻近点,因此被认为是数据集中的罕见点。 总结起来,高斯核密度估计KDE)的值代表了在给定数据点周围创建高斯核函数并叠加后得到的概率密度估计值。它可以用来衡量数据点的重要性或罕见性,并且随着带宽参数的不同而产生不同的估计结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 43
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值