
如果你也曾经在翻统计教材时被“概率分布函数”和“概率密度函数”这两个名字绕得晕头转向那这份笔记应该是为你准备的。我第一次接触这两个概念时最大的困惑是它们明明都在描述同一个随机变量为什么一个叫“函数”另一个也叫“函数”却长得完全不一样后来我才体会到它们就像同一个事物的两种“说法”——一个回答“累积到这里的概率有多少”另一个回答“在这个点附近概率有多集中”。这篇笔记会把这两个概念拆开揉碎用最直白的语言、可复现的例子和我在实际画图、计算中踩过的坑帮你真正建立起直观理解。适合刚开始学统计、数据科学或者准备面试时需要快速捡起基础的人。1. 概念拆解先搞清楚它们各自在说什么1.1 分布函数对概率的“累积账本”概率分布函数更准确地说叫“累积分布函数”Cumulative Distribution FunctionCDF数学定义是F(x) P(X ≤ x)这个式子的意思是随机变量X落在从负无穷到x这段范围里的总概率。你可以把它想象成一张“存款余额账单”——每一笔收入都累加进去余额只会越滚越多。CDF的取值永远在0到1之间因为概率本身就是0到1之间的数随着x增大它只会上升或保持不变不可能下降。它最终会趋近于1因为X总会落在整个实数轴上的某个地方。我最初犯的错是把这个“累积”理解成简单的加法。其实它就是在逐段“扫过”概率每扫过一个区间就把这个区间对应的概率面积加进去。当你问“X小于等于某个数”时CDF直接就给出答案当你问“X在a和b之间”时也可以靠CDF快速计算P(a X ≤ b) F(b) - F(a)这个公式很好用也说明了CDF的真正价值它是一个“一口价”函数任何区间概率都能通过两点的函数值之差得到。所以说CDF是概率计算的“总账本”你需要查某段区间的情况时翻账本就行了。1.2 密度函数概率的“瞬时流速”概率密度函数Probability Density FunctionPDF的情况有点不同。对于连续型随机变量f(x)本身不是概率而是一个“密度”。它描述的是在x附近单位长度上概率的密集程度就像人口密度一样——一个城市的人口密度可以是每平方公里几千人但“某个人恰好站在这个点上的概率”仍然是0。用我最喜欢的生活类比如果把概率想象成水流CDF是某个时间段里水龙头流出的“总水量”PDF就是“瞬时流速”。流速本身不代表水量只有把流速乘以时间才能得到水量。同理PDF f(x)本身不代表概率只有把它在某个区间上积分才能得到这个区间上的概率P(a X ≤ b) ∫[a,b] f(x) dx很多人第一次看到“f(x)可以大于1”时觉得奇怪。比如均匀分布U(0, 0.5)它的PDF是2这没有错。因为密度高不代表概率高密度乘以区间长度后总面积仍然是1。把这个概念内化之后再看一切有关PDF的计算都会自然许多。1.3 离散变量的对应版本概率质量函数提到PDF就不能不提它的离散版兄弟概率质量函数Probability Mass FunctionPMF。离散随机变量每个具体取值都有自己的概率比如掷骰子P(X3)1/6。这些概率加起来等于1所以不需要“密度”这个概念直接用“质量”来表示每个点上的概率量。对于离散变量CDF会变成一条“阶梯状”的跳跃函数。每个取值点处函数会突然跳升一个概率质量在两个取值点之间CDF保持水平不变。这一点和连续变量的光滑CDF完全不同。我见过不少初学者把PMF直接叫做PDF虽然两者首字母缩写很像但概念上差别很大PMF给出的是概率本身PDF给出的却是密度。平台上的很多统计课程也会混用但自己写笔记时最好分清楚否则后面做概率计算时非常容易错。2. 两者之间的数学关系积分与求导2.1 从PDF到CDF积分就是累加既然CDF表示累积概率那它和PDF的关系就很自然CDF是PDF从负无穷到当前x的积分。F(x) ∫[-∞, x] f(t) dt这里有几个容易踩坑的细节。第一积分下限为什么是负无穷而不是0因为随机变量X理论上可以取到很靠左的值为了不漏掉任何概率必须从负无穷开始累积。第二如果PDF是分段定义的比如只定义在[a,b]区间上那么积分时要注意分段x a时F(x)0a≤x≤b时F(x)是从a到x的积分x b时F(x)1。我最初用Python画CDF时直接用np.cumsum对PDF数组做累加结果发现曲线终点不是1而是差了一个量级。原因就是没有先乘以采样间隔dx。累积积分本身要有“宽度”概念不能只靠点数累加。正确做法是import numpy as np x np.linspace(0, 1, 1001) pdf 2 * np.ones_like(x) # 均匀分布 U(0,0.5) 宽度应为0.5这里示例用 [0,1] 则 pdf1 # 仔细调整区间 dx x[1] - x[0] cdf np.cumsum(pdf * dx)如果你这样做了cdf的最后一个值会接近1。这个细节在我的实操过程中出现过很多次值得记下来。2.2 从CDF到PDF求导找斜率反过来如果已知CDF那么PDF就是CDF的导数f(x) F(x)从几何上看CDF在某个点x处的斜率就是PDF在该点的值。如果CDF上升得很陡说明这个点附近概率分配得很多如果CDF平缓说明这里概率稀薄。打个比方如果你把CDF想象成一条山路的海拔高度PDF就是这段路的坡度。坡越陡说明海拔“上升越快”对应概率累积越迅速。这里有个容易忽略的前提导数只在CDF连续且光滑的点上存在。如果随机变量是离散的CDF是跳跃阶梯那些跳跃点上导数不存在。所以“求导恢复PDF”只适用于连续型变量。实际做数据拟合时如果手里只有经验CDFempirical CDF想恢复经验PDF更可靠的方式是核密度估计而不是直接数值求导。因为数值求导对噪声极其敏感画出来的曲线会像锯齿一样完全没法看。2.3 一个容易忽略的归一化条件不是随便画一条非负曲线都能当PDF。要成为合法的概率密度函数必须满足两个条件所有x上f(x) ≥ 0∫[-∞,∞] f(x) dx 1这两个条件缺一不可。尤其是第二条归一化条件几乎是我见过最容易被忽略的坑。有些人为了拟合数据随手用一个带参数的函数形式比如f(x)k·e^{-x²}却忘了前面的归一化常数。结果积分不是1后面算概率时全错了。我在实际工作中测试新模型时会先做一步“归一化验证”用数值积分算一下PDF的积分看是否近似等于1。如果不等于1就检查是不是密度参数写错了、采样域是否截断得太窄或者函数本身就不是合法的密度。这步虽小但能避免后面一大堆连锁错误。3. 用两个经典分布彻底搞懂3.1 均匀分布最简单的对照实验均匀分布是理解CDF和PDF之间关系的最好起点。如果X服从[a, b]上的均匀分布那么它的PDF是一个常数f(x) 1/(b - a), a ≤ x ≤ b而它的CDF是一个线性上升的函数F(x) (x - a)/(b - a), a ≤ x ≤ b两相对比非常直观PDF是水平直线说明单位长度上的概率密度处处相等CDF是一条斜直线从0爬到1。因为PDF是常数所以积分结果就是一个一次函数简单到可以口算。举个例子公交车每隔10分钟到站你在任意时间到站乘客等待时间X可以看成一个[0,10]上的均匀分布。那么PDF就是1/100.1CDF在x4时等于0.4意思是“你等待时间不超过4分钟”的概率是40%。而“等待时间在2到6分钟”的概率是F(6)-F(2)0.6-0.20.4。这个例子非常有画面感也比干巴巴的公式好记。但均匀分布也会带来一个常见错误有人以为CDF等于x除以最大值是万能公式。这只适用于从0开始且均匀分布的情形。如果分布不是均匀的或者起点不是0直接用x除以最大值就会得到错误答案。所以还是要回到定义先写PDF再做积分或求导。3.2 正态分布实际用途最广的模型正态分布是统计世界里出现频率最高的模型它的PDF是f(x) (1 / (σ√(2π))) · e^{-(x-μ)²/(2σ²)}乍一看有点吓人但其实我们可以把它拆成两个部分前面的系数是为了满足归一化条件后面的指数决定了密度曲线的“钟形”形状。均值为μ时曲线最高σ控制散布程度。σ越小曲线越尖σ越大曲线越扁。正态分布的CDF没有初等函数表达式是个特例。我们平时要么用软件算要么查标准正态分布表。做法是把X标准化成Z(X-μ)/σ让标准正态分布N(0,1)来做查表。比如某次考试成绩服从正态分布均值为70标准差为10你想知道成绩低于85分的比例就计算Z(85-70)/101.5然后查标准正态表得到约0.9332即93.32%。这里我想强调一个很多人初学时的误区拿着PDF表达式就直接代x85以为能算出概率。不行。正态分布的PDF在具体某个点的值只是一个“高度”不是概率。真正要算概率必须走CDF或者积分路径。刚开始学的时候我自己也犯过类似的错因为看到f(x)就觉得应该和yf(x)一样代进去就能出结果。后来画了图才明白概率是曲线下的面积不是曲线的高度。3.3 指数分布无记忆性的另一个视角指数分布也是理解PDF和CDF关系的绝佳例子。如果X服从参数为λ的指数分布它的PDF是f(x) λe^{-λx}, x ≥ 0它的CDF是F(x) 1 - e^{-λx}, x ≥ 0这个分布的好处是我们可以直接用积分来验证CDF。从0到x对λe^{-λt}积分结果就是1 - e^{-λx}。积分过程很简单适合亲手推一遍非常有助于建立“PDF积分得到CDF”的感觉。指数分布常用于描述等待事件发生的时间比如设备的无故障工作时间、网络请求的间隔等。它还有一个著名的“无记忆性”性质已经等了t时间再等s时间的条件和最初等s时间的概率一样。这个性质从CDF公式里可以直接看出来。用指数分布时要注意λ的单位。如果λ表示“单位时间内事件发生的平均次数”那么平均等待时间就是1/λ。有些人会把λ和1/λ搞混直接导致PDF曲线形状不对出现数据明显偏高等问题。时刻记住指数分布的均值是1/λ方差是1/λ²检查参数时先看这两个值是否合理。4. 实操笔记用Python画图时踩过的坑4.1 最快捷的可视化组合纸上谈兵再多不如直接画图。我习惯用numpy生成数据matplotlib绘图scipy用于统计分布函数。一个最基础的例子绘制正态分布的PDF和CDFimport numpy as np import matplotlib.pyplot as plt from scipy.stats import norm mu, sigma 0, 1 x np.linspace(-5, 5, 1001) pdf norm.pdf(x, mu, sigma) cdf norm.cdf(x, mu, sigma) fig, axes plt.subplots(1, 2, figsize(10, 3.5)) axes[0].plot(x, pdf) axes[0].set_title(PDF) axes[1].plot(x, cdf) axes[1].set_title(CDF) plt.tight_layout() plt.show()这段代码很简短但我建议你在运行后做一件事用鼠标在PDF图上找一个峰值点再在CDF图上找对应的位置。你会发现CDF在PDF峰值附近斜率最大直观感受到“密度大累积快”。画图时的采样密度也很重要。x的范围太窄曲线会残缺不全范围太宽但采样点太少曲线会变形。我经验是用1000到2000个点既保证平滑又不至于让绘图文件太大。如果画出来的PDF曲线有明显折角多半是x点太少或者样本域不对称。4.2 数值积分与归一化验证画图之外验证归一化是我每次都会做的步骤。用scipy.integrate.quad数值积分PDF检查积分是否接近1from scipy.integrate import quad import numpy as np def pdf(x): return np.exp(-x**2 / 2) / np.sqrt(2 * np.pi) result, error quad(pdf, -np.inf, np.inf) print(result) # 接近1.0如果结果不接近1常见原因有几个一是公式抄错比如少了分母中的σ二是积分区间选得太窄把尾部概率截掉了三是函数写成了有负值的形式。负值尤其隐蔽有些函数在局部会出现负密度但面积积分后可能刚好等于1这也会导致计算一些区间概率时出现负数。合法的PDF应该处处非负所以画图时顺便看一眼曲线是否都大于0会有帮助。4.3 绘制CDF时的常见坑另一个经典坑是用np.cumsum画经验CDF时忘记乘以dx。如果直接对PDF采样数组做cumsum得到的是一条“累积高度曲线”它最终会等于PDF采样值的总和而不是概率面积。很多初学者的图最终“CDF”冲到几十甚至几百就是这个原因。修正方法就是前面提到的先乘以采样间隔dx再做累加。如果是基于原始数据画经验CDF更稳妥的办法是先排序再按序号比例画阶跃data np.random.normal(size1000) sorted_data np.sort(data) cdf_empirical np.arange(1, len(sorted_data) 1) / len(sorted_data) plt.plot(sorted_data, cdf_empirical)这样画出来的经验CDF会从0升到1而且形状和理论CDF基本一致。很多数据分析项目里检查两个样本是否同分布时都会先画经验CDF对比图这种图能很快告诉你分布中心、散布程度和尾部形态的差异。4.4 解释图像时说错的常见表达最后说一下语言习惯。哪怕图画对了表述不准确也会让人误解。比如指着PDF最高处说“这里的概率最大”就不对应该说“这里的概率密度最大”或“这里的概率更集中”。因为PDF是密度不是概率。连续变量取任何具体点的概率都是0但“该点附近很小邻域内的概率”确实可以最大。用“集中度”代替“概率大小”会准确很多。同理也不能指着CDF的某个点说“这里概率增长很多”。CDF本身就是概率但它是累积值所以在x点处的值代表“小于等于该点的所有概率”。如果想要区间概率应该看两点之间的差值。语言上的严谨能反过来帮助我们形成正确的直觉这一点我觉得值得单独写出来。5. 常见问题与排查技巧实录5.1 为什么PDF单点值不是概率这是被问得最多的问题之一。既然有密度函数为什么不能说f(x)就是P(Xx)关键原因在于连续随机变量取任何一个精确值的概率是0。想象你测量身高精确到毫米最终得到“175.000000mm”的概率其实无限小。但身高落在175cm到175.1cm这个区间里的概率是正数并且近似等于密度乘以区间长度。这个道理用积分理解更清晰单点积分是∫[x,x] f(t)dt 0。所以f(x)只是决定了x附近概率的“浓度”不能单独当概率用。如果变量是离散的PMF才可以直接当概率用。这个区别我在做机器学习特征工程时也经常遇到——连续特征做完离散化后概率计算方式就要从积分改为求和。5.2 CDF为什么总在0到1之间且不下降CDF单调不减的原因很简单F(b) - F(a) P(a X ≤ b) ≥ 0所以ba时F(b)≥F(a)。它能保持不下降是因为累积过程中只添加正的概率面积没有扣减操作。如果你自己实现CDF时发现曲线下降了最常见的bug是原始数据没有排序或者累加时下标错位。另一个可能是你画的是1-F(x)生存函数它当然会下降要确认自己到底在画什么。有些人看到CDF的曲线是S形会惊讶为什么中间那么陡。这恰恰说明中间的密度大。S形曲线的拐点对应PDF峰值位置这是视觉上验证二者联系的好方法。我在做模型校准分析时也经常把预测概率的CDF画出来如果曲线过于集中在两端就说明模型输出的概率区分度太高可能需要做平滑处理。5.3 从频率直方图近似PDF需要什么条件实际数据分析中我们经常没有真PDF只有样本数据。这时会用直方图近似频率分布再归一化成密度估计。但这个近似成立的先决条件有三个样本量要够多、组距要合适、要归一化到总面积等于1。样本量太少直方图会是一个个尖刺组距太大细节被抹平组距太小又会出现很多空区间看起来全是抖动的噪声。我自己的习惯是先用数据量的平方根估算分组数然后微调。归一化也很关键很多绘图库默认的直方图高度是频数不是密度。在matplotlib里可以用densityTrue参数让它自动把面积归一化成1。5.4 在跳跃点和分段点处要小心求导最后一个隐蔽问题是处理分段函数和跳跃点。有些分布的PDF并不是连续的比如均匀分布两端就有跳跃。在跳跃点上CDF是连续的但不可导所以f(x)在那个点上的值数学上无法唯一确定。绝大多数工程应用里不必纠结编程算的时候取左极限或右极限差别不大但如果做严格推导就要说明这一点。离散型变量的CDF更明显跳跃点上的导数不存在。所以有人试图用“求导”从离散CDF恢复PMF时会发现完全行不通。正确做法是取CDF的跳变差值P(Xx) F(x) - F(x-)也就是左极限处的差值。这个操作在处理计数型数据时很实用比如泊松分布它的CDF有无数个跳跃点但PMF就是每个整数点上的概率值。写到这里“理解概率分布函数和概率密度函数”的笔记第一部分已经足够自己回顾了。最后再分享一个小技巧每次遇到概率公式先在纸上画一遍对应分布的形状标出PDF峰值和CDF拐点的位置再想想“如果这里增大参数曲线会往哪个方向偏”。这套思考习惯帮我避免了很多死记硬背也让我在面试和实际建模时都能快速定位问题。后续笔记我打算继续把分位数、期望、方差和矩母函数串起来这样才能真正打通概率统计的整个框架。