核密度估计简介
核密度估计是一种非参数的统计方法,用于估计随机变量的概率密度函数。它的基本思想是在数据点附近放置一些核函数(例如高斯核函数),然后对这些核函数进行加权求和,得到对概率密度函数的估计。核密度估计的优点在于它不需要假设数据的分布形式,能够更灵活地适应数据的特点。核密度估计的核心思想是考察每个数据点的附近区域内的数据点密度,从而得到整体的密度估计。通常使用窗宽参数来控制核函数的宽窄,影响估计的准确性和偏差。核密度估计在数据分布不规则或者多峰情况下表现较好,可以用于数据的可视化和分析
主要依赖的函数
Python里面有很多的函数可以对变量的分布进行核密度估计,我这里只介绍我自己使用的一种方法,可能存在一些错误或者比较繁琐,仅供参考。
1、用于进行核密度估计的函数,代码有缺,仅用于说明函数作用
from scipy.interpolate import interp1d
kde = sm.nonparametric.KDEUnivariate(data) # data表示用于估计的一维变量数据
kde.fit(kernel=kernel, bw = bw) # kerner表示选择的核函数,bw表示窗宽
p = kde.evaluate(x_values) # 表示根据估计的样本分布,在x_values样本下计算得到的概率密度值
2、累积概率分布计算函数 ,本人没在KDEUnivariate这个类中找到计算累积概率分布的函数,可能有,我决定自己写一个。核心思想就是累积概率分布函数实际上就是概率密度函数在变量可行域上的定积分,计算核密度函数的公式已经有了,因此只需要采用定积分的一些基本定义:本文采用梯形积分,基于将区间内的曲线分割成若干个小梯形,然后计算每个小梯形的面积并将它们相加得到总的近似积分值。
def calculateKdeCDF(self, low, high, scatter=10):
"""
采用梯形进行近似积分,计算累计非参数核密度估计的累积概率
"""
kde = sm.nonparametric.KDEUnivariate(self.data)
kde.fit(kernel=self.kernel, bw=self.bw) # bw为核密度估计的窗宽
x_values = np.linspace(low, high, scatter)
x_values_start = x_values[:-1]
x_values_end = x_values[1:]
y_values_start = kde.evaluate(x_values_start)
y_values_end = kde.evaluate(x_values_end)
s = (y_values_start + y_values_end) * (x_values_start[1] - x_values_start[0]) / 2
return np.sum(s)
def getKdeCDFF(self, low, high, scatter1=1000, scatter2=10):
"""
获取kde的cdf关系
:param low: 积分下限
:param high: 积分上限
:param scatter1: 样本点
:param scatter2: 离散份数
"""
x = np.linspace(low, high, scatter1)
cdfArray = np.linspace(np.nan, np.nan, scatter1)
for i in range(scatter1):
if i == 0:
cdfArray[i] = 0
else:
cdfArray[i] = self.calculateKdeCDF(low=x[i-1], high=x[i], scatter=scatter2)+cdfArray[i-1]
return x, cdfArray
代码中low,high分别表示积分上下界,scatter2则表示在该积分区间内的离散份数,最后返回的就是以scatter1为长度的样本点和累积概率分布值对应的数组:x,cdfArray