人工智能之数学基础 概率论与统计
第四章 统计量----公式关注公众号
文章目录
- 人工智能之数学基础 概率论与统计
- 前言
- 一、统计推断基础
- 1. 总体 vs 样本
- 2. 统计量(Statistic)
- 3. 抽样分布(Sampling Distribution)
- 二、1. 置信区间(Confidence Interval, CI)
- ✅ 核心思想
- 📌 构造步骤(以总体均值为例)
- 情况1:总体方差已知(或大样本)
- 情况2:总体方差未知(小样本,且总体正态)
- 💻 Python 实现:均值的置信区间
- 🔁 模拟验证:置信区间的覆盖率
- 三、2. 假设检验(Hypothesis Testing)
- ✅ 核心思想
- 📌 基本步骤
- 📊 两类错误
- 🧪 常见检验类型
- 💻 Python 实现:单样本 t 检验
- 💻 两样本 t 检验:A/B 测试
- 💻 卡方检验:分类变量独立性
- 四、置信区间 vs 假设检验的关系
- 五、常见误区与最佳实践
- 六、进阶:使用 `statsmodels` 进行回归中的假设检验
- 七、总结
- 后续
- 资料关注
前言
在获得样本数据后,我们常需对总体参数做出推断。置信区间(Confidence Interval)和假设检验(Hypothesis Testing)是统计推断的两大支柱。本文将系统讲解其原理、步骤、常见误区,并提供完整的Python(SciPy / statsmodels)代码实现与可视化。
一、统计推断基础
1. 总体 vs 样本
- 总体(Population):研究对象的全体(如全国成年男性身高)
- 样本(Sample):从总体中抽取的部分观测(如 1000 名男性身高)
2. 统计量(Statistic)
样本的函数,不含未知参数,用于估计或检验。
例如:样本均值 $ \bar{X} $、样本方差 $ S^2 $
3. 抽样分布(Sampling Distribution)
统计量的概率分布(如 $ \bar{X} $ 的分布)。
中心极限定理(CLT)保证:大样本下 $ \bar{X} \approx \mathcal{N}(\mu, \sigma^2/n) $
二、1. 置信区间(Confidence Interval, CI)
✅ 核心思想
用一个区间来估计未知参数,并给出该区间包含真值的“可信程度”。
形式:$ [\hat{\theta}_L, \hat{\theta}_U] $,置信水平 $ 1 - \alpha $(如 95%)
❗ 重要理解:
“95% 置信” ≠ “参数有 95% 概率落在该区间”(参数是固定值!)
而是:重复抽样 100 次,约有 95 个区间会包含真值。
📌 构造步骤(以总体均值为例)
情况1:总体方差已知(或大样本)
统计量:$ Z = \frac{\bar{X} - \mu}{\sigma / \sqrt{n}} \sim \mathcal{N}(0,1) $
95% CI:
X ˉ ± z α / 2 ⋅ σ n \bar{X} \pm z_{\alpha/2} \cdot \frac{\sigma}{\sqrt{n}}Xˉ±zα/2⋅nσ其中 $ z_{0.025} \approx 1.96 $
情况2:总体方差未知(小样本,且总体正态)
- 统计量: $T = \frac{\bar{X} - \mu}{S / \sqrt{n}} \sim t_{n-1} $
- 95% CI:
X ˉ ± t α / 2 , n − 1 ⋅ S n \bar{X} \pm t_{\alpha/2, n-1} \cdot \frac{S}{\sqrt{n}}Xˉ±tα/2,n−1⋅nS
💻 Python 实现:均值的置信区间
importnumpyasnpimportscipy.statsasstatsimportmatplotlib.pyplotasplt# 模拟数据:小样本(n=20),总体 ~ N(50, 10²)np.random.seed(42)true_mu,true_sigma=50,10sample=np.random.normal(true_mu,true_sigma,size=20)n=len(sample)sample_mean=np.mean(sample)sample_std=np.std(sample,ddof=1)# 无偏样本标准差# 95% 置信区间(t 分布,因 σ 未知且 n 小)alpha=0.05df=n-1t_critical=stats.t.ppf(1-alpha/2,df)margin_error=t_critical*(sample_std/np.sqrt(n))ci_lower=sample_mean-margin_error ci_upper=sample_mean+margin_errorprint(f"样本均值:{sample_mean:.2f}")print(f"95% 置信区间: [{ci_lower:.2f},{ci_upper:.2f}]")print(f"真实 μ ={true_mu}→{'包含'ifci_lower<=true_mu<=ci_upperelse'不包含'}")# 可视化plt.errorbar(0,sample_mean,yerr=margin_error,fmt='o',capsize=5,label='95% CI')plt.axhline(true_mu,color='r',linestyle='--',label=f'真实 μ ={true_mu}')plt.xticks([])plt.ylabel('均值')plt.title('样本均值的 95% 置信区间')plt.legend()plt.grid(True)plt.show()🔁 模拟验证:置信区间的覆盖率
defsimulate_ci_coverage(mu=50,sigma=10,n=20,alpha=0.05,n_sim=1000):covered=0for_inrange(n_sim):sample=np.random.normal(mu,sigma,n)mean=sample.mean()std=sample.std(ddof=1)t_crit=stats.t.ppf(1-alpha/2,n-1)me=t_crit*std/np.sqrt(n)ifmean-me<=mu<=mean+me:covered+=1returncovered/n_sim coverage=simulate_ci_coverage()print(f"模拟 1000 次,95% CI 的实际覆盖率:{coverage:.3f}(应接近 0.95)")三、2. 假设检验(Hypothesis Testing)
✅ 核心思想
基于样本证据,判断是否拒绝关于总体的某个假设。
📌 基本步骤
提出假设:
- 原假设 $ H_0 $:默认成立(如“新药无效”)
- 备择假设 $ H_1 $:希望证明的结论(如“新药有效”)
选择检验统计量(如 t 统计量、z 统计量)
计算 p 值:
在 $ H_0 $ 成立下,观察到当前样本(或更极端)的概率。
决策:
- 若 $ p \leq \alpha $(显著性水平,如 0.05),拒绝H 0 H_0H0
- 否则,不拒绝 $ H_0 $
⚠️ 注意:
- “不拒绝” ≠ “接受 $H_0 $”
- p 值不是 $ H_0 $ 为真的概率!
📊 两类错误
| $ H_0 $ 为真 | $H_0 $ 为假 | |
|---|---|---|
| 拒绝 $ H_0 $ | 第 I 类错误(α) | 正确(1 - β,功效) |
| 不拒绝$H_0 $ | 正确 | 第 II 类错误(β) |
🧪 常见检验类型
| 场景 | 检验方法 | Python 函数 |
|---|---|---|
| 单样本均值 vs 已知值 | t 检验 | stats.ttest_1samp |
| 两独立样本均值比较 | 独立 t 检验 | stats.ttest_ind |
| 配对样本(前后测) | 配对 t 检验 | stats.ttest_rel |
| 分类变量关联性 | 卡方检验 | stats.chi2_contingency |
| 正态性检验 | Shapiro-Wilk | stats.shapiro |
💻 Python 实现:单样本 t 检验
问题:某厂声称电池平均续航为 100 小时。测试 25 块电池,数据如下,能否质疑该说法?
# 模拟测试数据np.random.seed(0)battery_life=np.random.normal(97,8,size=25)# 真实均值 97 < 100# 假设检验mu0=100# H0: μ = 100t_stat,p_value=stats.ttest_1samp(battery_life,mu0)print(f"样本均值:{battery_life.mean():.2f}")print(f"t 统计量:{t_stat:.3f}")print(f"p 值:{p_value:.4f}")alpha=0.05ifp_value<alpha:print(f"在 α={alpha}水平下,拒绝 H0:电池续航显著低于 100 小时")else:print(f"在 α={alpha}水平下,不拒绝 H0")# 可视化 t 分布与 p 值df=len(battery_life)-1x=np.linspace(-4,4,400)t_dist=stats.t.pdf(x,df)plt.figure(figsize=(8,4))plt.plot(x,t_dist,'b-',label='t 分布 (df=24)')plt.axvline(t_stat,color='r',linestyle='--',label=f't ={t_stat:.2f}')# 阴影 p 值区域(双侧)x_fill=np.linspace(t_stat,4,100)ift_stat>0elsenp.linspace(-4,t_stat,10)plt.fill_between(x_fill,stats.t.pdf(x_fill,df),color='red',alpha=0.3,label=f'p 值 ={p_value:.3f}')plt.xlabel('t 值');plt.ylabel('密度')plt.title('单样本 t 检验:p 值可视化')plt.legend();plt.grid(True)plt.show()💻 两样本 t 检验:A/B 测试
场景:比较两个网页版本的用户停留时间。
# 模拟 A/B 测试数据np.random.seed(1)group_A=np.random.normal(120,30,100)# 均值 120 秒group_B=np.random.normal(130,30,100)# 均值 130 秒# 独立 t 检验(假设方差相等)t_stat,p_value=stats.ttest_ind(group_A,group_B,equal_var=True)print(f"A 组均值:{group_A.mean():.1f}, B 组均值:{group_B.mean():.1f}")print(f"t ={t_stat:.3f}, p ={p_value:.4f}")ifp_value<0.05:print("B 版本显著优于 A 版本 (p < 0.05)")else:print("无显著差异")# 箱线图可视化plt.boxplot([group_A,group_B],labels=['A','B'])plt.ylabel('停留时间 (秒)')plt.title('A/B 测试:用户停留时间')plt.grid(True)plt.show()💻 卡方检验:分类变量独立性
问题:性别与产品偏好是否相关?
# 列联表:行=性别,列=偏好observed=np.array([[60,40],# 男性:喜欢/不喜欢[30,70]])# 女性:喜欢/不喜欢chi2,p,dof,expected=stats.chi2_contingency(observed)print("观测频数:\n",observed)print("期望频数:\n",expected)print(f"χ² ={chi2:.2f}, p ={p:.4f}")ifp<0.05:print("性别与产品偏好显著相关")else:print("无显著关联")四、置信区间 vs 假设检验的关系
二者本质相通!
对于双侧检验 $ H_0: \mu = \mu_0 $ vs $ H_1: \mu \ne \mu_0 $:
拒绝 $ H_0 $ 当且仅当 $ \mu_0 $ 不在 $ 1-\alpha $ 置信区间内
# 验证:用之前的电池数据mu0=100in_ci=(ci_lower<=mu0<=ci_upper)reject_h0=(p_value<0.05)print(f"μ0={mu0}是否在 95% CI 内?{in_ci}")print(f"是否拒绝 H0?{reject_h0}")print(f"二者一致?{in_ci==(notreject_h0)}")# 应为 True五、常见误区与最佳实践
| 误区 | 正确认知 |
|---|---|
| “p = 0.051 和 p = 0.049 差别很大” | p 值是连续的,0.05 是人为阈值 |
| “不显著 = 无差异” | 可能是样本量不足(功效低) |
| “置信区间包含 0 ⇒ 无效应” | 需结合效应量(effect size)判断实际意义 |
| “p 值越小,效应越大” | p 值受样本量和效应量共同影响 |
✅最佳实践:
- 报告效应量(如 Cohen’s d)和置信区间,而非仅 p 值;
- 预先设定显著性水平 $ \alpha $;
- 考虑统计功效(Power Analysis)以确定所需样本量。
六、进阶:使用statsmodels进行回归中的假设检验
importstatsmodels.apiassm# 生成数据np.random.seed(0)X=np.random.randn(100,1)y=2*X.ravel()+np.random.randn(100)*0.5# 添加截距X=sm.add_constant(X)# 拟合线性回归model=sm.OLS(y,X).fit()print(model.summary())输出中:
- coef:参数估计值
- P>|t|:该系数是否显著非零(H₀: β=0)
- [0.025, 0.975]:95% 置信区间
七、总结
| 方法 | 目的 | 输出 | 关键概念 |
|---|---|---|---|
| 置信区间 | 估计参数范围 | 区间 [L, U] | 置信水平、边际误差 |
| 假设检验 | 判断假设是否成立 | p 值、拒绝/不拒绝 | 显著性水平、两类错误 |
💡现代统计建议:
- 优先报告置信区间(提供更多信息);
- 结合效应量判断实际意义;
- 避免“p 值崇拜”,重视实验设计与数据质量。
后续
python过渡项目部分代码已经上传至gitee,后续会逐步更新。
资料关注
公众号:咚咚王
gitee:https://gitee.com/wy18585051844/ai_learning
《Python编程:从入门到实践》
《利用Python进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第3版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow机器学习实战指南》
《Sklearn与TensorFlow机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第2版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨+&+张孜铭
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战AI大模型》
《AI 3.0》