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

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



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

具体的专栏内容请参考:

人工智能专栏


一、概述

1.1 目标

通过本章将掌握机器学习算法所需的核心数学基础,包括线性代数、概率论和数理统计三大板块。为后续机器学习算法学习和实践应用奠定坚实基础。

1.2 内容与安排

内容分配重点
线性代数基础(向量、矩阵运算)2 学时向量运算、矩阵乘法、转置
线性代数进阶(特征值与特征向量)1 学时特征值分解、护理数据降维
概率论基础(概率分布、随机变量)1.5 学时正态分布、二项分布、期望方差
概率论进阶(贝叶斯定理)0.5 学时贝叶斯推断、护理诊断应用
数理统计(参数估计、假设检验)1 学时参数估计、t 检验、卡方检验

1.3 方法

采用 “理论推导 + 护理案例 + PyCharm 实操” 三位一体的模式。每个数学概念先进行理论推导,然后通过护理案例帮助理解实际意义,最后通过 PyCharm 操作。

二、线性代数基础

2.1 向量与向量运算

2.1.1 向量的定义与表示

向量是机器学习中最基本的数据结构之一,在护理领域有着广泛应用。在数学上,向量是具有大小和方向的量。在 PyCharm 中,我们可以使用 NumPy 库来表示和操作向量。

理论推导

n 维向量的数学定义为:

v = [ v 1 v 2 ⋮ v n ] \mathbf{v} = \begin{bmatrix} v_1 \\ v_2 \\ \vdots \\ v_n \end{bmatrix} v= v1v2vn

在护理研究中,每个患者的多维度评估数据可以表示为一个向量。例如,使用汉密尔顿抑郁量表(HAMD)评估青少年抑郁症患者时,17 个项目的评分可以构成一个 17 维向量。

PyCharm 操作


import numpy as np

# 创建一个17维的HAMD评分向量(模拟数据)
hamd_scores = np.array([2, 3, 1, 2, 1, 3, 2, 1, 2, 3, 1, 0, 2, 1, 3, 2, 1])
print("HAMD评分向量:")
print(hamd_scores)
print(f"向量维度:{hamd_scores.ndim}")
print(f"向量长度:{len(hamd_scores)}")

在这里插入图片描述

2.1.2 向量的基本运算

向量运算包括加法、数乘、点积等操作,这些运算在护理数据处理中经常用到。

理论推导

设向量 u = [ u 1 u 2 ⋮ u n ] \mathbf{u} = \begin{bmatrix} u_1 \\ u_2 \\ \vdots \\ u_n \end{bmatrix} u= u1u2un v = [ v 1 v 2 ⋮ v n ] \mathbf{v} = \begin{bmatrix} v_1 \\ v_2 \\ \vdots \\ v_n \end{bmatrix} v= v1v2vn ,则:

  1. 向量加法: u + v = [ u 1 + v 1 u 2 + v 2 ⋮ u n + v n ] \mathbf{u} + \mathbf{v} = \begin{bmatrix} u_1 + v_1 \\ u_2 + v_2 \\ \vdots \\ u_n + v_n \end{bmatrix} u+v= u1+v1u2+v2un+vn

  2. 数乘运算: k u = [ k u 1 k u 2 ⋮ k u n ] k\mathbf{u} = \begin{bmatrix} ku_1 \\ ku_2 \\ \vdots \\ ku_n \end{bmatrix} ku= ku1ku2kun

  3. 点积运算: u ⋅ v = u 1 v 1 + u 2 v 2 + ⋯ + u n v n \mathbf{u} \cdot \mathbf{v} = u_1v_1 + u_2v_2 + \dots + u_nv_n uv=u1v1+u2v2++unvn

护理案例

计算两名青少年抑郁症患者的平均症状评分:

  • 患者 A 的 HAMD 向量: a = [ 2 , 3 , 1 , 2 , 1 , 3 , 2 , 1 , 2 , 3 , 1 , 0 , 2 , 1 , 3 , 2 , 1 ] \mathbf{a} = [2, 3, 1, 2, 1, 3, 2, 1, 2, 3, 1, 0, 2, 1, 3, 2, 1] a=[2,3,1,2,1,3,2,1,2,3,1,0,2,1,3,2,1]

  • 患者 B 的 HAMD 向量: b = [ 3 , 2 , 2 , 1 , 2 , 2 , 3 , 1 , 1 , 2 , 2 , 1 , 1 , 2 , 2 , 1 , 2 ] \mathbf{b} = [3, 2, 2, 1, 2, 2, 3, 1, 1, 2, 2, 1, 1, 2, 2, 1, 2] b=[3,2,2,1,2,2,3,1,1,2,2,1,1,2,2,1,2]

平均评分向量: a + b 2 \frac{\mathbf{a} + \mathbf{b}}{2} 2a+b

PyCharm 操作

# 向量运算示例
patient_a = np.array([2, 3, 1, 2, 1, 3, 2, 1, 2, 3, 1, 0, 2, 1, 3, 2, 1])
patient_b = np.array([3, 2, 2, 1, 2, 2, 3, 1, 1, 2, 2, 1, 1, 2, 2, 1, 2])

# 向量加法
sum_vector = patient_a + patient_b
print("向量加法结果:")
print(sum_vector)

# 向量平均
avg_vector = sum_vector / 2
print("\n平均评分向量:")
print(avg_vector)

# 向量点积(计算相似度)
dot_product = np.dot(patient_a, patient_b)
print(f"\n向量点积:{dot_product}")

# 向量范数(L2范数)
norm_a = np.linalg.norm(patient_a)
norm_b = np.linalg.norm(patient_b)
print(f"患者A向量范数:{norm_a:.2f}")
print(f"患者B向量范数:{norm_b:.2f}")

# 余弦相似度
cosine_similarity = dot_product / (norm_a * norm_b)
print(f"余弦相似度:{cosine_similarity:.4f}")

在这里插入图片描述

2.2 矩阵与矩阵运算

2.2.1 矩阵的定义与性质

矩阵是由数值排列成的矩形阵列,在机器学习中用于表示结构化数据。在护理研究中,多个患者的多维度评估数据可以组织成矩阵形式。

理论推导

m×n 矩阵的数学定义为:

A = [ a 11 a 12 … a 1 n a 21 a 22 … a 2 n ⋮ ⋮ ⋱ ⋮ a m 1 a m 2 … a m n ] \mathbf{A} = \begin{bmatrix} a_{11} & a_{12} & \dots & a_{1n} \\ a_{21} & a_{22} & \dots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & \dots & a_{mn} \end{bmatrix} A= a11a21am1a12a22am2a1na2namn

矩阵的基本性质包括:

  1. 矩阵加法: A + B = [ a i j + b i j ] m × n \mathbf{A} + \mathbf{B} = [a_{ij} + b_{ij}]_{m \times n} A+B=[aij+bij]m×n

  2. 数乘运算: k A = [ k a i j ] m × n k\mathbf{A} = [ka_{ij}]_{m \times n} kA=[kaij]m×n

  3. 矩阵转置: ( A T ) i j = a j i (\mathbf{A}^T)_{ij} = a_{ji} (AT)ij=aji

护理案例

假设有 100 名青少年抑郁症患者,每人进行了 17 项 HAMD 评估,这些数据可以构成一个 100×17 的矩阵。矩阵的每一行代表一名患者,每一列代表一个评估项目。

PyCharm 操作

# 创建患者评估矩阵
np.random.seed(42)  # 设置随机种子确保结果可重现
n_patients = 100
n_items = 17
# 生成0-3之间的随机整数(HAMD评分范围)
patient_matrix = np.random.randint(0, 4, size=(n_patients, n_items))
print("患者评估矩阵(前5行):")
print(patient_matrix[:5])
print(f"矩阵形状:{patient_matrix.shape}")
print(f"矩阵维度:{patient_matrix.ndim}")

# 矩阵转置
patient_matrix_T = patient_matrix.T
print(f"\n矩阵转置后形状:{patient_matrix_T.shape}")
print("转置矩阵前5行(项目×患者):")
print(patient_matrix_T[:5, :5])  # 显示前5个项目,前5名患者

在这里插入图片描述

2.2.2 矩阵的基本运算

矩阵运算包括加法、数乘、乘法等,这些运算在机器学习算法中频繁使用。

理论推导

  1. 矩阵加法: A + B = [ a i j + b i j ] m × n \mathbf{A} + \mathbf{B} = [a_{ij} + b_{ij}]_{m \times n} A+B=[aij+bij]m×n(要求 A 和 B 同型)

  2. 矩阵乘法: C = A B \mathbf{C} = \mathbf{A} \mathbf{B} C=AB,其中 c i j = ∑ k = 1 n a i k b k j c_{ij} = \sum_{k=1}^{n} a_{ik}b_{kj} cij=k=1naikbkj(要求 A 的列数等于 B 的行数)

护理案例

计算不同性别患者的平均症状评分。假设有一个患者信息矩阵,包含性别(0/1)和 HAMD 评分,我们可以通过矩阵运算快速计算。

PyCharm 操作

# 矩阵运算示例
# 创建患者信息矩阵(性别、年龄、HAMD总分)
patient_info = np.array([
    [0, 15, 25],  # 女性,15岁,HAMD总分25
    [1, 16, 22],  # 男性,16岁,HAMD总分22
    [0, 14, 28],  # 女性,14岁,HAMD总分28
    [1, 17, 20],  # 男性,17岁,HAMD总分20
    [0, 16, 26]   # 女性,16岁,HAMD总分26
])

# 计算性别分组的统计信息
female_mask = (patient_info[:, 0] == 0)  # 女性掩码
male_mask = (patient_info[:, 0] == 1)    # 男性掩码

female_patients = patient_info[female_mask]
male_patients = patient_info[male_mask]

print("女性患者信息:")
print(female_patients)
print(f"女性患者数量:{len(female_patients)}")
print(f"女性平均年龄:{np.mean(female_patients[:, 1]):.1f}岁")
print(f"女性平均HAMD评分:{np.mean(female_patients[:, 2]):.1f}")

print("\n男性患者信息:")
print(male_patients)
print(f"男性患者数量:{len(male_patients)}")
print(f"男性平均年龄:{np.mean(male_patients[:, 1]):.1f}岁")
print(f"男性平均HAMD评分:{np.mean(male_patients[:, 2]):.1f}")

# 矩阵乘法示例
# 创建一个权重向量(各HAMD项目权重)
weights = np.array([0.8, 0.7, 0.9, 0.6, 0.7, 0.8, 0.6, 0.9, 0.7, 0.8, 0.6, 0.5, 0.7, 0.6, 0.8, 0.7, 0.6])
weights = weights.reshape(-1, 1)  # 转换为列向量

# 计算加权总分(前5名患者)
weighted_scores = patient_matrix[:5] @ weights  # 矩阵乘法
print("\n前5名患者的加权HAMD总分:")
print(weighted_scores)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 特征值与特征向量

特征值与特征向量是线性代数中的重要概念,在机器学习的主成分分析(PCA)等算法中有着广泛应用。

2.3.1 特征值与特征向量的定义

理论推导

对于 n×n 矩阵 A \mathbf{A} A,如果存在非零向量 v \mathbf{v} v和标量 λ \lambda λ,使得:

A v = λ v \mathbf{A}\mathbf{v} = \lambda\mathbf{v} Av=λv

λ \lambda λ称为矩阵 A \mathbf{A} A的特征值, v \mathbf{v} v称为对应的特征向量。

特征方程: ∣ A − λ I ∣ = 0 |\mathbf{A} - \lambda\mathbf{I}| = 0 AλI=0

护理案例

在青少年抑郁症研究中,我们可能需要分析不同症状之间的相关性。通过计算协方差矩阵的特征值和特征向量,可以找出主要的症状模式。

2.3.2 特征值分解在护理数据降维中的应用

特征值分解可以将矩阵分解为特征值和特征向量的乘积,这在数据降维中非常有用。

理论推导

对于对称矩阵 A \mathbf{A} A,可以分解为:

A = Q Λ Q T \mathbf{A} = \mathbf{Q}\boldsymbol{\Lambda}\mathbf{Q}^T A=QΛQT

其中 Q \mathbf{Q} Q是正交矩阵, Λ \boldsymbol{\Lambda} Λ是对角矩阵。

护理案例

通过特征值分解,可以将 17 维的 HAMD 评分向量降维到 2-3 维,提取主要的症状模式(如核心抑郁症状、焦虑症状等)。

PyCharm 操作

import numpy as np

# 创建一个简化的症状相关矩阵(基于真实研究数据)
# 假设我们有5个主要症状:抑郁情绪、睡眠障碍、食欲改变、疲劳、注意力集中困难
symptom_names = ['抑郁情绪', '睡眠障碍', '食欲改变', '疲劳', '注意力集中困难']
correlation_matrix = np.array([
    [1.0, 0.6, 0.5, 0.7, 0.6],
    [0.6, 1.0, 0.4, 0.5, 0.5],
    [0.5, 0.4, 1.0, 0.3, 0.4],
    [0.7, 0.5, 0.3, 1.0, 0.6],
    [0.6, 0.5, 0.4, 0.6, 1.0]
])

print("症状相关矩阵:")
print(correlation_matrix)

# 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(correlation_matrix)

# 按特征值大小排序
idx = eigenvalues.argsort()[::-1]  # 降序排列
eigenvalues_sorted = eigenvalues[idx]
eigenvectors_sorted = eigenvectors[:, idx]

print("\n排序后的特征值:")
for i, val in enumerate(eigenvalues_sorted):
    print(f"特征值{val:.3f}(占总方差{val/sum(eigenvalues_sorted)*100:.1f}%)")

print("\n对应的特征向量(列向量):")
print(eigenvectors_sorted)

# 分析主要特征向量(第一主成分)
print("\n第一主成分(解释方差最大):")
pc1 = eigenvectors_sorted[:, 0]
for i, name in enumerate(symptom_names):
    print(f"{name}权重:{pc1[i]:.3f}")

# 数据降维示例
# 使用前2个主成分进行降维
n_components = 2
reduced_matrix = patient_matrix @ eigenvectors_sorted[:, :n_components]
print(f"\n前5名患者降维后的数据({n_components}维):")
print(reduced_matrix[:5])

# 重构原始数据(近似)
reconstructed_matrix = reduced_matrix @ eigenvectors_sorted[:, :n_components].T
print(f"\n重构后的数据(前5名患者):")
print(reconstructed_matrix[:5])

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Logo

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

更多推荐