By BarryZed
目录
概论机器学习模型的分类按学习任务分类按模型性质分类按输出类型分类其他概念线性回归目的特点代码L2正则线性回归先验手算逻辑回归二分类目的Sigmoid函数//交叉熵损失(Cross Entropy Loss)梯度下降手算感知机二分类手算Fisher线性判别分析(Linear Discriminant Analysis, LDA)代码手算贝叶斯朴素贝叶斯方差与偏差各种朴素贝叶斯各种概率对数似然拉普拉斯平滑带拉普拉斯平滑的朴素贝叶斯手算决策树选择划分特征的方法ID3C4.5CART(Classification And Regression Tree)手算CART求第一决策特征剪枝(Pruning)预剪枝(Pre-pruning)后剪枝(Post-pruning)随机森林(集成学习)造森林步骤KNN(K-Nearest Neighbors,K近邻算法)K-means(K均值聚类)PCA(Principal Component Analysis,主成分分析)具体步骤潦草手算
概论
机器学习模型的分类
按学习任务分类
监督学习(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)
其他概念
损失函数
课上推导(两个偏导)

两个圈中=0,左侧w与有下w相等
范数:距离原点的距离
二范数:向量的直线距离
线性回归
目的
预测,找到最优的
W 和b(ais) 特点
- 标准框架:特征→模型→损失函数→优化(梯度下降)→评估(越大越好)
- 可解释性强
- 有最完善的理论支持
代码
- 读数据,规范数据格式
- 特征归一化(Normalize)
- 均值:
np.mean(X, axis=0) - 标准差:
np.std(X, axis=0)
特征标准化 = (X - 均值)/标准差
(
axis=0 指按列求)- 线性预测函数
:
np.matmul(X, W) + bias matmul :matrix multiplication(@)- 损失函数
np.sum()可以直接算和(当用就行)
- 梯度下降
grad_wgrad_biasalpha:学习率W = W - alpha * grad_wbias = bias - alpha * grad_b
- 训练函数
ite指学习轮数(iteration,迭代次数)- 先给初始值
- 声明
costs来记录每次的损失,来确定学习率是否合适 - 开始循环
- 先保存当前
cost - 进行(5)的梯度下降更新
W, bias
W = np.random.randn(n, 1) * 0.01 给W 一个随机值,*0.01 防止过大b = 0.1 alpha = 0.01 L2正则线性回归
- 损失函数
:正则化强度系数()
grad_w
grad_bias
- 更新
w = w - alpha(grad_w + 2 * lambda * w)先验
正则 | 先验分布 |
L1 | 拉普拉斯分布 |
L2 | 高斯分布 |
手算
- 向量(一步一步算)

- 正规方程解(一步到位最优解)

逻辑回归
“你有多像那一边?”(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_wb = b - alpha * grad_b
- 更新时不把变为0或1,保留原始值,只有最后与测试再变
手算

感知机
“你在哪边?”(only side matters)——ChatGPT
二分类
if yi * (np.dot(w, xi) + b) <= 0 :误分类,从头重新算W, b更新
W, b :w = w + alpha * yi * xi, b = b + alpha * yi手算

- 某一轮指完全走一遍
- 第一个数错误:更新w1, b1
- 用w1, b1分第二个数,正确
- 用w1, b1分第三个数,错误,更新w2, b2
- 用w2, b2分第四个数,错误,更新w3, b3
例子(4个数)
→此时w3, b3则是第一轮的结果
Fisher线性判别分析(Linear Discriminant Analysis, LDA)
找一条直线(投影方向 w),让两类数据在这条线上“分得最开”。
代码
- 分类
class1, class2 = np.unique(x) :把数组 x 里“所有不重复的值”提取出来,并排序返回按照返回值将原数据
X 分到X1, X2 中- 计算类均值
找到
class1, class2 的中心m1, m2 (m1 = np.mean(X1, axis=0))- 计算散度矩阵和类内散度
- 散度矩阵:衡量“两个类别中心有多远”,越远越好
- 类内散度:类别内部“散不散”,越近越好
- 先按类算出每类的散度
- 全部相加得出
这里是外积(
m_diff = m2 - m1; S_b = np.outer(m_diff, m_diff.T)),公式为:S1 = np.dot((X1 - m1), (X1 - m1).T)- 找最优方向
- 再归一化:
w = w / np.linalg.norm(w)
原因:只关心方向,不关心长度
(w可以理解为是一个多维坐标,与原点连线就能确定一个方向;长短没啥用)
- 投影后均值
- 预测函数
- 算点的投影:
proj = np.dot(w.T, x) - 比较绝对值,分类
手算
- 题目会给数据与分类
X1:
(1, 2), (2, 3), (3, 2)X2:
(6, 5), (7, 6), (8, 5)- 计算均值
m1 = (2, 2.33) m2 = (7, 5.33) 类间差:
m2 - m1 = (5, 3) 3. 计算类内散度
以第一类为例:
(1, 2) :outer:
…
最后把1类中所有的outer加起来:
- 求
- 求

贝叶斯
朴素贝叶斯
“朴素”:所有特征之间相互独立
也叫做条件独立假设(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)
待测邮件:邮件内容包含关键词:中奖、免费、礼品、退款
- 先验概率
- 拉普拉斯平滑
- 根据待测样本的特征,算出每个类别的可能性(类别似然)
垃圾邮件:
乘起来得到垃圾邮件的最终概率
其他类别同上
- 乘先验概率,得到最终概率(未归一化后验概率(Unnormalized Posterior Probability)
即后验概率的分子,后验概率的分母为证据概率,对于所有类别都一样,所以分类时可以忽略
- 比较大小,得出结论
手算
某电影推荐系统将电影分为三类:
- :动作片
- :喜剧片
- :恐怖片
选取 5 个关键词作为特征:打斗、爆炸、笑点、爱情、惊悚
- 动作片 ()(共 12 部)
关键词 | 出现次数 |
打斗 | 8 |
爆炸 | 7 |
笑点 | 2 |
爱情 | 1 |
惊悚 | 2 |
- 喜剧片 ()(共 10 部)
关键词 | 出现次数 |
打斗 | 1 |
爆炸 | 0 |
笑点 | 9 |
爱情 | 3 |
惊悚 | 1 |
- 恐怖片 ()(共 8 部)
关键词 | 出现次数 |
打斗 | 2 |
爆炸 | 1 |
笑点 | 1 |
爱情 | 1 |
惊悚 | 8 |
某电影包含以下关键词:打斗、笑点、惊悚

决策树
可解释性强(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求第一决策特征
对于每个特征,枚举所有可能划分,算出每种划分的,取最小作为当前特征的最终;最后比较所有特征的最终

剪枝(Pruning)
降低决策树复杂度,解决过拟合,提高泛化能力
预剪枝(Pre-pruning)
建树过程中提前停止划分
常见停止条件:
- 达到设定的最大树深
- 节点样本数小于设定阈值
- 划分后信息增益过小 / 基尼指数下降不明显
优点:
- 减少训练时间
- 降低属的复杂度
缺点:
- 过早剪枝可能导致欠拟合
后剪枝(Post-pruning)
先生成完整决策树,再删除对泛化能力帮助不大的分支
常用验证集评估:
剪掉该分支后,验证集准确率不下降 → 剪掉
优点:
- 通常比预剪枝效果更好
- 不容易错过有价值的划分
缺点:
- 因为需要先生成完整树,所以训练时间更长
随机森林(集成学习)
很多棵“有点不同的决策树”(通常基于CART),一起投票做决定
优点:
- 降低过拟合,增强泛化能力
缺点:
- 可解释性差(随机性过多)
- 模型较大
- 所需时间较长
造森林步骤
- Bootstrap抽样(数据随机)
- 有放回抽样
- 每棵树拿到一份“不同的数据集”
从原始数据中:
- 随机选特征(特征随机)
- 不看全部特征
- 只看“随机挑出来的一部分特征”
在每个节点分裂时:
防止某个强特征统治全局
- 训练很多棵树(森林形成)
每棵树独立生长且结构不同(数据随机 + 特征随机)
KNN(K-Nearest Neighbors,K近邻算法)
目标是看一个新样本应给被分到哪类,看它周围最近的 K 个样本大多数属于谁。
平时不训练,仅当待测样本输入时根据k值统计标签
仍会有欠拟合或过拟合的现象
K-means(K均值聚类)
目标是把数据分成k类
贪心算法的一种,局部最优解
步骤:
- 随机选k个质心
- 计算每个样本到各个质心的距离,离哪个最近就分到哪类
- 计算每一类的平均值(该类所有点的平均位置)作为新的质心
- 重复,直到质心改变量小于设定阈值,结束
目的是最小化”类内距离平方和“
PCA(Principal Component Analysis,主成分分析)
找到数据“变化最大”的方向(方向向量),把数据投影过去,删掉多余维度
在投影方向上,方差最大的是第一主成分(PC1)
垂直于第一主成分的是第二主成分(PC2)
具体步骤
- 去中心化
每一列减去它的均值,让数据“围绕原点展开”
- 计算协方差矩阵
个样本,个特征
协方差矩阵C(一个d*d的矩阵):
:第 i 个特征 和 第 j 个特征 的“共同变化程度”
:方差
- 特征值分解
:方向向量
:特征值
求:将C带入以下公式,用行列式求出的所有可能值(从大到小写,最大的是第一主成分)
求:将依次带入求出特征向量(矩阵)
一般将的长度化成1(规范化):除以的二范数
- 求降维结果(二维)
潦草手算

- 作者:BarryZed
- 链接:
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。







.jpg?table=block&id=2cb05109-5451-8092-a42a-ffaf40797495&t=2cb05109-5451-8092-a42a-ffaf40797495)