直方图(Histogram):直方图是最直观的一种方法,它通过把数据划分为若干个区间,并统计每个区间的数据个数,从而得到每个区间的频数。这样就形成了一个个的矩形,高度代表频数,宽度代表区间,面积代表数据量。但是直方图的缺点是对区间的选择敏感,不同的区间选择会得到不同的图形。
分布函数(Distribution function):分布函数通常是指累积分布函数,它表示随机变量小于等于某个值的概率。分布函数是非递减的,且在负无穷处值为0,在正无穷处值为1。然而,分布函数并非直观,数据的分布形状可能并不容易从中看出。
概率密度函数(Probability Density Function, PDF):概率密度函数是连续随机变量的分布函数的导数。它的值在任何单点上都可能大于1,但其在整个定义域上的积分(即面积)等于1。概率密度函数可以直观地反映出随机变量在各个取值上的可能性大小。
核密度函数(Kernel Density Function, KDF):核密度函数是核密度估计中所使用的核函数,常见的如高斯核函数、Epanechnikov核函数等。在核密度估计中,每一个数据点都会放置一个核函数,然后这些核函数会被叠加起来,得到一个平滑的概率密度估计。
核密度估计(Kernel Density Estimation, KDE):核密度估计是一种非参数的概率密度估计方法。它通过在每个观测数据点处放置一个核函数(即平滑函数),然后把这些核函数叠加起来,从而获得一个平滑的估计。相比于直方图,核密度估计可以得到更为平滑的密度曲线。
PDF描述了一个连续随机变量在某个特定值上的可能性。但是,对于连续随机变量来说,取任何特定的一个值其概率本身都是0,**所以我们说PDF在某个点的值,实际上是表示随机变量落在这个点附近非常小的区间内的概率。**这是因为对于连续型随机变量来说,其取值范围是连续的,理论上可以取到无穷多个值。因此,任何一个具体的值被取到的概率都是无穷小的,可以视为0。
以一个简单的例子来说明,假设我们有一个从0到1均匀分布的连续随机变量,那么它可以取到任何在0到1之间的实数。那么它取到0.5的概率是多少呢?因为在0和1之间有无穷多个实数,所以取到0.5的概率就是1除以无穷大,即0。
尽管如此,我们仍然可以使用概率密度函数来描述连续随机变量在某个值附近的可能性。比如在上面的例子中,虽然取到0.5的概率为0,但是我们可以说在0.5附近(比如在0.499和0.501之间)取到值的概率是0.002。这个概率是通过PDF计算的。
当我们说PDF的值在某个单点上可能大于1时,这个“大于1”是指的PDF的函数值,而不是概率。**对于连续随机变量的PDF,它的值并不直接代表概率,而是概率密度。**比如说,如果概率密度函数(PDF)在某点的值为2,那么这个2并不直接表示概率为2,而是表示单位长度(或者说,非常小的区间)内的概率密度为2。这个值越大,表示随机变量落在这个位置的可能性越大。但这并不意味着PDF的值就是概率,真正的概率是通过在某个区间内积分PDF得到的。
而当我们说PDF在其定义域上的积分(即面积)等于1时,这是因为所有可能的事件(也就是所有的小区间)的概率之和必须等于1。这个面积,就是把所有小区间的概率都加起来,所以必须等于1。所以,尽管PDF在某个单点上的值可能大于1,但是当你把所有的点(也就是所有的可能事件)都考虑进去后,总的概率还是1。
进一步,可以通过一个简单的例子来理解。假设我们有一组数据,它们服从标准正态分布(也就是均值为0,标准差为1的正态分布)。
首先,我们可以画出这个正态分布的概率密度函数。demo如下:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
x = np.linspace(-5, 5, 100)
y = norm.pdf(x, 0, 1)
plt.plot(x, y)
plt.title('Probability Density Function of Standard Normal Distribution')
plt.xlabel('x')
plt.ylabel('PDF')
plt.grid(True)
plt.show()
运行这段代码后将会画出一个标准的正态分布曲线。可以看到,曲线在x=0的地方达到最高点,大约为0.4。但这并不意味着x=0的概率为0.4,而是表示在x=0附近的概率密度最高。
然后,我们可以计算PDF在整个定义域(这里是[-5, 5])上的积分,也就是面积:
area = np.sum(y) * (x[1] - x[0])
print(area) # 输出:1.0
运行这段代码后计算的是所有小区间(这里是100个点之间的小区间)的概率之和,结果应该接近1(由于数值计算的精度问题,可能不会完全等于1,但应该非常接近1)。
核密度估计是一种非参数的统计方法,用于估计连续随机变量的概率密度函数。也就是说,它不需要对数据的分布形状做出任何假设,这使得核密度估计能够适应各种不同的数据分布,从有限的样本中估计出整体的概率密度函数。
另外,核密度估计可以被看作是直方图平滑的一种方式,它在每个数据点位置放置一个以该点为中心的"核"(通常是正态分布形状),然后将所有核加起来并进行归一化,得到一个平滑的、连续的概率密度估计。
需要注意的是:核密度估计的结果不依赖于区间的划分,而是依赖于核的形状和宽度(即带宽)。带宽过小可能会导致过拟合,即在数据点位置有过高的峰值,而在数据点之间则几乎为0;带宽过大则可能会导致估计过于平滑,无法捕捉到数据的真实分布。
大数定律告诉我们,随着样本数量的增加,样本的平均值会趋近于总体的期望值。中心极限定理告诉我们,大量独立随机变量的和(或者平均值)会服从正态分布。而在核密度估计中,我们就是在每个数据点位置放置一个正态分布,然后将这些正态分布加起来并进行归一化,得到的便是一个平滑的、连续的概率密度估计。
可以这么理解,假设我们有一些数据点,它们分布在一条直线上。如果我们在每个点上都放置一个小山丘(正态分布可以看成是山丘的形状),然后将这些山丘叠加起来,我们就得到了一个连续的地形。这个地形就反映了数据的分布特征。山丘越高,说明数据在这个位置的密度越高,也就是说在这个位置附近取到值的概率越高。
进一步,以下代码展示了如何使用seaborn库进行核密度估计及核函数叠加过程:
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from scipy import stats
from scipy.stats import norm
mu = 0
sigma = 1
# 创建一个x轴上的点集
x = np.linspace(mu - 6*sigma, mu + 6*sigma, 100)
# 画出标准正态分布
plt.plot(x, stats.norm.pdf(x, mu, sigma))
data = np.array([1, 2, 2, 2, 3, 3, 4, 4, 4, 4])
# 画出直方图
plt.hist(data, bins=4, density=True, alpha=0.5)
# 画出核密度估计曲线
sns.kdeplot(data, color='b')
# 在每一个数据点的位置上放一个正态分布,然后将它们叠加
total = np.zeros(len(x))
for point in data:
total += norm.pdf(x, point, 1) # 这里1是正态分布的标准差
total /= len(data)
# 画出叠加后的核密度估计曲线
plt.plot(x, total, color='r')
plt.show()
可以看出核密度估计的步骤:
数据分析:核密度估计是数据分析中非常重要的工具,它可以用于数据的平滑处理,提供数据的概率分布信息,使得数据更加平滑,更便于分析。
图像处理:在图像处理中,核密度估计可以用于图像的平滑处理,消除图像中的噪声。同时,还可以用于图像的分割和边缘检测。
机器学习:在机器学习中,核密度估计是一种重要的非参数学习方法。它可以用于分类、聚类、异常检测等任务。
信号处理:在信号处理中,核密度估计可以用于信号的平滑处理,提高信号处理的准确性。
生物信息学:在生物信息学中,核密度估计可以用于基因表达数据的分析,帮助研究者更好地理解基因的功能。
金融:在金融领域,核密度估计可以用于估计金融资产的价格分布,帮助投资者做出更好的投资决策。
地理信息系统:在地理信息系统中,核密度估计可以用于空间数据的分析,例如人口分布、犯罪率等。
医学:在医学领域,核密度估计可以用于疾病的早期检测和预后评估
直方图、分布函数、概率密度函数和核密度函数都是描述数据分布特性的工具或技术,它们之间有一定的联系和区别。
直方图是一种最简单的对数据分布进行可视化的方法,但它对数据的划分方式(即箱宽)比较敏感,不同的划分方式可能会得到完全不同的图像。
分布函数(一般指累积分布函数)给出了随机变量取值小于等于某个数的概率。在连续的情况下,分布函数的导数就是概率密度函数。
概率密度函数给出了随机变量落在某个小区间内的概率。直方图可以看作是对概率密度函数的一种简单粗糙的估计。
核密度估计则是一种更为精细的对概率密度函数的估计。它通过在每个数据点处放置一个核函数(类似于一个“平滑”的直方图),然后将这些核函数叠加起来,从而得到一个平滑的估计。
所以,这四者可以看作是从不同角度、不同精度去描述数据分布特性的方法。从直方图到核密度函数,描述的越来越精细;从分布函数到概率密度函数,描述的越来越具体。