均匀分布(Uniform distribution)
定义
对于投骰子来说,结果是1到6。得到任何一个结果的概率是相等的,这就是均匀分布的基础。与伯努利分布不同,均匀分布的所有可能结果的n个数也是相等的。
如果变量X是均匀分布的,则密度函数可以表示为:
可以看到,均匀分布曲线的形状是一个矩形,这也是均匀分布又称为矩形分布的原因。其中,a和b是参数。
花店每天销售的花束数量是均匀分布的,最多为40,最少为10。我们来计算一下日销售量在15到30之间的概率。
日销售量在15到30之间的概率为(30-15)*(1/(40-10)) = 0.5
同样地,日销售量大于20的概率为 = 0.667
# IMPORTS
# 导入 NumPy 库,它是 Python 中用于科学计算的基础库,提供了多维数组对象和处理这些数组的函数
import numpy as np
# 导入 SciPy 库的 stats 模块,用于进行统计分析和概率分布相关的操作
import scipy.stats as stats
# 导入 Matplotlib 库的 pyplot 模块,用于创建各种静态、交互式的图表
import matplotlib.pyplot as plt
# 导入 Matplotlib 的 style 模块,用于设置绘图的风格
import matplotlib.style as style
# 从 IPython 的核心显示模块导入 HTML 类,可用于在 IPython 环境中显示 HTML 内容
from IPython.core.display import HTML
# 设置 matplotlib 支持中文
# 设置 matplotlib 使用黑体字体来显示中文,可根据系统中实际安装的字体进行修改
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决 matplotlib 中负号显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False
# PLOTTING CONFIG
# 在 Jupyter Notebook 中以嵌入方式显示图表
%matplotlib inline
# 使用 'fivethirtyeight' 风格来绘制图表,该风格模仿 FiveThirtyEight 网站的图表样式
style.use('fivethirtyeight')
# 设置图表的大小为宽 14 英寸,高 7 英寸
plt.rcParams["figure.figsize"] = (14, 7)
# 创建一个新的图表,并设置其分辨率为 100 dpi
plt.figure(dpi=100)
# PDF
# 绘制均匀分布的概率密度函数(PDF)曲线
# np.linspace(-4, 4, 100) 生成从 -4 到 4 的 100 个等间距的数值作为 x 轴坐标
# stats.uniform.pdf(np.linspace(-4, 4, 100)) 计算这些 x 坐标对应的均匀分布的 PDF 值作为 y 轴坐标
plt.plot(np.linspace(-4, 4, 100),
stats.uniform.pdf(np.linspace(-4, 4, 100))
)
# 填充概率密度函数曲线下方的区域,使其更直观
# alpha=.15 设置填充区域的透明度为 0.15
plt.fill_between(np.linspace(-4, 4, 100),
stats.uniform.pdf(np.linspace(-4, 4, 100)),
alpha=.15)
# CDF
# 绘制均匀分布的累积分布函数(CDF)曲线
# 同样使用 np.linspace(-4, 4, 100) 作为 x 轴坐标
# stats.uniform.cdf(np.linspace(-4, 4, 100)) 计算这些 x 坐标对应的均匀分布的 CDF 值作为 y 轴坐标
plt.plot(np.linspace(-4, 4, 100),
stats.uniform.cdf(np.linspace(-4, 4, 100)),
)
# 添加图例说明
# 在坐标 (-1.5, 0.7) 处添加文本,说明这是归一化后的概率密度函数曲线
# rotation=65 设置文本旋转 65 度
# alpha=.75 设置文本的透明度为 0.75
# weight="bold" 设置文本字体加粗
# color="#008fd5" 设置文本颜色为 #008fd5
plt.text(x=-1.5, y=.7, s="概率密度函数 (归一化)", rotation=65, alpha=.75, weight="bold", color="#008fd5")
# 在坐标 (-0.4, 0.5) 处添加文本,说明这是累积分布函数曲线
# rotation=55 设置文本旋转 55 度
plt.text(x=-.4, y=.5, s="累积分布函数", rotation=55, alpha=.75, weight="bold", color="#fc4f30")
# TICKS
# 设置坐标轴主刻度的字体大小为 18
plt.tick_params(axis = 'both', which = 'major', labelsize = 18)
# 在 y = 0 处绘制一条黑色的水平线,线宽为 1.3,透明度为 0.7
plt.axhline(y = 0, color = 'black', linewidth = 1.3, alpha = .7)
# TITLE
# 在坐标 (-5, 1.25) 处添加图表的标题
# 字体大小为 26,字体加粗,透明度为 0.75
plt.text(x = -5, y = 1.25, s="均匀分布 - 概述",
fontsize = 26, weight = 'bold', alpha = .75)
# 设置 matplotlib 支持中文
# 设置 matplotlib 使用黑体字体来显示中文,可根据系统中实际安装的字体进行修改
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决 matplotlib 中负号显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False
# 创建一个新的图表,并设置其分辨率为 100 dpi
plt.figure(dpi=100)
# PDF loc=0, scale=1
# 生成从 -8 到 8 的 100 个等间距的数值作为 x 轴坐标
x_vals_1 = np.linspace(-8, 8, 100)
# 计算这些 x 坐标对应的均匀分布(位置参数 loc=0,尺度参数 scale=1)的 PDF 值作为 y 轴坐标
# 并绘制概率密度函数(PDF)曲线
plt.plot(x_vals_1,
stats.uniform.pdf(x_vals_1, loc=0, scale=1),
)
# 填充概率密度函数曲线下方的区域,使其更直观
# alpha=.15 设置填充区域的透明度为 0.15
plt.fill_between(x_vals_1,
stats.uniform.pdf(x_vals_1, loc=0, scale=1),
alpha=.15,
)
# PDF loc=0, scale=2
# 生成从 -8 到 8 的 100 个等间距的数值作为 x 轴坐标
x_vals_2 = np.linspace(-8, 8, 100)
# 计算这些 x 坐标对应的均匀分布(位置参数 loc=0,尺度参数 scale=2)的 PDF 值作为 y 轴坐标
# 并绘制概率密度函数(PDF)曲线
plt.plot(x_vals_2,
stats.uniform.pdf(x_vals_2, loc=0, scale=2),
)
# 填充概率密度函数曲线下方的区域,使其更直观
# alpha=.15 设置填充区域的透明度为 0.15
plt.fill_between(x_vals_2,
stats.uniform.pdf(x_vals_2, loc=0, scale=2),
alpha=.15,
)
# PDF loc=-3, scale=3
# 生成从 -8 到 8 的 100 个等间距的数值作为 x 轴坐标
x_vals_3 = np.linspace(-8, 8, 100)
# 计算这些 x 坐标对应的均匀分布(位置参数 loc=-3,尺度参数 scale=3)的 PDF 值作为 y 轴坐标
# 并绘制概率密度函数(PDF)曲线
plt.plot(x_vals_3,
stats.uniform.pdf(x_vals_3, loc=-3, scale=3),
)
# 填充概率密度函数曲线下方的区域,使其更直观
# alpha=.15 设置填充区域的透明度为 0.15
plt.fill_between(x_vals_3,
stats.uniform.pdf(x_vals_3, loc=-3, scale=3),
alpha=.15,
)
# LEGEND
# 在坐标 (-1, 0.65) 处添加文本,说明这是位置参数 loc=0,尺度参数 scale=1 的均匀分布的概率密度函数曲线
# rotation=65 设置文本旋转 65 度
# alpha=.75 设置文本的透明度为 0.75
# weight="bold" 设置文本字体加粗
# color="#008fd5" 设置文本颜色为 #008fd5
plt.text(x=-1, y=.65, s="位置=0, 尺度=1", rotation=65, alpha=.75, weight="bold", color="#008fd5")
# 在坐标 (1, 0.65) 处添加文本,说明这是位置参数 loc=0,尺度参数 scale=2 的均匀分布的概率密度函数曲线
# rotation=65 设置文本旋转 65 度
# alpha=.75 设置文本的透明度为 0.75
# weight="bold" 设置文本字体加粗
# color="#fc4f30" 设置文本颜色为 #fc4f30
plt.text(x=1, y=.65, s="位置=0, 尺度=2", rotation=65, alpha=.75, weight="bold", color="#fc4f30")
# 在坐标 (-3, 0.65) 处添加文本,说明这是位置参数 loc=-3,尺度参数 scale=3 的均匀分布的概率密度函数曲线
# rotation=65 设置文本旋转 65 度
# alpha=.75 设置文本的透明度为 0.75
# weight="bold" 设置文本字体加粗
# color="#e5ae38" 设置文本颜色为 #e5ae38
plt.text(x=-3, y=.65, s="位置=-3, 尺度=3", rotation=65, alpha=.75, weight="bold", color="#e5ae38")
# TICKS
# 设置坐标轴主刻度的字体大小为 18
plt.tick_params(axis = 'both', which = 'major', labelsize = 18)
# 在 y = 0 处绘制一条黑色的水平线,线宽为 1.3,透明度为 0.7
plt.axhline(y = 0, color = 'black', linewidth = 1.3, alpha = .7)
# TITLE
# 在坐标 (-5, 1.1) 处添加图表的标题
# 字体大小为 26,字体加粗,透明度为 0.75
plt.text(x = -5, y = 1.1, s="均匀分布 - 位置和尺度",
fontsize = 26, weight = 'bold', alpha = .75)
卡方分布(Chi-Squared Distribution)
定义
通俗的说就是通过小数量的样本容量去预估总体容量的分布情况
若n个相互独立的随机变量ξ₁,ξ₂,…,ξn ,均服从标准正态分布(也称独立同分布于标准正态分布),则这n个服从标准正态分布的随机变量的平方和构成一新的随机变量,其分布规律称为卡方分布(chi-square distribution)
自由度:假设你现在手头有 3 个样本,。因为样本具有随机性,所以它们取值不定。但是假设出于某种原因,我们需要让样本均值固定,比如说, , 那么这时真正取值自由,”有随机性“ 的样本只有 2 个。 试想,如果 ,那么每选取一组 的取值, 将不得不等于 对于第三个样本来说,这种 “不得不” 就可以理解为被剥夺了一个自由度。所以就这个例子而言,3 个样本最终"自由"的只有其中的 2 个。不失一般性, 个样本, 留出一个自由度给固定的均值,剩下的自由度即为 。
卡方检验的基本思想是根据样本数据推断总体的频次与期望频次是否有显著性差异
公式
f
(
x
∣
k
)
=
{
x
k
2
−
1
e
−
x
2
2
k
2
Γ
(
k
2
)
,
if
x
>
0
0
,
otherwise
\begin{equation} f(x|k) = \begin{cases} \frac{x^{\frac{k}{2}-1}e^{-\frac{x}{2}}}{2^{\frac{k}{2}}\Gamma(\frac{k}{2})}, & \text{if}\ x>0 \\ 0, & \text{otherwise} \end{cases} \end{equation}
f(x∣k)=⎩
⎨
⎧22kΓ(2k)x2k−1e−2x,0,if x>0otherwise
where
Γ
(
n
)
=
(
n
−
1
)
!
\Gamma(n) = (n-1)!
Γ(n)=(n−1)!
and
k
k
k denotes the degrees of freedom.
# 导入 SciPy 库的 stats 模块,该模块提供了丰富的统计函数和概率分布对象,用于统计分析和概率计算
import scipy.stats as stats
# 导入 Matplotlib 库的 pyplot 模块,它是一个常用的绘图工具,可用于创建各种静态、交互式的图表
import matplotlib.pyplot as plt
# 导入 Matplotlib 的 style 模块,此模块允许设置不同的绘图风格,以美化图表
import matplotlib.style as style
# 从 IPython 的核心显示模块导入 HTML 类,在 IPython 环境中,可使用该类显示自定义的 HTML 内容
from IPython.core.display import HTML
# 设置 matplotlib 支持中文显示
# 设置 matplotlib 使用黑体字体来显示中文,可根据系统中实际安装的字体进行修改
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决 matplotlib 中负号显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False
# 绘图配置
# 在 Jupyter Notebook 中,使绘图结果直接显示在单元格下方
%matplotlib inline
# 使用 'fivethirtyeight' 风格绘制图表,该风格具有特定的视觉效果
style.use('fivethirtyeight')
# 设置图表的大小为宽 14 英寸,高 7 英寸
plt.rcParams["figure.figsize"] = (14, 7)
# 使用 HTML 类设置输出的 PNG 图片在单元格中居中显示
HTML("""
<style>
.output_png {
display: table-cell;
text-align: center;
vertical-align: center;
}
</style>
""")
# 设置图表的分辨率为 100 dpi
plt.figure(dpi=100)
# 绘制卡方分布的概率密度函数(PDF)
# 生成从 0 到 20 的 100 个均匀分布的点作为 x 轴数据
# 计算自由度为 4 的卡方分布在这些点上的概率密度值作为 y 轴数据
plt.plot(np.linspace(0, 20, 100),
stats.chi2.pdf(np.linspace(0, 20, 100), df=4),
)
# 填充概率密度函数曲线下方的区域,设置透明度为 0.15
plt.fill_between(np.linspace(0, 20, 100),
stats.chi2.pdf(np.linspace(0, 20, 100), df=4),
alpha=.15,
)
# 绘制卡方分布的累积分布函数(CDF)
# 同样使用之前生成的 x 轴数据
# 计算自由度为 4 的卡方分布在这些点上的累积分布值作为 y 轴数据
plt.plot(np.linspace(0, 20, 100),
stats.chi2.cdf(np.linspace(0, 20, 100), df=4),
)
# 设置图表的图例
# 设置 x 轴的刻度,从 0 到 20,间隔为 2
plt.xticks(np.arange(0, 21, 2))
# 在图表上添加概率密度函数的图例,设置位置、透明度、字体加粗和颜色
plt.text(x=11, y=.25, s="概率密度函数 (归一化)", alpha=.75, weight="bold", color="#008fd5")
# 在图表上添加累积分布函数的图例,设置位置、透明度、字体加粗和颜色
plt.text(x=11, y=.85, s="累积分布函数", alpha=.75, weight="bold", color="#fc4f30")
# 设置图表的刻度
# 再次设置 x 轴的刻度,确保与之前一致
plt.xticks(np.arange(0, 21, 2))
# 设置图表坐标轴主要刻度的标签大小为 18
plt.tick_params(axis='both', which='major', labelsize = 18)
# 绘制 x 轴,设置颜色、线宽和透明度
plt.axhline(y=0, color='black', linewidth=1.3, alpha=.7)
# 设置图表的标题、副标题和页脚
# 添加主标题,设置位置、内容、字体大小、加粗和透明度
plt.text(x=-2, y=1.25, s=r"卡方 $(\chi^{2})$ 分布 - 概述",
fontsize=26, weight='bold', alpha=.75)
# 添加副标题,设置位置、内容、字体大小和透明度
plt.text(x=-2, y=1.1,
s='下图展示了自由度 $k$=4 的卡方分布随机变量 $ y \sim \chi^{2}(k) $ 的归一化概率密度函数 (pdf) 和累积分布函数 (cdf)。',
fontsize=19, alpha=.85)
# 导入 SciPy 库的 stats 模块,该模块提供了丰富的统计函数和概率分布对象,
# 可以用于执行各种统计分析任务,如计算概率密度、累积分布等。
import scipy.stats as stats
# 导入 Matplotlib 库的 pyplot 模块,它是一个功能强大的绘图工具,
# 支持创建各种静态、交互式的图表,如折线图、柱状图等。
import matplotlib.pyplot as plt
# 导入 Matplotlib 的 style 模块,此模块允许用户设置不同的绘图风格,
# 可以轻松改变图表的外观,使图表更加美观。
import matplotlib.style as style
# 从 IPython 的核心显示模块导入 HTML 类,在 IPython 环境中,
# 可以使用该类显示自定义的 HTML 内容,例如设置图表的显示样式。
from IPython.core.display import HTML
# 设置 matplotlib 支持中文显示
# 设置 matplotlib 使用黑体字体来显示中文,可根据系统中实际安装的字体进行修改
# 若系统中没有 SimHei 字体,需要替换为其他支持中文的字体。
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决 matplotlib 中负号显示为方块的问题
# 确保在图表中负号能够正常显示。
plt.rcParams['axes.unicode_minus'] = False
# 设置图形的分辨率为 100 dpi,使图表显示更加清晰。
plt.figure(dpi=100)
# 绘制自由度 k = 1 的卡方分布的概率密度函数(PDF)
# 生成从 0 到 15 的 500 个均匀分布的点作为 x 轴数据
# 计算自由度为 1 的卡方分布在这些点上的概率密度值作为 y 轴数据
plt.plot(np.linspace(0, 15, 500),
stats.chi2.pdf(np.linspace(0, 15, 500), df=1),
)
# 填充自由度 k = 1 的卡方分布概率密度函数曲线下方的区域,设置透明度为 0.15
plt.fill_between(np.linspace(0, 15, 500),
stats.chi2.pdf(np.linspace(0, 15, 500), df=1),
alpha=.15,
)
# 绘制自由度 k = 3 的卡方分布的概率密度函数(PDF)
# 生成从 0 到 15 的 100 个均匀分布的点作为 x 轴数据
# 计算自由度为 3 的卡方分布在这些点上的概率密度值作为 y 轴数据
plt.plot(np.linspace(0, 15, 100),
stats.chi2.pdf(np.linspace(0, 15, 100), df=3),
)
# 填充自由度 k = 3 的卡方分布概率密度函数曲线下方的区域,设置透明度为 0.15
plt.fill_between(np.linspace(0, 15, 100),
stats.chi2.pdf(np.linspace(0, 15, 100), df=3),
alpha=.15,
)
# 绘制自由度 k = 6 的卡方分布的概率密度函数(PDF)
# 这里原代码 df=20 可能是笔误,推测应改为 df=6
# 生成从 0 到 15 的 100 个均匀分布的点作为 x 轴数据
# 计算自由度为 6 的卡方分布在这些点上的概率密度值作为 y 轴数据
plt.plot(np.linspace(0, 15, 100),
stats.chi2.pdf(np.linspace(0, 15, 100), df=6),
)
# 填充自由度 k = 6 的卡方分布概率密度函数曲线下方的区域,设置透明度为 0.15
plt.fill_between(np.linspace(0, 15, 100),
stats.chi2.pdf(np.linspace(0, 15, 100), df=6),
alpha=.15,
)
# 添加图例
# 在图表上添加自由度 k = 1 的图例,设置位置、旋转角度、透明度、字体加粗和颜色
plt.text(x=.5, y=.7, s="$ k = 1$", rotation=-65, alpha=.75, weight="bold", color="#008fd5")
# 在图表上添加自由度 k = 3 的图例,设置位置、透明度、字体加粗和颜色
plt.text(x=1.5, y=.35, s="$ k = 3$", alpha=.75, weight="bold", color="#fc4f30")
# 在图表上添加自由度 k = 6 的图例,设置位置、透明度、字体加粗和颜色
plt.text(x=5, y=.2, s="$ k = 6$", alpha=.75, weight="bold", color="#e5ae38")
# 设置图表的刻度
# 设置图表坐标轴主要刻度的标签大小为 18
plt.tick_params(axis = 'both', which = 'major', labelsize = 18)
# 绘制 x 轴,设置颜色、线宽和透明度
plt.axhline(y = 0, color = 'black', linewidth = 1.3, alpha = .7)
# 设置图表的标题、副标题
# 添加主标题,设置位置、内容、字体大小、加粗和透明度
plt.text(x = -1.5, y = 2.8, s = "卡方分布 - $ k $",
fontsize = 26, weight = 'bold', alpha = .75)
# 添加副标题,设置位置、内容、字体大小和透明度
plt.text(x = -1.5, y = 2.5,
s = '下图展示了三个不同 $ k $ 值的卡方分布随机变量。可以看到,参数 $k$ 使分布更加平滑,偏度减小。',
fontsize = 19, alpha = .85)
泊松分布(Poisson Distribution)
定义:
现实生活多数服从于泊松分布
假设你在一个呼叫中心工作,一天里你大概会接到多少个电话?它可以是任何一个数字。现在,呼叫中心一天的呼叫总数可以用泊松分布来建模。这里有一些例子:
- 医院在一天内录制的紧急电话的数量。
- 在一小时内抵达沙龙的客户人数。
- 书中每一页打印错误的数量。
泊松分布适用于在随机时间和空间上发生事件的情况,其中,我们只关注事件发生的次数。
当以下假设有效时,则称为泊松分布
- 任何一个成功的事件都不应该影响另一个成功的事件。
- 在短时间内成功的概率必须等于在更长的间内成功的概率。
- 时间间隔变小时,在给间隔时间内成功的概率趋向于零。
泊松分布中使用了这些符号:
-
λ是事件发生的速率
-
t是时间间隔的长
-
X是该时间间隔内的事件数。
-
其中,X称为泊松随机变量,X的概率分布称为泊松分布。
-
令μ表示长度为t的间隔中的平均事件数。那么,µ = λ*t。
例如说一个医院中,每个病人来看病都是随机并独立的概率,则该医院一天(或者其他特定时间段,一小时,一周等等)接纳的病人总数可以看做是一个服从poisson分布的随机变量。但是为什么可以这样处理呢?我个人认为最好的解释方法是从poisson的两种不同定义上着手。Poisson分布的第一个定义是一个随机变量X, 只能取值非负整数(x=0,1,2,…),且相应的概率为,则该变量称为服从poisson分布。
这个定义就是我们平时考试或者理论工作时用的poisson随机变量的定义。注意Poisson还有一个知名度比较小的第二个定义,或者说是Poisson Process的定义:假定一个事件在一段时间内随机发生,且符合以下条件:
- (1)将该时间段无限分隔成若干个小的时间段,在这个接近于零的小时间段里,该事件发生一次的概率与这个极小时间段的长度成正比。
- (2)在每一个极小时间段内,该事件发生两次及以上的概率恒等于零。
- (3)该事件在不同的小时间段里,发生与否相互独立。
则该事件称为poisson process。这个第二定义就更加利于大家理解了,回到医院的例子之中,如果我们把一天分成24个小时,或者24x60分钟,或者24x3600秒。时间分的越短,这个时间段里来病人的概率就越小(比如说医院在正午12点到正午12点又一毫秒之间来病人的概率是不是很接近于零?)。 条件一符合。另外如果我们把时间分的很细很细,是不是同时来两个病人(或者两个以上的病人)就是不可能的事件?即使两个病人同时来,也总有一个人先迈步子跨进医院大门吧。条件二也符合。倒是条件三的要求比较苛刻。应用到实际例子中就是说病人们来医院的概率必须是相互独立的,如果不是,则不能看作是poisson分布。
公式
f
(
x
∣
λ
)
=
λ
x
e
−
λ
x
!
f(x|\lambda) = \frac{\lambda^{x}e^{-\lambda}}{x!}
f(x∣λ)=x!λxe−λ
where
λ
\lambda
λ denotes the mean of the distribution.
泊松分布就是描述某段时间内,事件具体的发生概率。
上面就是泊松分布的公式。等号的左边,P 表示概率,N表示某种函数关系,t 表示时间,n 表示数量。等号的右边,λ 表示事件的频率。

# 设置图表的大小为宽 14 英寸,高 7 英寸
plt.rcParams["figure.figsize"] = (14, 7)
# 设置图表的分辨率为 100 dpi
plt.figure(dpi=100)
# 概率质量函数(PMF)
# 绘制泊松分布的概率质量函数柱状图
# x 轴为从 0 到 19 的整数,使用 np.arange(20) 生成
# 高度为参数 mu = 5 的泊松分布在这些整数上的概率质量值,使用 stats.poisson.pmf 计算
# 柱子宽度为 0.75,透明度为 0.75
plt.bar(x=np.arange(20),
height=(stats.poisson.pmf(np.arange(20), mu=5)),
width=.75,
alpha=0.75
)
# 累积分布函数(CDF)
# 绘制泊松分布的累积分布函数折线图
# x 轴为从 0 到 19 的整数,使用 np.arange(20) 生成
# y 轴为参数 mu = 5 的泊松分布在这些整数上的累积分布值,使用 stats.poisson.cdf 计算
# 折线颜色为 "#fc4f30"
plt.plot(np.arange(20),
stats.poisson.cdf(np.arange(20), mu=5),
color="#fc4f30",
)
# 图例
# 在图表上添加概率质量函数的图例,设置位置、透明度、字体加粗和颜色
plt.text(x=8, y=.45, s="概率质量函数 (归一化)", alpha=.75, weight="bold", color="#008fd5")
# 在图表上添加累积分布函数的图例,设置位置、透明度、字体加粗和颜色
plt.text(x=8.5, y=.9, s="累积分布函数", alpha=.75, weight="bold", color="#fc4f30")
# 刻度
# 设置 x 轴的刻度,从 0 到 20,间隔为 2
plt.xticks(range(21)[::2])
# 设置图表坐标轴主要刻度的标签大小为 18
plt.tick_params(axis = 'both', which = 'major', labelsize = 18)
# 绘制一条水平参考线,y 坐标为 0.005,颜色为黑色,线宽为 1.3,透明度为 0.7
plt.axhline(y = 0.005, color = 'black', linewidth = 1.3, alpha = .7)
# 标题、副标题和页脚
# 添加主标题,设置位置、内容、字体大小、加粗和透明度
plt.text(x = -2.5, y = 1.25, s = "泊松分布 - 概述",
fontsize = 26, weight = 'bold', alpha = .75)
# 添加副标题,设置位置、内容、字体大小和透明度
plt.text(x = -2.5, y = 1.1,
s = '下图展示了参数 $ \lambda = 5 $ 的泊松分布随机变量 $ y \sim Poi(\lambda) $ 的归一化概率质量函数 (pmf) 和累积分布函数 (cdf)。',
fontsize = 19, alpha = .85)
Parameters
# 导入 SciPy 库的 stats 模块
# 该模块提供了丰富的统计函数和概率分布对象,可用于执行各种统计分析任务
# 例如,使用 stats.poisson.pmf 计算泊松分布的概率质量函数,使用 stats.poisson.cdf 计算累积分布函数
import scipy.stats as stats
# 导入 Matplotlib 库的 pyplot 模块
# 它是一个功能强大的绘图工具,支持创建各种静态、交互式的图表,如折线图、柱状图等
# 在本代码中,用于绘制泊松分布的概率质量函数和累积分布函数的图表
import matplotlib.pyplot as plt
# 导入 Matplotlib 的 style 模块
# 此模块允许用户设置不同的绘图风格,可轻松改变图表的外观,使图表更加美观
# 本代码中使用 'fivethirtyeight' 风格来绘制图表
import matplotlib.style as style
# 从 IPython 的核心显示模块导入 HTML 类
# 在 IPython 环境中,可以使用该类显示自定义的 HTML 内容,例如设置图表的显示样式
# 不过在本代码中未实际使用 HTML 类来设置样式
from IPython.core.display import HTML
# 设置 matplotlib 支持中文显示
# 设置 matplotlib 使用黑体字体来显示中文,可根据系统中实际安装的字体进行修改
# 若系统中没有 SimHei 字体,需要替换为其他支持中文的字体,如 'Microsoft YaHei' 等
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决 matplotlib 中负号显示为方块的问题
# 确保在图表中负号能够正常显示,避免出现乱码
plt.rcParams['axes.unicode_minus'] = False
# 绘图配置
# 在 Jupyter Notebook 中,使绘图结果直接显示在单元格下方
%matplotlib inline
# 使用 'fivethirtyeight' 风格绘制图表,该风格具有特定的视觉效果
style.use('fivethirtyeight')
# 设置图表的分辨率为 100 dpi
plt.figure(dpi=100)
# 绘制 λ = 1 时泊松分布的概率密度函数(PDF)
# 绘制散点图
plt.scatter(
# x 轴数据,为 0 到 19 的整数
np.arange(20),
# y 轴数据,为 λ = 1 时泊松分布的概率质量函数值
(stats.poisson.pmf(np.arange(20), mu=1)),
# 透明度
alpha=0.75,
# 散点大小
s=100
)
# 绘制折线图
plt.plot(
# x 轴数据,为 0 到 19 的整数
np.arange(20),
# y 轴数据,为 λ = 1 时泊松分布的概率质量函数值
(stats.poisson.pmf(np.arange(20), mu=1)),
# 透明度
alpha=0.75
)
# 绘制 λ = 5 时泊松分布的概率密度函数(PDF)
# 绘制散点图
plt.scatter(
# x 轴数据,为 0 到 19 的整数
np.arange(20),
# y 轴数据,为 λ = 5 时泊松分布的概率质量函数值
(stats.poisson.pmf(np.arange(20), mu=5)),
# 透明度
alpha=0.75,
# 散点大小
s=100
)
# 绘制折线图
plt.plot(
# x 轴数据,为 0 到 19 的整数
np.arange(20),
# y 轴数据,为 λ = 5 时泊松分布的概率质量函数值
(stats.poisson.pmf(np.arange(20), mu=5)),
# 透明度
alpha=0.75
)
# 绘制 λ = 10 时泊松分布的概率密度函数(PDF)
# 绘制散点图
plt.scatter(
# x 轴数据,为 0 到 19 的整数
np.arange(20),
# y 轴数据,为 λ = 10 时泊松分布的概率质量函数值
(stats.poisson.pmf(np.arange(20), mu=10)),
# 透明度
alpha=0.75,
# 散点大小
s=100
)
# 绘制折线图
plt.plot(
# x 轴数据,为 0 到 19 的整数
np.arange(20),
# y 轴数据,为 λ = 10 时泊松分布的概率质量函数值
(stats.poisson.pmf(np.arange(20), mu=10)),
# 透明度
alpha=0.75
)
# 添加图例
# 添加 λ = 1 的图例
plt.text(
# x 坐标
x=3,
# y 坐标
y=.1,
# 图例文本
s="$\lambda = 1$",
# 透明度
alpha=.75,
# 旋转角度
rotation=-65,
# 字体加粗
weight="bold",
# 颜色
color="#008fd5"
)
# 添加 λ = 5 的图例
plt.text(
# x 坐标
x=8.25,
# y 坐标
y=.075,
# 图例文本
s="$\lambda = 5$",
# 透明度
alpha=.75,
# 旋转角度
rotation=-35,
# 字体加粗
weight="bold",
# 颜色
color="#fc4f30"
)
# 添加 λ = 10 的图例
plt.text(
# x 坐标
x=14.5,
# y 坐标
y=.06,
# 图例文本
s="$\lambda = 10$",
# 透明度
alpha=.75,
# 旋转角度
rotation=-20,
# 字体加粗
weight="bold",
# 颜色
color="#e5ae38"
)
# 设置刻度
# 设置 x 轴刻度,为 0 到 20 之间间隔为 2 的整数
plt.xticks(range(21)[::2])
# 设置坐标轴主要刻度的标签大小为 18
plt.tick_params(axis='both', which='major', labelsize=18)
# 绘制 y = 0 的水平线,作为参考线
plt.axhline(y=0, color='black', linewidth=1.3, alpha=.7)
# 设置标题、副标题和页脚
# 设置主标题
plt.text(
# x 坐标
x=-2.5,
# y 坐标
y=.475,
# 标题文本
s="泊松分布 - $\lambda$",
# 字体大小
fontsize=26,
# 字体加粗
weight='bold',
# 透明度
alpha=.75
)
# 设置副标题
plt.text(
# x 坐标
x=-2.5,
# y 坐标
y=.425,
# 副标题文本
s='下面展示了三个不同 $\lambda$ 值的泊松分布随机变量。可以很容易地看到,参数 $\lambda$ 会使分布发生平移和展宽($\lambda$ 越小,函数越尖锐)。',
# 字体大小
fontsize=19,
# 透明度
alpha=.85
)
绘制 λ \lambda λ
from collections import Counter
import numpy as np # 补充导入 numpy,代码中使用了 np
# 导入 SciPy 库的 stats 模块
# 该模块提供了丰富的统计函数和概率分布对象,可用于执行各种统计分析任务
# 例如,使用 stats.poisson.pmf 计算泊松分布的概率质量函数,使用 stats.poisson.cdf 计算累积分布函数
import scipy.stats as stats
# 导入 Matplotlib 库的 pyplot 模块
# 它是一个功能强大的绘图工具,支持创建各种静态、交互式的图表,如折线图、柱状图等
# 在本代码中,用于绘制泊松分布的概率质量函数和累积分布函数的图表
import matplotlib.pyplot as plt
# 导入 Matplotlib 的 style 模块
# 此模块允许用户设置不同的绘图风格,可轻松改变图表的外观,使图表更加美观
# 本代码中使用 'fivethirtyeight' 风格来绘制图表
import matplotlib.style as style
# 从 IPython 的核心显示模块导入 HTML 类
# 在 IPython 环境中,可以使用该类显示自定义的 HTML 内容,例如设置图表的显示样式
# 不过在本代码中未实际使用 HTML 类来设置样式
from IPython.core.display import HTML
# 设置 matplotlib 支持中文显示
# 设置 matplotlib 使用黑体字体来显示中文,可根据系统中实际安装的字体进行修改
# 若系统中没有 SimHei 字体,需要替换为其他支持中文的字体,如 'Microsoft YaHei' 等
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决 matplotlib 中负号显示为方块的问题
# 确保在图表中负号能够正常显示,避免出现乱码
plt.rcParams['axes.unicode_minus'] = False
# 设置绘图风格
style.use('fivethirtyeight')
# 设置图形分辨率
plt.figure(dpi=100)
##### 计算部分 #####
# 声明样本背后的“真实”参数
lambda_real = 7
# 抽取一个大小为 N=1000 的样本
np.random.seed(42)
# 从泊松分布中生成样本
sample = stats.poisson.rvs(mu=lambda_real, size=1000)
# 估计参数 λ
lambda_est = np.mean(sample)
print("估计的 λ 值: {}".format(lambda_est))
##### 绘图部分 #####
# 样本分布
# 统计样本中每个值出现的次数
cnt = Counter(sample)
# 对计数值进行排序并提取值
_, values = zip(*sorted(cnt.items()))
# 绘制样本分布的柱状图
plt.bar(range(len(values)), values/np.sum(values), alpha=0.25)
# 真实曲线
# 绘制真实的泊松分布曲线
plt.plot(range(18), stats.poisson.pmf(k=range(18), mu=lambda_real), color="#fc4f30")
# 估计曲线
# 绘制估计的泊松分布曲线
plt.plot(range(18), stats.poisson.pmf(k=range(18), mu=lambda_est), color="#e5ae38")
# 图例
# 添加样本图例
plt.text(x=6, y=.06, s="样本", alpha=.75, weight="bold", color="#008fd5")
# 添加真实分布图例
plt.text(x=3.5, y=.14, s="真实分布", rotation=60, alpha=.75, weight="bold", color="#fc4f30")
# 添加估计分布图例
plt.text(x=1, y=.08, s="估计分布", rotation=60, alpha=.75, weight="bold", color="#e5ae38")
# 刻度
# 设置 x 轴刻度
plt.xticks(range(17)[::2])
# 设置坐标轴刻度字体大小
plt.tick_params(axis = 'both', which = 'major', labelsize = 18)
# 绘制水平参考线
plt.axhline(y = 0.0009, color = 'black', linewidth = 1.3, alpha = .7)
# 标题、副标题和页脚
# 添加主标题
plt.text(x = -2.5, y = 0.19, s = "泊松分布 - 参数估计",
fontsize = 26, weight = 'bold', alpha = .75)
# 添加副标题
plt.text(x = -2.5, y = 0.17,
s = '下面展示了从参数 $\lambda = 7$ 的泊松分布中抽取的样本(蓝色)的分布。\n同时也展示了参数 $\lambda \sim {:.3f}$ 的估计分布(黄色)。'.format(np.mean(sample)),
fontsize = 19, alpha = .85)
# 显示图形
plt.show()