第二章 机器学习基础理论 - 数学基础(四)
第二章 机器学习基础理论 - 数学基础


文章目录
前面python的基础内容算是完成了,接下来将要进入机器学习部分了。
具体的专栏内容请参考:
人工智能专栏
4.2 假设检验
假设检验是统计推断的重要方法,用于判断关于总体参数的假设是否成立。
4.2.1 假设检验的基本原理
理论推导:
- 建立假设:
-
原假设(H₀):通常是 “无效应” 或 “无差异” 的假设
-
备择假设(H₁):与原假设相反的假设
- 计算检验统计量:
-
t 检验: t = X ˉ − μ 0 S / n t = \frac{\bar{X} - \mu_0}{S/\sqrt{n}} t=S/nXˉ−μ0
-
z 检验: z = X ˉ − μ 0 σ / n z = \frac{\bar{X} - \mu_0}{\sigma/\sqrt{n}} z=σ/nXˉ−μ0
- 确定 p 值:在 H₀为真时,得到当前或更极端结果的概率
护理案例:
检验青少年抑郁症患者的平均 HAMD 评分是否显著高于正常人群(正常人群均值为 10 分)。
4.2.2 常用假设检验方法
理论推导:
-
单样本 t 检验:检验样本均值是否等于某个值
-
两样本 t 检验:比较两个样本的均值差异
-
卡方检验:检验分类变量之间的关联性
护理案例:
-
比较药物治疗组和安慰剂组的治疗效果差异
-
分析性别与抑郁症发病的关系
PyCharm 操作:
import numpy as np
from scipy import stats
# 案例1:单样本t检验 - 青少年HAMD评分与正常人群比较
print("案例1:单样本t检验 - 青少年HAMD评分与正常人群比较")
# 正常人群HAMD均值为10分
population_mean = 10
# 基于真实研究数据生成样本
np.random.seed(42)
n_patients = 50
patient_hamd = np.random.normal(18, 5, n_patients)
patient_hamd = np.clip(patient_hamd, 5, 40)
# 计算t统计量
sample_mean = np.mean(patient_hamd)
sample_std = np.std(patient_hamd, ddof=1)
t_statistic = (sample_mean - population_mean) / (sample_std / np.sqrt(n_patients))
df = n_patients - 1
# 计算p值(双侧检验)
p_value = 2 * stats.t.cdf(-abs(t_statistic), df)
print(f"样本均值:{sample_mean:.1f}")
print(f"样本标准差:{sample_std:.1f}")
print(f"t统计量:{t_statistic:.3f}")
print(f"自由度:{df}")
print(f"p值:{p_value:.4f}")
# 决策
alpha = 0.05
if p_value < alpha:
print(f"在{alpha}显著性水平下,拒绝原假设")
print("结论:青少年抑郁症患者的HAMD评分显著高于正常人群")
else:
print(f"在{alpha}显著性水平下,不拒绝原假设")
# 案例2:两样本t检验 - 药物治疗效果比较
print("\n案例2:两样本t检验 - 药物治疗效果比较")
# 生成药物治疗组和安慰剂组数据
np.random.seed(42)
n_drug = 30
n_placebo = 30
# 药物治疗组平均改善更多
drug_improvement = np.random.normal(8, 2, n_drug) # 平均改善8分
placebo_improvement = np.random.normal(5, 2, n_placebo) # 平均改善5分
# 进行t检验
t_stat, p_value = stats.ttest_ind(drug_improvement, placebo_improvement, equal_var=False)
print(f"药物治疗组(n={n_drug}):")
print(f" 平均改善:{np.mean(drug_improvement):.1f}分")
print(f" 标准差:{np.std(drug_improvement, ddof=1):.1f}分")
print(f"安慰剂组(n={n_placebo}):")
print(f" 平均改善:{np.mean(placebo_improvement):.1f}分")
print(f" 标准差:{np.std(placebo_improvement, ddof=1):.1f}分")
print(f"t统计量:{t_stat:.3f}")
print(f"p值:{p_value:.4f}")
# 计算效应量(Cohen's d)
def cohens_d(x1, x2):
"""计算Cohen's d效应量"""
s1, s2 = np.std(x1, ddof=1), np.std(x2, ddof=1)
s_pooled = np.sqrt(((len(x1)-1)*s1**2 + (len(x2)-1)*s2**2) / (len(x1)+len(x2)-2))
return (np.mean(x1) - np.mean(x2)) / s_pooled
d = cohens_d(drug_improvement, placebo_improvement)
print(f"效应量(Cohen's d):{d:.3f}")
print("效应量解释:小(0.2)、中(0.5)、大(0.8)")
# 案例3:配对t检验 - 治疗前后比较
print("\n案例3:配对t检验 - 治疗前后比较")
# 生成治疗前后数据
np.random.seed(42)
n_patients = 40
pre_treatment = np.random.normal(22, 4, n_patients)
post_treatment = pre_treatment - np.random.normal(6, 2, n_patients)
post_treatment = np.clip(post_treatment, 5, 40)
# 进行配对t检验
t_stat, p_value = stats.ttest_rel(pre_treatment, post_treatment)
print("治疗前后比较:")
for i in range(5): # 显示前5名患者
print(f"患者{i+1}:治疗前{pre_treatment[i]:.0f}分 → 治疗后{post_treatment[i]:.0f}分(改善{pre_treatment[i]-post_treatment[i]:.0f}分)")
print(f"\n配对t检验结果:")
print(f"治疗前均值:{np.mean(pre_treatment):.1f}分")
print(f"治疗后均值:{np.mean(post_treatment):.1f}分")
print(f"平均改善:{np.mean(pre_treatment - post_treatment):.1f}分")
print(f"t统计量:{t_stat:.3f}")
print(f"p值:{p_value:.4f}")
# 案例4:卡方检验 - 性别与抑郁症关系
print("\n案例4:卡方检验 - 性别与抑郁症关系")
# 创建列联表
contingency_table = np.array([
[45, 55], # 女性:45人患病,55人正常
[35, 65] # 男性:35人患病,65人正常
])
# 进行卡方检验
chi2_stat, p_value, dof, expected = stats.chi2_contingency(contingency_table)
print("观察频数:")
print(" 患病 正常")
print("女性 45 55")
print("男性 35 65")
print(f"\n卡方统计量:{chi2_stat:.3f}")
print(f"p值:{p_value:.4f}")
print(f"自由度:{dof}")
print("\n期望频数:")
print(expected.astype(int))
# 计算优势比
odds_ratio = (45 * 65) / (55 * 35)
print(f"优势比(OR):{odds_ratio:.3f}")
print(f"解释:女性患抑郁症的风险是男性的{odds_ratio:.1f}倍")
# 案例5:方差分析(ANOVA)- 多种治疗方法比较
print("\n案例5:方差分析(ANOVA)- 多种治疗方法比较")
# 生成三种治疗方法的数据
np.random.seed(42)
n_per_group = 25
methods = ['药物A', '药物B', '心理治疗', '联合治疗']
true_means = [15, 14, 16, 12] # 真实均值(越低越好)
std_dev = 3
# 生成数据
all_groups = []
for mean in true_means:
group = np.random.normal(mean, std_dev, n_per_group)
group = np.clip(group, 5, 30)
all_groups.append(group)
# 进行单因素方差分析
f_stat, p_value = stats.f_oneway(*all_groups)
print("各组治疗效果(HAMD评分,越低越好):")
for i, (method, group) in enumerate(zip(methods, all_groups)):
print(f"{method}(n={n_per_group}):均值{np.mean(group):.1f},标准差{np.std(group, ddof=1):.1f}")
print(f"\nANOVA结果:")
print(f"F统计量:{f_stat:.3f}")
print(f"p值:{p_value:.4f}")
# 事后检验(Tukey HSD)
from scipy.stats import tukey_hsd
tukey_result = tukey_hsd(*all_groups)
print(f"\nTukey HSD事后检验结果:")
print(tukey_result)




五、总结
5.1 要点回顾
掌握以下核心知识:
- 线性代数:
-
向量的定义、运算(加法、数乘、点积)
-
矩阵的定义、运算(加法、乘法、转置)
-
特征值与特征向量的概念及在数据降维中的应用
- 概率论:
-
常见概率分布(二项分布、正态分布、泊松分布)
-
随机变量的数字特征(期望、方差、协方差)
-
贝叶斯定理及其在护理诊断中的应用
- 数理统计:
-
参数估计(点估计、区间估计)
-
假设检验(t 检验、卡方检验、ANOVA)
5.2扩展学习建议
- 阅读推荐教材:
-
《概率论与数理统计》(浙大版)
-
《线性代数》(同济版)
-
《Python 数据分析实战》
- 补充学习资源:
-
3Blue1Brown 的线性代数可视化视频
-
Khan Academy 的概率统计课程
-
Kaggle 上的护理相关数据集
- 实践项目建议:
-
分析真实的青少年抑郁症数据集
-
构建简单的护理诊断模型
-
探索不同机器学习算法的数学原理
更多推荐



所有评论(0)