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

请添加图片描述
在这里插入图片描述



前面python的基础内容算是完成了,接下来将要进入机器学习部分了。

具体的专栏内容请参考:

人工智能专栏


4.2 假设检验

假设检验是统计推断的重要方法,用于判断关于总体参数的假设是否成立。

4.2.1 假设检验的基本原理

理论推导

  1. 建立假设:
  • 原假设(H₀):通常是 “无效应” 或 “无差异” 的假设

  • 备择假设(H₁):与原假设相反的假设

  1. 计算检验统计量:
  • t 检验: t = X ˉ − μ 0 S / n t = \frac{\bar{X} - \mu_0}{S/\sqrt{n}} t=S/n Xˉμ0

  • z 检验: z = X ˉ − μ 0 σ / n z = \frac{\bar{X} - \mu_0}{\sigma/\sqrt{n}} z=σ/n Xˉμ0

  1. 确定 p 值:在 H₀为真时,得到当前或更极端结果的概率

护理案例

检验青少年抑郁症患者的平均 HAMD 评分是否显著高于正常人群(正常人群均值为 10 分)。

4.2.2 常用假设检验方法

理论推导

  1. 单样本 t 检验:检验样本均值是否等于某个值

  2. 两样本 t 检验:比较两个样本的均值差异

  3. 卡方检验:检验分类变量之间的关联性

护理案例

  • 比较药物治疗组和安慰剂组的治疗效果差异

  • 分析性别与抑郁症发病的关系

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 要点回顾

掌握以下核心知识:

  1. 线性代数
  • 向量的定义、运算(加法、数乘、点积)

  • 矩阵的定义、运算(加法、乘法、转置)

  • 特征值与特征向量的概念及在数据降维中的应用

  1. 概率论
  • 常见概率分布(二项分布、正态分布、泊松分布)

  • 随机变量的数字特征(期望、方差、协方差)

  • 贝叶斯定理及其在护理诊断中的应用

  1. 数理统计
  • 参数估计(点估计、区间估计)

  • 假设检验(t 检验、卡方检验、ANOVA)

5.2扩展学习建议

  1. 阅读推荐教材:
  • 《概率论与数理统计》(浙大版)

  • 《线性代数》(同济版)

  • 《Python 数据分析实战》

  1. 补充学习资源:
  • 3Blue1Brown 的线性代数可视化视频

  • Khan Academy 的概率统计课程

  • Kaggle 上的护理相关数据集

  1. 实践项目建议:
  • 分析真实的青少年抑郁症数据集

  • 构建简单的护理诊断模型

  • 探索不同机器学习算法的数学原理

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐