Lazy loaded image
🦾机器学习
字数 4805阅读时长 13 分钟
2026-4-21
2026-5-31
By BarryZed
目录

概论

机器学习模型的分类

按学习任务分类

监督学习(Supervised Learning)
训练数据集已经标好标签/分好类
常见任务:分类、回归
无监督学习(Unsupervised Learning)
训练数据集没有标签
常见任务:聚类、降维
半监督学习(Semi-supervised Learning)
用“少量有标签数据 + 大量无标签数据”一起训练模型(现实中标注完数据很贵)
强化学习(Reinforcement Learning)
通过“试错 + 奖励反馈”来学会做决策,目标是“最大化长期累计奖励(Reward)”
没有标准答案,一直优化策略来使得分更高

按模型性质分类

生成式模型(Generative Model)
学习数据怎么生成:先学每个类别长什么样,然后再判断这个样本属于哪个类别
  • 朴素贝叶斯(Naive Bayes)
  • 高斯混合模型(GMM)
  • 隐马尔可夫模型(HMM)
判别式模型(Discriminative Model)
直接学习分类边界 / 后验概率:不管数据怎么生成,只关心怎么分对类别
找到一个或几个点/线/平面/超平面,样本在那个区域里就是哪类,为什么不重要,模型只管找到边界。
  • 逻辑回归(Logistic Regression)
  • 支持向量机(SVM)
  • KNN(严格说是非参数判别)
  • 神经网络(Neural Network)

按输出类型分类

分类(Classification)
预测新样本属于已有的哪一类
监督学习,训练数据有标签
  • KNN
  • SVM
  • 决策树
  • 朴素贝叶斯
  • 逻辑回归
回归(Regression)
预测连续数值。(天气、销量、价格等)
通过已有数据学习输入与输出之间的关系,并预测新的数值结果。
  • 线性回归(Linear Regression)
  • 岭回归(Ridge Regression)
  • Lasso 回归
  • SVR
聚类(Clustering)
将已有的没有标签的样本分类
非监督学习,训练数据没有标签
  • K-Means
  • DBSCAN
  • 层次聚类
降维(Dimensionality Reduction)
用更少的特征表示数据
  • PCA
  • LDA
  • t-SNE
其他目的
  • 异常检测(Anomaly Detection)
  • 推荐系统(Recommendation)
  • 强化学习(Reinforcement Learning)
  • 生成(Generation)
  • 排序(Ranking)
  • 时序预测(Time Series Forecasting)

其他概念

损失函数
课上推导(两个偏导)
notion image
两个圈中=0,左侧w与有下w相等
范数:距离原点的距离
二范数:向量的直线距离

线性回归

目的

预测,找到最优的Wb(ais)

特点

  1. 标准框架:特征→模型→损失函数→优化(梯度下降)→评估(越大越好)
  1. 可解释性强
  1. 有最完善的理论支持

代码

  1. 读数据,规范数据格式
  1. 特征归一化(Normalize)
    1. 特征标准化 = (X - 均值)/标准差
      • 均值:np.mean(X, axis=0)
      • 标准差:np.std(X, axis=0)
      axis=0 指按列求)
  1. 线性预测函数
    1. np.matmul(X, W) + bias
      matmul :matrix multiplication(@
  1. 损失函数
      • np.sum() 可以直接算和(当用就行)
  1. 梯度下降
      • grad_w
      • grad_bias
      • alpha :学习率
      • W = W - alpha * grad_w
      • bias = bias - alpha * grad_b
  1. 训练函数
      • ite 指学习轮数(iteration,迭代次数)
    1. 先给初始值
      1. W = np.random.randn(n, 1) * 0.01W 一个随机值,*0.01 防止过大
        b = 0.1
        alpha = 0.01
    2. 声明costs 来记录每次的损失,来确定学习率是否合适
    3. 开始循环
      1. 先保存当前cost
      2. 进行(5)的梯度下降更新W, bias

L2正则线性回归

  • 损失函数
    • :正则化强度系数()
  • grad_w
  • grad_bias
  • 更新
    • w = w - alpha(grad_w + 2 * lambda * w)

先验

正则
先验分布
L1
拉普拉斯分布
L2
高斯分布

手算

  • 向量(一步一步算)
    • notion image
  • 正规方程解(一步到位最优解)
    • notion image

逻辑回归

“你有多像那一边?”(probability matters)——ChatGPT

二分类

目的

把输入数据分为0和1两类((分割超平面)的两侧),找到最优的(矩阵) 和b
则在1组,反之在0组(就是把放进Sigmoid里和0.5比)

Sigmoid函数

把数据压缩到0~1之间
原函数

//交叉熵损失(Cross Entropy Loss)

梯度下降

  • grad_w
  • grad_b
  • 更新
    • alpha :学习率
    • W = W - alpha * grad_w
    • b = b - alpha * grad_b
  • 更新时不把变为0或1,保留原始值,只有最后与测试再变

手算

notion image

感知机

“你在哪边?”(only side matters)——ChatGPT

二分类

if yi * (np.dot(w, xi) + b) <= 0 :误分类,从头重新算W, b
更新W, b :
w = w + alpha * yi * xib = b + alpha * yi

手算

notion image
  • 某一轮指完全走一遍
    • 例子(4个数)
      • 第一个数错误:更新w1, b1
      • 用w1, b1分第二个数,正确
      • 用w1, b1分第三个数,错误,更新w2, b2
      • 用w2, b2分第四个数,错误,更新w3, b3
      →此时w3, b3则是第一轮的结果
       

Fisher线性判别分析(Linear Discriminant Analysis, LDA)

找一条直线(投影方向 w),让两类数据在这条线上“分得最开”。

代码

  1. 分类
    1. class1, class2 = np.unique(x) :把数组 x 里“所有不重复的值”提取出来,并排序返回
      按照返回值将原数据X 分到X1, X2
  1. 计算类均值
    1. 找到class1, class2 的中心m1, m2 (m1 = np.mean(X1, axis=0))
  1. 计算散度矩阵和类内散度
    1. 散度矩阵:衡量“两个类别中心有多远”,越远越好
      1. 这里是外积(m_diff = m2 - m1; S_b = np.outer(m_diff, m_diff.T)),公式为:
    2. 类内散度:类别内部“散不散”,越近越好
      1. 先按类算出每类的散度
        1. S1 = np.dot((X1 - m1), (X1 - m1).T)
      2. 全部相加得出
  1. 找最优方向
      • 再归一化:w = w / np.linalg.norm(w)
        • 原因:只关心方向,不关心长度
          (w可以理解为是一个多维坐标,与原点连线就能确定一个方向;长短没啥用)
  1. 投影后均值
  1. 预测函数
    1. 算点的投影:proj = np.dot(w.T, x)
    2. 比较绝对值,分类

手算

  1. 题目会给数据与分类
    1. X1:(1, 2), (2, 3), (3, 2)
      X2:(6, 5), (7, 6), (8, 5)
  1. 计算均值
    1. m1 = (2, 2.33)
      m2 = (7, 5.33)
      类间差:m2 - m1 = (5, 3)
3. 计算类内散度
以第一类为例:
(1, 2)
outer:
最后把1类中所有的outer加起来:
notion image

贝叶斯

朴素贝叶斯

“朴素”:所有特征之间相互独立
也叫做条件独立假设(Conditional Independence Assumption)

方差与偏差

偏差
由于强假设所有特征独立,导致模型表达能力受限 → 偏差较高
方差
只算统计概率→参数少,不易受单个样本影响 → 方差较低

各种朴素贝叶斯

  • 高斯朴素贝叶斯(Gaussian Naive Bayes)
    • 专门处理“连续型数值特征”(温度、身高等)
      假设:每个特征在某个类别下服从正态分布(高斯分布)
      需要为每个类别、每个特征单独计算均值与方差
  • 多项式朴素贝叶斯(Multinomial Naive Bayes)
    • 常用于文本分类、词频型数据(邮件、新闻、违禁词等)
      假设:每个特征在某个类别下的出现次数服从多项式分布(Multinomial Distribution)
  • 伯努利朴素贝叶斯(Bernoulli Naive Bayes)
    • 只关心特征是否出现,而不关心出现次数(短文本、噪声较少的场景)
      假设:每个特征在某个类别下服从伯努利分布(Bernoulli Distribution)

各种概率

标签/类别:Label / Target() 特征:Feature(,X表示所有特征,里面的为各个特征值)
:先验概率(Prior)
在不看特征时,待测样本是某一类的概率;单纯看种类里个体数量决定。
:似然概率(Likelihood)
在某种类中,出现某特征的概率
:证据概率(Evidence)
在所有个体中,出现某特征的概率
:后验概率(Posterior)
出现某特征后,属于某类的概率

对数似然

将概率乘积取对数,从乘法变为加法
防止极小的概率不断相乘导致的下溢,从而防止丢失数值信息

拉普拉斯平滑

每个类别里,每个特征“默认都出现过一次(或很小次数)”
  • :平滑系数
    • 小:贴合训练数据,易过拟合
      大:接近均匀分布,更保守
      一般取1
  • :特征在类别中出现次数
  • :类别下所有特征的总出现次数
  • :特征个数

带拉普拉斯平滑的朴素贝叶斯

某邮件系统将邮件分为三类:垃圾邮件( )、广告邮件( )、正常邮件(),选取8个核心关键词作为特征,分别为:中奖、免费、礼品、退款、发票、工作、会议、汇报。 训练集共50封邮件,各类别样本量及各关键词出现次数统计如下:
  • 垃圾邮件():共15封
    • 关键词出现次数:中奖(12)、免费(10)、礼品(8)、退款(3)、发票(1)、工作(0)、会议(0)、汇报(0)
  • 广告邮件():共20封
    • 关键词出现次数:中奖(2)、免费(7)、礼品(9)、退款(1)、发票(4)、工作(2)、会议(1)、汇报(0)
  • 正常邮件():共15封
    • 关键词出现次数:中奖(0)、免费(1)、礼品(0)、退款(2)、发票(5)、工作(8)、会议(7)、汇报(6)
待测邮件:邮件内容包含关键词:中奖、免费、礼品、退款
  1. 先验概率
  1. 拉普拉斯平滑
  1. 根据待测样本的特征,算出每个类别的可能性(类别似然)
    1. 垃圾邮件:
      乘起来得到垃圾邮件的最终概率
      其他类别同上
  1. 乘先验概率,得到最终概率(未归一化后验概率(Unnormalized Posterior Probability)
    1. 即后验概率的分子,后验概率的分母为证据概率,对于所有类别都一样,所以分类时可以忽略
  1. 比较大小,得出结论

手算

某电影推荐系统将电影分为三类:
  • :动作片
  • :喜剧片
  • :恐怖片
选取 5 个关键词作为特征:打斗、爆炸、笑点、爱情、惊悚
  • 动作片 ()(共 12 部)
    • 关键词
      出现次数
      打斗
      8
      爆炸
      7
      笑点
      2
      爱情
      1
      惊悚
      2
  • 喜剧片 ()(共 10 部)
    • 关键词
      出现次数
      打斗
      1
      爆炸
      0
      笑点
      9
      爱情
      3
      惊悚
      1
  • 恐怖片 ()(共 8 部)
    • 关键词
      出现次数
      打斗
      2
      爆炸
      1
      笑点
      1
      爱情
      1
      惊悚
      8
某电影包含以下关键词:打斗、笑点、惊悚
notion image

决策树

可解释性强(interpretable)
决策过程是一条条规则(很多的if-then)

选择划分特征的方法

ID3

哪个特征能让分类“变得最清晰”,就选哪个,不管有没有意义
比如:会通过id分组,一人一组,纯到爆炸!但来一个新人就没有用了,蠢到爆炸!
[hd] bro引以为傲的谐音梗被Gimini说是:「极其拟人化且刻意的幽默:这种“前半句正经,后半句突然讲俏皮话/网络梗”的风格,是现代大语言模型(尤其是被要求“用通俗易懂的语言解释”时)最标准的输出特征。[hd]
只能处理离散特征
信息熵(Entropy)
衡量数据的不确定性 / 混乱程度
取值范围:
完全纯净 ≤ ≤ 均匀分布
  • :信息熵
  • :类别数
信息增益(Information Gain)
看减少了多少不确定性,越大越好

C4.5

信息增益率(Gain Ratio)
解决ID3偏爱取值多的特征的问题,给“信息增益”降权,并引入特征本身“有多碎”的惩罚项
同样的id,C4.5会认为一人一组的分法没有泛化能力,从而拒绝

CART(Classification And Regression Tree)

基尼指数(Gini Index)
基尼指数:
  • :数据集
  • :类别数
  • :第类样本所占比例
二分类情况:假设正类=,负类=
:当前节点的混乱程度
Gini越小,数据越纯;Gini越大,数据越混乱。
划分后的基尼指数(加权):
  • :划分特征
  • :左右子树数据
  • :样本数
:划分后整体的平均混乱度
如果按这个特征切一刀,切完以后,整体剩下多少混乱
越小,说明分完后越“规整”(混乱程度小、纯),那么用这个特征分类就是好的。
等于0 → 左边全是正类,右边全是负类 → 一点都不乱,非常好

手算CART求第一决策特征

对于每个特征,枚举所有可能划分,算出每种划分的,取最小作为当前特征的最终;最后比较所有特征的最终
notion image

剪枝(Pruning)

降低决策树复杂度,解决过拟合,提高泛化能力

预剪枝(Pre-pruning)

建树过程中提前停止划分
常见停止条件:
  • 达到设定的最大树深
  • 节点样本数小于设定阈值
  • 划分后信息增益过小 / 基尼指数下降不明显
优点:
  • 减少训练时间
  • 降低属的复杂度
缺点:
  • 过早剪枝可能导致欠拟合

后剪枝(Post-pruning)

先生成完整决策树,再删除对泛化能力帮助不大的分支
常用验证集评估:
剪掉该分支后,验证集准确率不下降 → 剪掉
优点:
  • 通常比预剪枝效果更好
  • 不容易错过有价值的划分
缺点:
  • 因为需要先生成完整树,所以训练时间更长

随机森林(集成学习)

很多棵“有点不同的决策树”(通常基于CART),一起投票做决定
优点:
  • 降低过拟合,增强泛化能力
缺点:
  • 可解释性差(随机性过多)
  • 模型较大
  • 所需时间较长

造森林步骤

  1. Bootstrap抽样(数据随机)
    1. 从原始数据中:
      • 有放回抽样
      • 每棵树拿到一份“不同的数据集”
  1. 随机选特征(特征随机)
    1. 在每个节点分裂时:
      • 不看全部特征
      • 只看“随机挑出来的一部分特征”
      防止某个强特征统治全局
  1. 训练很多棵树(森林形成)
    1. 每棵树独立生长且结构不同(数据随机 + 特征随机)

KNN(K-Nearest Neighbors,K近邻算法)

目标是看一个新样本应给被分到哪类,看它周围最近的 K 个样本大多数属于谁。
平时不训练,仅当待测样本输入时根据k值统计标签
仍会有欠拟合或过拟合的现象

K-means(K均值聚类)

目标是把数据分成k类
贪心算法的一种,局部最优解
步骤:
  1. 随机选k个质心
  1. 计算每个样本到各个质心的距离,离哪个最近就分到哪类
  1. 计算每一类的平均值(该类所有点的平均位置)作为新的质心
  1. 重复,直到质心改变量小于设定阈值,结束
目的是最小化”类内距离平方和“

PCA(Principal Component Analysis,主成分分析)

找到数据“变化最大”的方向(方向向量),把数据投影过去,删掉多余维度
在投影方向上,方差最大的是第一主成分(PC1)
垂直于第一主成分的是第二主成分(PC2)

具体步骤

  1. 去中心化
    1. 每一列减去它的均值,让数据“围绕原点展开”
  1. 计算协方差矩阵
    1. 个样本,个特征
      协方差矩阵C(一个d*d的矩阵):
      :第 i 个特征 和 第 j 个特征 的“共同变化程度”
      :方差
  1. 特征值分解
    1. :方向向量
      :特征值
      :将C带入以下公式,用行列式求出的所有可能值(从大到小写,最大的是第一主成分)
      :将依次带入求出特征向量(矩阵)
      一般将的长度化成1(规范化):除以的二范数
  1. 求降维结果(二维)

潦草手算

notion image
上一篇
Java
下一篇
算法设计与分析

评论
Loading...