🤖机器学习
type
status
date
slug
summary
tags
category
icon
password
知识整体框架
判别式人工智能概述
判别式人工智能(discriminative AI)可用于分类或预测,其核心在于“Functions Describe the World”。
给定输入 (features,即“特征”),模型输出 (label,即“标签”)。我们假设存在某个未知函数 ,它描述了从输入到输出的映射:
机器学习的任务:用数据去逼近这个未知函数 (在标记数据集上训练),得到一个可计算、可泛化(generalize,即对没见过的新样本也有效)的近似函数 。
- 典型例子
- 垃圾邮件过滤
- 输入:一封邮件的特征(发件人、关键词、可疑链接等)
- 输出:垃圾邮件 (1) / 非垃圾邮件 (0)
- 语音识别
- 输入:一段语音的声学特征
- 输出:文字序列
- 机器翻译
- 输入:英文句子
- 输出:中文句子
以上例子都属于监督学习(supervised learning):我们有“输入-输出成对”的样本来学习映射。
监督学习概述
监督学习假设我们有一组带标签的数据:
其中 是第 个输入样本的特征向量; 是对应的正确答案(标签)。
目标:学习一个函数 ,使得
用学到的 ,我们就可以在新样本上做预测 。
- 监督学习的两大典型任务
- 分类(classification)→ 预测离散的类别标签。
- 回归(regression)→ 预测连续的数值输出。
e.g. 会下雨 / 不会下雨;批准贷款 / 拒绝贷款。
e.g. 给定广告投放额,预测销售额。
- 二者的本质区别:
- 分类输出是离散的(例如 );
- 回归输出是实数值(例如 元的销售额)。
分类的目标是:根据输入特征,把样本判到某个类别。
例子:根据湿度和气压判断“是否会下雨”。
可视化时,我们把每一天的湿度和气压画成一个点,并用颜色标记当天是否下雨。任务就变成:找到一种规则,能把“下雨”的点和“没下雨”的点分开。
这种“把平面切成两块”的东西,叫做决策边界(decision boundary)。决策边界一侧是“下雨”,另一侧“没下雨”。
KNN
K 最近邻算法(k-nearest neighbors, KNN)是最直接的分类方法之一。它不试图学出一个显式的公式,而是用“相似样本的多数意见”来进行分类。
基本思想
对于一个待分类的样本 :
- 计算它与所有训练样本之间的距离;
- 找出距离它最近的 个训练样本;
- 查看这 个邻居的标签;
- 采用投票(多数表决)决定 的预测类别:将待识别的样本分类为距离它最近的 个数据点中最普遍的类别。
- e.g. 如果是二分类(例如“下雨 = ” vs “不下雨 = ”):
- 若最近的 个邻居中有 个是“”, 个是“”,则预测结果为 。
对于回归任务,也可使用 KNN:对最近 个邻居的目标值做平均,得到一个连续的预测数值。
距离度量
“最近”依赖于“距离”的定义,即距离度量(distance metric)。常见的距离包括:
- 欧氏距离(Euclidean distance):两点之间的直线距离
- 曼哈顿距离(Manhattan distance):坐标轴方向的距离之和
不同的距离度量会导致“谁是最近邻”的判定发生变化。
如果不同特征的量纲差别很大(例如一个特征是“身高 (厘米)”,另一个特征是“收入 (元/年)”),大尺度特征会主导距离,因此常常需要特征缩放(feature scaling)或标准化(standardization),即把不同特征调整到类似的范围。
算法步骤
- 设定邻居数量 ,作为超参数(hyperparameter)。
- 对每一个需要分类的新样本 :
- 计算 与训练集中所有样本的距离;
- 选出距离最小的 个样本;
- 对于分类问题:统计这 个样本里每个类别出现的次数,取次数最多的类别作为预测。 (对于回归问题:取这 个样本目标值的平均值作为预测。)
超参数 的影响
- 当 时,预测只看最近的一个邻居。
- 优点:对局部变化非常敏感。
- 缺点:对噪声也非常敏感,容易过拟合(overfitting),即模型只记住训练点,不具备泛化能力。
- 取较大值时,
- 预测会更加平滑、不那么容易被个别噪声点误导,
- 但可能忽略细节,出现欠拟合(underfitting),即模型太粗糙,无法刻画真实结构。
通常 不是拍脑袋决定的,而是通过验证集(validation set)或交叉验证(cross-validation)来选择,使得模型在“没见过的数据”上表现更好。
线性分类与感知机模型
与 KNN 这种非参数方法不同,感知机模型(perceptron)/ 线性回归(Linear Regression)试图直接学习出一条分隔不同类别的线——在高维空间中是超平面(hyperplane),即画出决策边界(decision boundary)。
模型形式
我们把输入向量写成 ,其中第一个分量 1 对应偏置项(bias),相当于允许分界线不必穿过原点;把可学习的权重向量写成 。
感知机的打分函数(score)是内积
预测规则是
这条决策边界是 ,在二维空间中是一条直线,在三维空间中是一个平面,在更高维度中是一个超平面。
感知机的学习规则
感知机通过逐个样本地更新权重,让模型逐渐学会把正类和负类分开。
对训练样本 ,其中 ,当前预测为 。对每一维 ,更新:
- 是学习率(learning rate),控制每次更新的步幅。
- 若预测正确,则 ,不更新。
- 若预测错误(比如实际的 但估计出的 ),则 为正,权重会沿着 的方向增加,使下次更可能输出 。

代码实现:手写实现感知机模型
损失函数与梯度下降
机器学习训练的基本范式通常是:
- 定义一个损失函数(loss function)衡量预测与真实答案的差距。
- 通过优化(optimization)最小化该损失函数。
常见损失函数
- 0-1 损失(0-1 loss)
- 优点:直接体现“对 / 错”。
- 缺点:不可导(不光滑),很难用梯度法优化。
- L1 损失(绝对值损失,L1 loss)
对离群点(outlier,极端值)更稳健。
- L2 损失(二次损失,L2 / squared loss)
对大偏差惩罚更重,常见于回归与线性模型;它是可导的、光滑的,适合用梯度优化。
从损失函数到梯度下降
梯度(gradient)是损失函数对参数的偏导数组成的向量,表示“最陡峭的上升方向”。
梯度下降(gradient descent)沿着负梯度方向前进,从而减少损失。
以感知机为例,若我们(临时)把 $\hat{y}$ 当成一个实值输出,并考虑二次损失
则对 的偏导为
梯度下降的更新公式为
这与感知机的更新公式一致(忽略硬阈值带来的不可导问题)。
因此,感知机学习规则可以理解为随机梯度下降(stochastic gradient descent, SGD)的一种具体形式。
三种常见的梯度下降方式
- 批量梯度下降(batch gradient descent)
- 每次更新前,用“整批训练数据”的平均梯度。
- 优点:更新方向稳定。
- 缺点:当训练集很大时,计算代价高。
- 随机梯度下降(stochastic gradient descent, SGD)
- 每次只用一个样本更新一次参数。
- 优点:更新快,适合大规模数据。
- 缺点:更新方向噪声大,参数会“抖动”。
- 小批量梯度下降(mini-batch gradient descent)
- 每次用一小批(如 32、64 个)样本计算平均梯度。
- 在计算效率与稳定性之间折中,是现代深度学习训练的主流方式。
Logistic 回归
线性分类器的硬阈值只能告诉我们“属于 0 还是 1”,但不能告诉我们“有多大把握”。Logistic 回归(logistic regression)把输出解释为概率。
Sigmoid / Logistic 函数
给定打分 ,Logistic 回归使用 Sigmoid 函数:
预测正类(例如 )的概率为
当 很大时,$\hat{p}\approx 1$;当它很小时,$\hat{p}\approx 0$。
这就把一个线性打分变成了“概率”解释。
交叉熵损失
Logistic 回归用交叉熵损失(cross-entropy loss)来衡量概率预测和真实标签之间的差距:
这个损失函数有两个重要性质:
- 当真实标签是 1 时,如果模型给的概率 非常接近 ,损失就非常小;如果 很小(自信但错),惩罚会非常大。
- 它是关于参数 的凸函数(convex function),这意味着我们在优化时不会陷入局部极小值陷阱:用梯度下降可以找到全局最优解。
梯度更新(随机梯度下降形式)
对每个参数 ,交叉熵损失的梯度可以写成
因此更新规则为
这与感知机的规则形式非常类似,区别在于:
- 感知机的 是 0/1 的硬判定;
- Logistic 回归的 是平滑的概率,允许使用可导的损失进行优化。
决策边界与可分性
在二维平面上,Logistic 回归的决策边界仍然是 这条直线。
与感知机的不同不在于边界的形状,而在于:
- Logistic 回归不仅给出类别,还给出“多大概率是正类”;
- Logistic 回归的学习是解一个凸优化问题,训练稳定、可解释为极大似然估计(maximum likelihood estimation)。
支持向量机
感知机和 Logistic 回归都能找一条线把数据分开,但它们并不关心分得“多安全”。
支持向量机(Support Vector Machine, SVM)在意的是:不但要分开,还要分得尽可能宽。
几何直觉:间隔
设想我们有一条分界线把蓝点(正类)和红点(负类)分开。
我们衡量这条线到最近的蓝点的距离和到最近的红点的距离,取最小者,这个距离叫做间隔(margin)。支持向量(support vectors)是那些离分界线最近的训练样本。SVM 要选择的分界线是:让这个最小距离(间隔)最大的那一条线。这叫最大间隔分离器(maximum-margin separator)。
用数学的标准硬间隔 SVM 形式(线性可分情形)可以写成:
含义:
- 约束 确保所有样本都被正确分到对应的一侧,并且离边界至少有距离 1 的“安全边界”。
- 目标 等价于最大化间隔。 换句话说,向量 越“短”,边界越不陡,间隔越大。
重点公式(硬间隔 SVM 优化目标)
为什么最大间隔是合理的
- 如果一条边界线离所有点都很远(间隔大),那么即使未来的新样本有一点噪声,也更可能仍被正确分类。
这可以理解为“鲁棒性”(robustness,抗扰动能力)。
- 对于线性可分数据,感知机可能找到任意一条能分开的线;SVM 会挑“最稳”的那条,也就是几何意义上“最安全”的分界线。
这给了 SVM 一个几何上的最优性定义,使得它不仅能分开训练集,而且在理论上具有更好的泛化上界(generalization bound,泛化误差的上限)。
处理非线性可分数据:核函数
当数据不是线性可分时(例如正类是内圈、负类是外圈的同心圆),二维平面上一条直线无法分开它们。
SVM 使用核函数(kernel function)把数据隐式映射到更高维特征空间,在那个高维空间里,它们常常是线性可分的。
- 我们并不显式计算“高维坐标”。
- 取而代之的是,用核函数 去计算高维空间中内积 。
- 这样,算法的数学形式几乎不变,但我们等价地在高维里做了最大间隔分割。
常见核函数包括线性核、多项式核、多数实际任务中非常常用的 RBF 核(高斯核)。
决策树
决策树(decision tree)是一种可解释的模型:它像一连串“如果……那么……”的规则,逐步把样本分到不同的叶子节点(leaf nodes),最后给出分类或预测。
分类回归树(Classification And Regression Tree, CART)算法是一种决策树分类方法。CART 每一个节点上都采用二分法,内部节点只能根据属性进行二分,生成的树一定是二叉树。
CART 算法既可以用分类任务,也可用于回归任务。下面介绍 CART 算法使用 Gini 指数最小化来生成分类树的算法。
基本思路
- 选一个特征,按某个阈值或类别把数据分成两组或多组。例如:
- “申请人是否有工作?”
- “申请人名下是否有房产?”
- “信用评级是‘非常好’还是‘一般’?”
- 对每一组,再继续选择最能区分输出标签的特征并划分。
- 重复,直到:
- 该节点内部几乎都是同一类(“纯”);
- 或树的深度达到上限;
- 或样本太少,继续划分没有意义。
最终形成的是一棵树:从根(root)往下走的每条路径都是一串判定条件,叶子节点给出最终的类别决策(如“批准贷款”或“拒绝贷款”)。
节点纯度与基尼系数
在训练过程中,决策树需要选择“在哪个特征上切分最好”。“最好”的直观含义是:切分后,子节点里的样本最好“很单一”(纯),即大部分样本属于同一类。基尼系数(Gini index)衡量一个节点内的不纯度(impurity),可以反映随机选择两个样本,其类别不一致的概率。
若节点 中类别 的比例是 ,则
- 如果节点里全是同一类,则某个 、其他 ,于是 ,表示完全纯。
- 如果节点里类别均匀混合(例如二分类时正负各一半),则 较大,表示很不纯。
在某个候选特征上切分后,我们会得到若干子节点。计算每个子节点的 ,然后对它们做加权平均(权重是各子节点的样本数量占比),它体现的是经过特征分类后的样本被分错的概率。比如,在节点 上按照特征 将样本划分成 和 两部分,那么加权 Gini 为:
我们选取加权 Gini 最小的特征阈值组合作为当前节点的最佳划分。
构建贷款审批树的例子
- 特征示例:
- 是否有工作(是/否)
- 是否有房产(是/否)
- 信誉等级(“一般”“好”“非常好”)
- 最终结果(批准/拒绝)
- 过程:
- 尝试按“是否有工作”划分,计算划分后两组(有/无工作)中“批准 vs 拒绝”的 Gini,并计算加权平均。
- 尝试按“是否有房产”划分,做同样的计算。
- 尝试按“信誉等级”划分(可能是多分支划分),同样计算加权 Gini。
- 选择加权 Gini 最小的划分方法作为根节点。
继续在子节点上重复该过程,直到满足停止条件(如节点纯度高、深度到上限等)。
防止过拟合:停止条件 / 剪枝
单棵决策树可能会过拟合——也就是说,它可能会把训练数据切分到极度细碎的程度,只是为了“记住”每一个训练样本的细节。
- 常见的防止过拟合的做法:
- 限制树的最大深度(
max_depth)。 - 要求一个节点必须包含足够多的样本才允许继续切分(
min_samples_split)。 - 在训练完一棵大树后再进行“剪枝(pruning)”,即把对泛化无益的分支剪掉。
这些技巧的目标是控制模型复杂度,提升泛化性能(generalization performance)。
代码实现:使用 sklearn 实现决策树算法
sklearn 实现决策树算法代码实现:手写代码构建决策树

题目:W4-ML-HW
答案:W4-ML-HW 工具函数
答案:W4-ML-HW build_tree
集成学习与随机森林
即使一棵精心调整过的树也可能不够稳健。集成学习(ensemble methods)通过“多个模型投票”来获得更可靠的结果。
基本思想
- 训练许多“弱相关”的模型(通常是很多棵不同的决策树)。
- 在预测时,把这些模型的结果合并。
合并可以有两种典型方式:
- 硬投票(hard vote / majority vote):每棵树各自给出一个类别,最终预测是票数最多的类别。
- 软投票(soft vote):每棵树给出“属于正类的概率”,然后把这些概率平均,再根据平均概率做决策。
多数情况下,软投票能更好地利用模型的置信度信息。
随机森林
随机森林(random forest)是最常见的树模型集成方法。核心有两点随机性:
- 自助采样(bootstrapping)/ 有放回抽样
- 对原始训练集做“有放回”的随机抽样,得到很多“子训练集”。
- 每个子训练集都用来训练一棵决策树。
- 因为每棵树看到的训练数据不完全相同,树与树之间会有所差异。
- 特征子采样(feature subsampling)
- 在每个树的每个分裂节点处,只允许它在一个随机挑选出的特征子集里寻找最佳划分。
- 这进一步鼓励不同的树“看问题的角度”不同。
通过这两层随机性,随机森林中的各棵树之间不会太“雷同”。
多个差异化的弱学习器(weak learners)投票,往往比任何一棵单树更稳健,泛化误差更低。
这就是**Bagging(Bootstrap Aggregating)**思想的典型实践:
- Bootstrap 产生多个样本子集;
- 各子集上分别训练;
- 最后 Aggregating(聚合)输出。
回归(regression)
回归任务预测的是连续值,而非离散标签。
典型例子:
- 输入:广告投放预算(例如 TV、Radio、Social Media 的投入额)。
- 输出:下一周的销售额(一个实数)。
最经典的回归模型是线性回归(linear regression):
训练线性回归的常见做法是最小化 L2 损失(又叫“最小二乘”,least squares):
线性回归给出的往往是一条“总体趋势线”,而不是一个硬性的类别边界。回归问题关心的是“预测值有多接近真实数值”,而不是“分到对的那一类”。
训练目标、过拟合与正则化
机器学习训练的目标
在监督学习中,我们往往定义一个“代价函数”(cost function):
- :模型在训练数据上的预测误差(比如交叉熵损失或平方损失)。
- :模型复杂度的度量,例如权重向量的范数大小、树的深度等。
- :正则化系数(regularization strength),用来平衡“拟合误差”和“复杂度惩罚”。
重点公式(正则化思想)
过拟合(overfitting)
过拟合指:模型几乎“背住”训练集的细节噪声,导致在新数据上表现不佳。
现象举例:
- 在分类里,决策边界被扭曲得非常复杂,只是为了把训练集里每一个点都分对。
- 在回归里,拟合曲线疯狂弯曲,只为了通过所有训练点,而没有体现真实的总体趋势。
过拟合意味着:模型学到的不是“普遍规律”,而是“训练集中偶然出现的细枝末节”。
正则化(regularization)
正则化强迫模型“不要太复杂”。
直觉:我们不只奖励在训练集上表现好,还额外惩罚过度复杂的解。
好处:
- 避免模型被少量异常点“牵着走”;
- 提升泛化能力(generalization):即在未见过样本上的表现。
常见的正则化方式包括:
- L2 正则化(也叫权重衰减 weight decay):在 cost 里加上 ;
- 限制树的最大深度、最小样本数等结构性约束(对决策树 / 随机森林而言)。
模型评估与交叉验证
训练一个模型并在训练数据上表现很好,并不代表它真的“学懂了模式”。
我们必须在未被用来训练的数据上评估它。
保留法 / 留出法(holdout)
- 将原始数据集切分成两部分:训练集和测试集。
- 用训练集拟合模型。
- 用测试集评估模型表现。
优点:实现简单。
缺点:测试集那一部分数据没有参与训练,等于少用了一部分数据来学习。
k 折交叉验证(k-fold cross-validation)
- 把数据平均分成 份(称为 个“折”)。
- 做 轮训练+评估:
- 每一轮拿其中 1 折当测试集,其余 折当训练集;
- 记录测试表现。
- 最终报告 次测试表现的平均值。
好处:
- 每个样本都在某一轮中扮演过“测试集”,也在其他轮扮演过“训练集”,充分利用了数据;
- 评估结果更稳定,不太依赖于某一次偶然的划分。
折数 的影响:
- 小:训练数据更少,评估方差更大。
- 大(极端是留一法 Leave-One-Out CV):训练数据几乎是全量,但计算量高。
交叉验证不仅用来评估模型,还常用于调参(hyperparameter tuning),例如:
- KNN 中 的大小;
- Logistic 回归的正则化强度;
- 决策树的最大深度;
- 随机森林的树的数量和特征子采样比例。
分类模型的评估指标
单一的“准确率”(accuracy)往往不够,尤其是在类别不平衡(class imbalance)的任务中。我们需要更细的指标。
混淆矩阵(confusion matrix)
针对二分类任务(正类 = 1,负类 = 0):
- TP(True Positive)真阳性:真实为 1,预测为 1
- FP(False Positive)假阳性 / 误报:真实为 0,却预测为 1
- TN(True Negative)真阴性:真实为 0,预测为 0
- FN(False Negative)假阴性 / 漏报:真实为 1,却预测为 0
基于这四个数,可以定义以下指标:
召回率(recall / sensitivity / true positive rate, TPR)
解释:在所有真正为正类的样本中,有多大比例被模型成功检出。
在疾病筛查中,召回率高意味着“很少漏诊真正的病人”。
精确率(precision / positive predictive value)
解释:在所有被模型判为正类的样本中,实际真的正类占多大比例。
在垃圾邮件过滤中,精确率高意味着“很少把正常邮件误杀成垃圾邮件”。
F1 分数(F1 score)
F1 是精确率和召回率的调和平均(harmonic mean):
F1 越高,表示模型既保持了不错的召回率,也保持了不错的精确率。
这在正负样本极度不平衡的任务中非常有用。
ROC 曲线(ROC curve, Receiver Operating Characteristic)
很多分类器(例如 Logistic 回归或带概率输出的 SVM)并不是直接输出 0/1,而是输出一个分数或概率。
我们可以选择一个阈值 $\tau$:
- 若分数 ,预测为正类;
- 若分数 ,预测为负类。
不同的 会产生不同的 (TP, FP, TN, FN)。
ROC 曲线以:
- 横轴为假阳性率(FPR,false positive rate)
- 纵轴为真阳性率(TPR,也就是 Recall)
把所有可能阈值下的点连接起来,就得到 ROC 曲线。
AUC(Area Under the ROC Curve)
AUC 是 ROC 曲线下的面积:
- 若 AUC 接近 1,表示模型几乎总能把正类的分数排在负类前面。
- 若 AUC 约为 0.5,说明模型几乎等同于随机猜测。
AUC 的优势是:它不依赖于固定的单一阈值,而是综合考察了所有可能阈值下的表现。
无监督学习(unsupervised learning)
目前为止,我们一直假设训练数据有标签(“下雨/不下雨”“批准/拒绝”)。
无监督学习放弃了这个假设:我们只有输入特征,没有标签。
定义
无监督学习的目标是在无标签的数据中自动发现结构和模式。
常见任务包括:
- 聚类(clustering):把相似的样本分到同一组。
- 降维(dimensionality reduction):把高维数据映射到低维空间,方便可视化或后续建模。
常见应用场景:
- 基因表达分析(发现功能相近的基因群)
- 医学影像分析(把相似的区域聚成一类)
- 市场细分 / 用户画像(把用户自动分成若干行为类型)
- 社交网络分析(发现社群结构)
K 均值聚类(k-means clustering)
K 均值聚类试图把数据分成 $k$ 个簇(clusters),并给出每个簇的质心(centroid),即该簇样本的平均位置。
算法步骤如下(迭代进行):
- 初始化(Initialization)
随机选择 个初始质心。
这些质心可以是随机挑选的 个样本点,或是随机生成的点。
- 分配步骤(Assignment step)
对于每个样本点 ,计算它到每个质心的距离(通常是欧氏距离)。
把 分配给“最近的”那个质心所在的簇。
这样,所有点被划分成 组。
- 更新步骤(Update step)
对于每一组簇,把该簇内所有样本的坐标取平均,得到新的质心位置。
也就是说,每个簇的质心被移动到当前簇点的平均值处。
- 重复
回到分配步骤,再次把每个点分配给最近的质心,然后更新质心。
这个循环会不断进行,直到质心几乎不再移动,或者簇分配不再变化。
可以把它理解为:“分配-平均-再分配-再平均”,直到稳定。
数学上,K 均值在最小化如下目标函数:
其中 是第 个簇的质心。
该目标 是“簇内平方误差和”(within-cluster sum of squares)。
K 均值的 Assignment step 和 Update step 轮流进行,会让 单调不增(不会上升)。因此算法必然收敛到某个稳定解(局部最优)。
这给了 K 均值一个简单但重要的正确性保证:它不是随意摆点,而是在逐步下降一个明确的目标函数。
总结
- 监督学习:利用带标签的数据来学习一个输入到输出的映射函数。
- 分类(classification):输出离散标签,常见方法包括 K 最近邻(KNN)、感知机(Perceptron)、Logistic 回归、支持向量机(SVM)、决策树、随机森林。
- 回归(regression):输出连续数值,线性回归是典型例子。
- 模型训练依赖损失函数(loss)和优化(optimization)。
- 感知机更新规则可被视为随机梯度下降。
- Logistic 回归使用 Sigmoid 把线性函数转成概率,并用交叉熵损失;其优化问题是凸的。
- SVM 通过最大化间隔选择“最安全”的分割超平面,并能通过核技巧处理非线性可分情况。
- 决策树用特征划分 + 基尼系数逐步生成 if-then 规则;随机森林用多棵树的集成来提升鲁棒性。
过拟合(overfitting)是核心风险:模型可能只是记住训练集,而没有学到泛化规律。
正则化(regularization)通过在代价函数中惩罚复杂度,抑制过拟合,从而提升泛化性能。
- 模型评估不能只看训练集。
- 使用保留法或 k 折交叉验证来评估泛化能力。
- 对分类模型,要通过混淆矩阵进一步计算召回率、精确率、F1、ROC、AUC 等指标,而不仅仅是准确率。
- 无监督学习即使没有标签,也能发现结构。
- K 均值聚类通过“分配-更新-再分配-再更新”最小化簇内平方误差,从而把数据自动分成若干簇。
上一篇
优化
下一篇
神经网络 I
Loading...
