# 吴恩达机器学习笔记 **Repository Path**: hey_hh/machinelearning ## Basic Information - **Project Name**: 吴恩达机器学习笔记 - **Description**: 吴恩达机器学习知识点汇总 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-01 - **Last Updated**: 2026-10-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 机器学习 ## 机器学习算法的组成 一个机器学习算法由以下内容组成 * 假设函数:定义输入和输出的映射关系,根据函数的表现形式决定当前任务的类型,如假设函数为线性函数,则当前任务为线性回归模型。 * 代价函数:代价函数是评估标准,用来衡量当前模型预测的结果和真实数据之间的差距。学习的目标是让这个值尽可能的笑。 * 优化算法:负责不断的调整参数,通过不断计算代价函数的实际值最终找到让代价函数最小的参数。 机器学习的过程就是用优化算法,把假设函数代入到代价函数中,不断迭代优化参数,当参数降到最低时就获得了训练好的线性回归模型。 | 组件 | 微调后的精确表述 | |------|---------------| | **假设函数 h(x)** | 义了输入 x 到输出 y 的映射形式,决定了模型的表达能力 | | **代价函数 J(θ)** | 它量化了当前参数下模型的“错误程度”,优化目标就是让 J(θ) 尽可能小 | | **优化算法** | 告诉你怎么更新 θ 才能让 J(θ) 下降(如梯度下降、正规方程) | ## 三者的关系(流程图) ```text 假设函数 h(x) ← 选什么模型 ↓ 代价函数 J(θ) ← 怎么才算好 ↓ 优化算法 ← 怎么变更好 ↓ 最优参数 θ ← 训练完成 ``` 后续任何算法(SVM、神经网络、决策树...),都可以进行拆解: | 算法 | 假设函数 | 代价函数 | 优化算法 | |------|---------|---------|---------| | 线性回归 | θᵀx | MSE(均方误差 Mean Squared Error) | 梯度下降 / 正规方程 | | 逻辑回归 | 1/(1+e^(-θᵀx)) | 交叉熵 | 梯度下降 | | 神经网络 | 多层复合函数 | 交叉熵 / MSE | 反向传播 | | SVM | 核函数映射 | 合页损失 | SMO / 拉格朗日对偶 | ## 完整的机器学习过程 * 收集数据 * 人工标注 * 模型选择及特征设计和数据处理 * 训练及调优和评估模型 * 开发应用和服务,加载模型 * 提供服务 与大模型相关概念笔记 ## 一、机器学习与深度学习的核心差异 1. **特征提取** - 机器学习:依赖人工设计特征。 - 深度学习:自动从原始数据中学习特征。 梯度下降 2. **模型复杂度与参数数量** - 机器学习:模型简单,参数少。 - 深度学习:模型复杂,参数多。 3. **样本数量要求** - 机器学习:中小规模数据即可。 - 深度学习:需海量数据。 ## 二、大模型细分领域微调 1. **数据量要求** - 文本类任务:几千到几万条高质量标注数据。 - 图像类任务:几百到几千张领域内图片。 - 关键影响因素:数据质量越高,所需数量可减少。 2. **过拟合缓解** - 技术手段:参数高效微调、数据增强、正则化。 - 优势:大模型预训练已积累海量知识,微调更像“校准”,少量精准数据可减少噪声干扰。 3. **参数调整方式** - **优先选择:参数高效微调** - 原理:冻结大模型大部分参数,仅训练新增的少量适配层或低秩矩阵。 - 优势:节省计算资源,降低过拟合风险,适合数据少、资源有限的场景。 - **全量微调**:需调整所有参数,对数据量和算力要求极高,细分领域微调极少使用。 # Agent(智能体 / 代理)核心概念笔记 ## 一、基本概念 **Agent** 是人工智能领域中的核心概念,指能够**感知环境**、**自主决策**并**执行任务**以实现特定目标的智能实体。 > 简单理解:它可以代理你去完成一些事情。 ## 二、四大核心能力 ### 1. 环境感知 - **方式**:通过视觉传感器、语音接口等多模态 **“感官”**。 - **功能**:实时获取环境数据。 ### 2. 智能决策 - **方式**:运用**深度学习模型**和**强化学习算法**。 - **功能**:进行复杂的分析与决策。 ### 3. 任务执行 - **方式**:调用API工具库或操控物理设备。 - **功能**:完成实际的、具体的工作任务。 ### 4. 持续进化 - **方式**:具备**自主学习**和**迁移学习**能力。 - **功能**:实现性能的持续提升与优化。 # Agent(智能体)核心架构解析 ## 主要模块概览 一个功能完善的智能体(Agent)通常由**规划、记忆、工具使用**三大核心模块构成。 ### 一、规划模块(“大脑”) 决策与控制中心,负责思考与规划。 - **任务拆解**:将复杂目标分解为可执行的具体步骤序列。 - **自我反思**:通过**思维链**或**ReAct**等框架评估行动,形成“规划-行动-观察-反思”循环,动态调整策略。 ### 二、记忆模块(“书架”) 知识与经验库,保障对话连贯性并利用历史信息。 - **短期记忆**:缓存当前对话的上下文,维持话题焦点。 - **长期记忆**:通过向量数据库等技术持久化存储关键历史与知识,支持快速检索与应用。 ### 三、工具使用模块(“工具箱”) 与外部世界交互的接口,扩展能力边界。 - **工具选择**:核心是**函数调度能力**,能根据描述准确调用外部工具API(如计算、搜索、查询等)来执行具体操作。 ## 模块协同工作流程 1. **接收任务**:感知用户指令。 2. **规划**:“大脑”拆解任务,制定计划。 3. **记忆检索**:“书架”提供相关背景与历史信息。 4. **执行**:“工具箱”被调用以完成外部操作(如搜索)。 5. **反思**:“大脑”评估结果,必要时修正计划,循环直至任务完成。 通过这种模块化协同,Agent能够实现自主规划、工具调用与持续学习,以应对复杂任务。 # Agent常见的四种模式 根据吴恩达(Andrew Ng)的总结,智能体(Agent)在完成任务时,主要遵循以下四种核心工作模式: ## 1. Reflection【反馈/反思模式】 - **核心机制**:模型通过**自我反思**来评估和改进其任务执行过程与结果。 - **典型方法与框架**:ReAct、Self-Refine、Reflection等。 - **作用**:形成“行动 → 观察结果 → 反思 → 优化”的循环,提升输出的质量和准确性。 ## 2. Tool Use【工具调用模式】 - **核心机制**:模型**调用外部工具、API或函数**来扩展其自身能力,解决纯文本模型无法直接处理的任务。 - **典型工具**:计算器、搜索引擎、数据库查询、代码解释器、专业软件API等。 - **作用**:突破大语言模型的固有局限,实现与真实世界的数据和服务交互。 ## 3. Planning【规划模式】 - **核心机制**:在执行任务前,先进行**多步骤的提前计划与组织**,将复杂目标拆解为有序的子任务序列。 - **典型方法**:思维链(CoT)规划、任务分解树等。 - **作用**:提升处理复杂任务的效率和逻辑性,避免盲目行动。 ## 4. Multi-agent Collaboration【多智能体协作模式】 - **核心机制**:**多个具备不同角色或专长的智能体之间进行协作与协商**,共同完成一项任务。 - **典型协议与框架**:A2A (Agent-to-Agent) 协议、CrewAI、AutoGen等。 - **作用**:通过分工、讨论和辩论,汇集集体智慧,处理单一智能体难以胜任的复杂、多维度问题。 --- **总结**:这四种模式并非互斥,一个强大的智能体系统通常会融合多种模式。例如,一个智能体可能先进行**规划**,然后**调用工具**执行子步骤,过程中不断进行**自我反思**调整,并在需要时与其他智能体**协作**。 # 机器学习 (ML)、深度学习 (DL)、强化学习 (RL) 核心概念辨析 ## 一、核心定义与关系 - **机器学习**:**总称与范式**。研究计算机如何从**数据**中学习规律,以完成预测或决策任务,而无需显式编程。 - **深度学习**:**机器学习的子集与工具**。通过构建**深层神经网络**来自动学习数据的多层次特征表示,是当前实现复杂任务(如图像、语音、自然语言处理)的主流方法。 - **强化学习**:**机器学习的另一范式**。关注**智能体**如何通过**与环境交互**,并根据获得的奖励(或惩罚)来学习一系列最优决策。 ## 二、三者的核心对比 | 维度 | 机器学习 | 深度学习 | 强化学习 | | :--- | :--- | :--- | :--- | | **核心目标** | 从数据中发现模式,用于**预测或分类**。 | 自动学习数据的**复杂特征表示**,以解决感知和识别任务。 | 学习一个能**最大化长期累积奖励**的最优决策策略。 | | **学习方式** | 监督学习(有标签)、无监督学习(无标签)、半监督学习。 | 多为监督学习,但也可用于无监督和强化学习(作为函数近似器)。 | **试错学习**。基于状态、动作、奖励、新状态的交互循环。 | | **数据需求** | 需要数据,其**质量与特征工程**对性能影响巨大。 | 需要**海量数据**和强大算力,能**自动进行特征工程**。 | 不依赖静态数据集,依赖**与环境交互产生的状态-动作序列**。 | | **模型/算法** | 线性回归、逻辑回归、决策树、SVM、K-Means等。 | 深度神经网络:CNN(视觉)、RNN/LSTM(序列)、Transformer(NLP)。 | Q-Learning, Policy Gradients, DQN, A3C, PPO等。 | | **人类参与** | 高度依赖人工进行**特征工程**和算法选择。 | 特征工程自动化,重点转向**网络架构设计、调参和数据准备**。 | 重点是**设计奖励函数、环境**和算法,引导智能体学习。 | | **典型应用** | 信用评分、客户分群、推荐系统(传统)、垃圾邮件过滤。 | 图像识别、语音助手、机器翻译、大语言模型、自动驾驶感知。 | 游戏AI、机器人控制、自动驾驶策略、资源优化、交易策略。 | ## 三、关键交集:深度强化学习 **深度强化学习** 是**深度学习**与**强化学习**的结合,代表了当前最前沿的方向之一。 - **原理**:使用**深度神经网络**来近似强化学习中的核心函数(如价值函数、策略函数),使智能体能直接从**高维原始输入**(如图像、文本)中学习决策。 - **意义**:解决了传统强化学习在**高维状态空间**下的表征和学习难题。 - **标志性成就**:AlphaGo、AlphaStar、在复杂视频游戏中超越人类的智能体。 ## 四、总结与类比 | 学习类型 | 核心比喻 | | :--- | :--- | | **机器学习** | **“从历史考卷中学习答题”**:分析大量已有题目和标准答案,总结出解题套路。 | | **深度学习** | **“拥有多层抽象理解能力的学生”**:不仅能看懂题目,还能自动拆解出题目背后的知识点、出题意图和深层逻辑。 | | **强化学习** | **“通过不断对弈学习下棋”**:没有标准答案,通过每一步的得失(奖励/惩罚)来领悟如何赢得整盘棋。 | **关系核心**: 1. **深度学习是机器学习的“利器”**,极大地提升了机器处理复杂数据的能力。 2. **强化学习是机器学习的“另一条路”**,专注于解决交互决策问题。 3. **深度强化学习是“强强联合”**,用深度学习的感知能力解决强化学习的复杂环境输入问题,是通向通用智能体的关键技术路径。 # 机器学习分类 * 监督学习 常见应用:语音识别、搜索广告、商品推荐、机器翻译、个性化新闻。 值为离散型时称为分类问题,为连续型称为回归问题。 * 无监督学习 常见应用:聚类、将为、神经网络预训练。 * 强化学习 常见应用:游戏、机器人、自动驾驶。 基本组件:环境、agent(与环境交互的对象)、动作、反馈(回报、奖赏)。 # 知识图谱 知识图谱的关键点可以概括为以下四个方面: 1. **图结构表示**:核心是用“图”来建模世界。图中的“节点”代表实体(如人物、地点、概念),“边”代表实体间的关系(如“出生于”、“位于”)。这种结构能直观、清晰地表达复杂的关联信息。 2. **构建与融合**:其价值依赖于高质量的数据。关键过程包括从多源、异构的数据(文本、数据库等)中抽取实体和关系,并进行知识融合,消除冲突,形成一个统一、可信的知识库。 3. **推理与发现**:不仅存储已知事实,还能通过逻辑规则或图算法进行推理,发现实体间隐藏的、未明确陈述的关系,从而扩展知识,实现更深入的洞察。 4. **智能应用基石**:作为底层知识库,是提升人工智能系统理解能力和可解释性的关键。它广泛应用于增强搜索引擎(提供直接答案和关联探索)、智能问答、个性化推荐、风险分析等需要深度语义理解的场景。 简单来说,知识图谱是将信息组织成一张机器能理解的“关系网”,并通过构建、推理来驱动各类智能应用 # 向量说明 **后续使用【,】表示行向量[x1,x2],使用【;】表示列向量[x1;x2]^T^。** # 误差 * 泛化误差 在未来的样本上的误差 * 经验误差 在训练集上的误差(训练误差) 误差并非越小越好,可能导致overfitting 过拟合、过配 underfitting 欠拟合 # 模型选择的关键问题 * 评估方法:如何获得测试结果 * 性能度量:如何评估性能优劣 * 比较检验:如何判断实质差别 # 评估方法 测试集应该和训练集互斥 * 留出法(hold-out) * 交叉验证法(cross validation) * 自助法(bootstrap) ## 留出法 ### 注意事项 * 保持数据分布一致性(例如:分层采样) * 多次重复划分(例如:100次随机划分) * 测试集不能太大、不能太小(例如:1/5~1/3) * 需要从数据集中留出部分数据进行训练,确认模型误差较小后再对全量数据进行训练得到结果模型 ### 缺陷 由于使用随机划分,可能导致部分数据始终未经过训练、测试。若此数据对模型较为重要将会导致模型性能交叉 ## K-折(k倍)交叉验证法(k-fold) ### 特征 将数据分为k分,每次选其中一份作为测试集,经过轮转训练后便完整的对所有数据集进行了训练。 ### 注意事项 不同的切分方式将对模型的性能造成扰动,可再做若干次随机切分减小扰动,即10x10次验证。 ### 备注 可以在每次切分时只保留一条数据作为测试集,即留一法,(leave-one-out,LOO)。由于测试数据过少,此时可能导致测试偏差较大, ## 自助法 基于“自助采样”(bootstrap sampling),亦称“有放回采样”、“可重复采样” ### 特征 每次随机采样出需要个数的样本(M个样本,取样M次)。 根据极限得到约有36.8%的样本不出现。 ```math \lim_{m \to \infty} \left( 1 - \frac{1}{m} \right)^m = \frac{1}{e} \approx 0.368 ``` **“包外估计”**(out-of-bag estimation) ### 缺陷 * 训练集与远样本集同规模 * 数据分布有所改变(如果数据分布影响较小、数据量较少时可以使用) # 调参与最终模型 * 算法的参数:一般由人工设定,亦称“超参数” * 模型的参数:一般由学习确定 调参过程类似:先产生若干模型,然后基于某种评估方法进行选择 参数调整的好坏对模型的性能有关键影响 * 训练集 * 测试集 * 验证集(validation set):用来和测试集分开,专门用来调参,从训练集中留出一部分。**避免从测试集中选取数据用于测试集直接使用**。 **算法参数选定后,要用训练集+验证集重新训练最终模型** # 性能度量 **性能度量(performance measure)是衡量模型泛化能力的评价标准,反映了任务需求。 使用不同的性能度量会导致不同的评判结果** **什么样的模型是“好”的,不仅取决于算法和数据,还取决于任务需求。** ## 均方误差(二次误差、平方误差),回归任务常常使用 ```math E(f;D) = \frac{1}{m} \sum{i=1}^{m} (f(\boldsymbol{x}i) - y_i)^2 ``` ## 错误率 ```math E(f;D) = \frac{1}{m} \sum{i=1}^{m} \mathbb{I}(f(\boldsymbol{x}i) ``` ## 精度 ```math \begin{aligned} \operatorname{acc}(f;D) &= \frac{1}{m} \sum{i=1}^{m} \mathbb{I}(f(\boldsymbol{x}i) = y_i) \ &= 1 - E(f;D). \end{aligned} ``` ## 查准率 VS. 查全率 分类结果混淆矩阵 | | | | | - | - | - | | | **预测结果** | | | **真实情况** | **正例** | **反例** | | **正例** | TP (真正例) | FN (假反例) | | **反例** | FP (假正例) | TN (真反例) | 查准率 (Precision) 用于衡量预测为正例的样本中有多少是真实的。 ```math P = \frac{TP}{TP + FP} ``` 查全率 (Recall) 用于衡量所有真实的样本中有多少被成功预测出来了。 ```math R = \frac{TP}{TP + FN} ``` ## F1度量及其调和平均数 优于算数平均,使得较小的值不会被忽视。 F1 度量的基本定义及变形 ```math \begin{equation} \begin{aligned} F1 &= \frac{2 \times P \times R}{P + R} \\ &= \frac{2 \times TP}{\text{样例总数} + TP - TN} \end{aligned} \end{equation} ``` F1 度量的调和平均数形式 ```math \begin{equation} \frac{1}{F1} = \frac{1}{2} \left( \frac{1}{P} + \frac{1}{R} \right) \end{equation} ``` 若对查准率、查全率有不同的偏好 Fβ2度量的主公式及其调和平均数形式 ```math F_\beta = \frac{(1 + \beta^2) \times P \times R}{(\beta^2 \times P) + R} ``` ```math \frac{1}{F_\beta} = \frac{1}{1 + \beta^2} \cdot \left( \frac{1}{P} + \frac{\beta^2}{R} \right) ``` # 比较校验 **在得到某种度量下的评估结果后,无法直接比较以评判优劣。** * 测试性能不等于泛化性能 * 测试性能随测试集的变化而变化 * 很多机器学习算法本身有一定的随机性 **机器学习寻找的是概率近似正确** ## 常用方法 统计假设经验(hypothesis test)为学习器性能比较提供了重要依据。 两学习器比较 * 交叉验证t检验(基于成对t检验) * k折交叉验证;5x2交叉验证 * McNemar检验(基于列联表,卡方检验)考虑反对角线中的差异 | | A2 | | | --- | --- | --- | | A1 | 双方都认为是正确的数据| A1正确 A2错误 | | | A1错误 A2正确 | 双方都认为是错误的数据| # 线性模型 ## 核心任务 线性模型主要解决两大基础机器学习任务: * **分类 (Classification)**:预测离散的类别标签。目标是找到一个边界(如直线),将不同类别的数据点分开。 * **回归 (Regression)**:预测连续的数值。目标是找到一条趋势线,使得数据点尽可能贴近这条线。线性回归非常擅长处理数值类型的属性。 ## 数学模型 线性模型试图学习一个通过属性的**线性组合**来进行预测的函数。 * **一般形式**: * x_i:输入特征的属性值。 * w_i:对应特征的权重(系数),表示特征的重要性。 * b:偏置项(截距),用于调整决策边界的起点。 ```math f(x) = w_1x_1 + w_2x_2 + \dots + w_dx_d + b ``` * **向量形式**(更简洁的表达): * w:权重向量。 * x:输入特征向量。 * w^T^x:向量的点积运算。 ```math f(x) = \mathbf{w}^\mathrm{T}\mathbf{x} + b ``` 基于图片内容,为您整理线性回归的核心公式笔记如下: ## 线性回归 ```math f(x_i) = wx_i + b \quad \text{使得} \quad f(x_i) \simeq y_i ``` * **模型表达式**: * x_i:输入样本的特征值。 * w:模型的权重参数。 * b:模型的偏置项。 * **学习目标**:f(xi)≃y * yi:样本的真实标签(目标值)。 * ≃:表示通过训练,使模型的预测值无限逼近真实值。 离散属性的处理:若有序,则连续化;否则,转化为k维向量。 令均方误差最小化,有 ```math \begin{align*} (w^*, b^*) &= \arg \min_{(w,b)} \sum_{i=1}^{m} (f(x_i) - y_i)^2 \\ &= \arg \min_{(w,b)} \sum_{i=1}^{m} (y_i - wx_i - b)^2 \end{align*} ``` 对下式进行最小二乘参数估计 ```math E_{(w,b)} = \sum_{i=1}^{m} (y_i - wx_i - b)^2 ``` 分别对w、b求偏导 ```math \begin{aligned} \frac{\partial E_{(w,b)}}{\partial w} &= 2 \left( w \sum_{i=1}^{m} x_i^2 - \sum_{i=1}^{m} (y_i - b)x_i \right) \\ \frac{\partial E_{(w,b)}}{\partial b} &= 2 \left( mb - \sum_{i=1}^{m} (y_i - wx_i) \right) \end{aligned} ``` **令导数为0,得到闭式(closed-form)解** ```math w = \frac{\sum{i=1}^{m} y_i (x_i - \bar{x})}{\sum{i=1}^{m} x_i^2 - \frac{1}{m} \left( \sum{i=1}^{m} x_i \right)^2} \quad b = \frac{1}{m} \sum{i=1}^{m} (y_i - w x_i) ``` **这套公式被称为线性回归的闭式解 (Closed-form Solution)​ 或 正规方程 (Normal Equation)​ 的一维形式。 优点:直接套用公式就能算出最优解,不需要像梯度下降那样迭代。 缺点:当特征维度很高(比如有上万个特征)时,计算量巨大(因为涉及到矩阵求逆),此时梯度下降法更有效。** **对于大规模数据集,X可能本身就无法完整装入内存: 解析解需要一次性加载所有数据到内存。 梯度下降可以使用小批量(mini-batch)处理,一次只加载部分数据** **求偏导就是计算变化率** **目的为求极值点(极值点为0时,即变化停止的点)** # 多元(Multi-variate)线性回归 ```math \begin{aligned} & f(\boldsymbol{x}_i) = \boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_i + b \quad \text{使得} \quad f(\boldsymbol{x}_i) \sim y_i \\ & \boldsymbol{x}_i = (x_{i1}; x_{i2}; \ldots; x_{id}) \qquad\qquad y_i \in \mathbb{R} \end{aligned} ``` - **f(xᵢ)**:线性模型的预测函数,表示对输入样本 xᵢ 的预测值。 - **wᵀ**:权重向量 w 的转置。 - **xᵢ**:第 i 个样本的特征向量。 - **b**:偏置项(截距)。 - **wᵀxᵢ + b**:输入样本 xᵢ 经过线性变换后的结果。 - **~**:表示“逼近”或“拟合”。 - **yᵢ**:第 i 个样本的真实标签(目标值)。 - **xᵢ = (xᵢ₁; xᵢ₂; ...; xᵢd)**:表示 xᵢ 是一个 d 维的特征向量。 - **yᵢ ∈ R**:表示真实标签 yᵢ 是一个实数。 **把w和b吸收入向量形式ŵ=(w;b)数据集表示为** ```math \begin{aligned} \mathbf{X} &= \begin{pmatrix} x_{11} & x_{12} & \cdots & x_{1d} & 1 \\ x_{21} & x_{22} & \cdots & x_{2d} & 1 \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ x_{m1} & x_{m2} & \cdots & x_{md} & 1 \end{pmatrix} = \begin{pmatrix} \mathbf{x}_1^{\mathrm{T}} & 1 \\ \mathbf{x}_2^{\mathrm{T}} & 1 \\ \vdots & \vdots \\ \mathbf{x}_m^{\mathrm{T}} & 1 \end{pmatrix} \\[2em] \mathbf{y} &= (y_1; y_2; \ldots; y_m) \end{aligned} ``` ### 说明 * **背景操作**:这一步是将模型的权重向量 w 和偏置项 b 合并为一个新的向量 ŵ。为了方便矩阵运算,通常在原始数据集的每一行特征末尾手动添加一个常数 1。 * **左侧矩阵 f(X)**: * 这是添加了全 1 列后的新设计矩阵。 * 矩阵的维度是 m x (d+1),其中 m 是样本总数,d 是原始特征数。 * 最后一列全为 1,专门用于与合并后的偏置项进行相乘。 * **右侧矩阵**: * 这是左侧矩阵的紧凑写法。 ```math x_i^T ``` 代表第 i 个样本的 d 维特征向量转置(即行向量形式)。 * **向量 y**: * 这是一个 m x 1 的列向量,包含了所有 m 个样本的真实标签(目标值)。 同样采用最小二乘法求解,有: ```math \boldsymbol{w}^* = \arg \min_{\boldsymbol{w}} (\boldsymbol{y} - \mathbf{X}\boldsymbol{w})^{\text{T}} (\boldsymbol{y} - \mathbf{X}\boldsymbol{w}) ``` 令 ```math E_{\hat{\boldsymbol{w}}} = (\boldsymbol{y} - \mathbf{X}\hat{\boldsymbol{w}})^{\text{T}} (\boldsymbol{y} - \mathbf{X}\hat{\boldsymbol{w}}) ``` ,对w求导: ```math \frac{\partial E_{\hat{\boldsymbol{w}}}}{\partial \boldsymbol{w}} = 2\mathbf{X}^{\text{T}} (\mathbf{X}\hat{\boldsymbol{w}} - \boldsymbol{y}) \quad ``` 令其为零可得 w **涉及矩阵求逆**。 * 若 ```math X^TX ``` 满秩或正定,则 ```math \hat{w}^* = (X^T X)^{-1} X^T y ``` * 若 ```math X^TX ``` 不满秩,则可解出多个ŵ 此时需求助于归纳偏好,或引入正则化(regularization) # 线性模型的变化 对于(x,y),y∈R, 希望线性模型的预测值逼近真是标记,则得到线性回归模型 ```math y=w^Tx+b ``` 如何令预测值逼近y的衍生物? 如另y'逼近对数 ```math lny=w^Tx+b ``` 则得到对数线性回归(log-linear regression) 实际上是在用 ```math e^{w^{T} x + b} ``` 逼近y # 广义线性模型 一般形式 ```math y=g^{-1}(w^Tx+b) ``` 其中 ```math g^-1 ``` 为单调可微的**联系函数(link function)** 令 ```math g(.)=ln(.) ``` 则得到对数线性回归 ```math lny=w^Tx+b ``` 联系函数:将线性回归产生的结果和真正想要的结果联系起来。 基于此思想,可以考虑如何使用回归的模型来解决分类的问题。 # 二分类问题 线性回归模型产生的实值输出 ```math \begin{cases} z=w^Tx+b ,\\[2pt] y∈{0,1} \end{cases} ``` 找z和y的联系函数。 理想的单位阶跃函数(unit-step function) ```math y=\begin{cases} 0, & z<0,\\[2pt] 0.5, & z=0,\\[2pt] 1, & z>0. \end{cases} ``` 性质不好,需找"替代函数"(surrogate function) 常用单调可微、任意阶可导 ```math y=\frac{1}{1+e^{-z}} ``` **对数几率函数(logistic function)** 简称"对率函数" # 对率回归 以对率函数为联系函数 ```math y=\frac{1}{1+e^{-z}} ``` 变为 ```math y=\frac{1}{1+e^{-w^Tx+b}} ``` 即 ```math ln\frac{y}{1-y}=w^Tx+b ``` y/(1-y)为几率(odds),反映了x作为正例的相对可能性。 增加对数后则形成对数几率(log odds,亦称logit)。 **对数几率回归**(logistic regression)简称**对率回归**。 * 无需实现假设数据分布 * 可得到"类别"的近似概率预测 * 可直接应用现有数值优化算法求解最优解 **此方法为分类学习算法** ## 对率回归求解思路 **1. 类后验概率与对数几率** 在逻辑回归中,将输出 y 看作类后验概率估计 ```math p(y=1|x) ``` 。结合上一轮推导的对数几率公式,可进行如下替换: - 原公式: ```math ln \frac{y}{1-y} = w^T x + b ``` - 概率形式 ```math ln \frac{p(y=1|x)}{p(y=0|x)} = w^T x + b ``` (注:分母 1-y 对应负类概率 p(y=0|x)) **2. 参数估计方法** 基于上述概率模型,逻辑回归使用**极大似然法**来估计模型参数 (w, b)。 **3. 数据集表示** 给定包含 m 个样本的数据集: ```math \{(x_i, y_i)\}_{i=1}^m ``` **4. 最大化对数似然函数** 为了找到最优参数,需要最大化以下**对数似然函数**: ```math \ell(w, b) = \sum_{i=1}^m \ln p(y_i | x_i; w, b) ``` 明白了,我会严格按照您的要求,将所有公式使用 ```math ... ``` 包裹。以下是重新整理的笔记: ### 逻辑回归极大似然估计推导与优化 **1. 参数与特征的增广合并** 为了数学表达和后续计算的简便,将权重向量 w 与偏置项 b 合并,同时将特征向量 x 进行增广: - 令参数向量 ```math {\beta} = (w; b) ``` - 令增广特征向量 ```math \hat{\boldsymbol{x}} = (x; 1) ``` - 此时,线性组合 ```math w^T x + b ``` 可简写为 ```math {\beta}^T \hat{\boldsymbol{x}} ``` **2. 正负类概率的重新定义** 基于合并后的参数和特征,定义正类和负类的后验概率: - 正类概率: ```math p_1(\hat{x}_i; \boldsymbol{\beta}) = p(y=1 \mid \hat{x}; \boldsymbol{\beta}) = \frac{e^{w^T x + b}}{1 + e^{w^T x + b}} ``` - 负类概率: ```math p_0(\hat{x}_i; \boldsymbol{\beta}) = p(y=0 \mid \hat{x}; \boldsymbol{\beta}) = 1 - p_1(\hat{x}_i; \boldsymbol{\beta}) = \frac{1}{1 + e^{w^T x + b}} ``` **3. 似然项的统一重写** 为了将正负类的似然项统一为一个表达式,引入真实标签 y_i(取值为0或1): - 重写后的似然项: ```math p(y_i \mid x_i; w, b) = y_i p_1(\hat{x}_i; \boldsymbol{\beta}) + (1 - y_i) p_0(\hat{x}_i; \boldsymbol{\beta}) ``` (注:当 y_i=1 时取 p_1,当 y_i=0 时取 p_0) **4. 最大化似然函数** 结合上一轮笔记,最大化对数似然函数的目标为: ```math \ell(w, b) = \sum_{i=1}^m \ln p(y_i \mid x_i; w, b) ``` **5. 等价转化为最小化问题** 将上述概率表达式代入对数似然函数,经过数学推导,最大化该似然函数等价于最小化以下目标函数: ```math \ell(\boldsymbol{\beta}) = \sum_{i=1}^m \left( -y_i \boldsymbol{\beta}^T \hat{x}_i + \ln(1 + e^{\boldsymbol{\beta}^T \hat{x}_i}) \right) ``` (注:这实际上就是逻辑回归的**交叉熵损失函数**) **6. 优化求解方法** - 该目标函数是一个**高阶可导连续凸函数**。 - 因此,可以使用经典的数值优化方法进行求解,如**梯度下降法**或**牛顿法**。 # 梯度下降 # 梯度下降算法(Gradient Descent Algorithm)笔记 ## 核心更新公式 repeat until convergence ```math θ_j := θ_j - α * \frac{∂}{∂θ_j} J(θ_0, θ_1) ``` ## 公式符号与直观含义 - **θ_j**:模型参数(如截距 θ_0 和斜率 θ_1)。`:=` 表示赋值更新。 - **α(Learning rate)**:**学习率**。控制每次参数更新的步子迈多大。 - **(∂/∂θ_j) J(θ_0, θ_1)(Derivative)**:**偏导数项**。表示代价函数 J 在参数 θ_j 方向上的变化率(梯度)。 - **J(θ_0, θ_1)**:代价函数(Cost Function),用于衡量模型预测值与真实值的误差。 ## 关键执行规则 - **同步更新(Simultaneously update)**:必须**同时更新** j=0 和 j=1 的参数。 - 正确做法:先计算好所有参数的更新量,然后同时赋值。 - 错误做法:先更新 θ_0,再用更新后的 θ_0 去计算 θ_1(这会破坏算法逻辑)。 ## 算法直观理解 - **循环条件**:`repeat until convergence`,即不断重复更新步骤,直到参数收敛(变化极小,说明找到了误差最小的谷底)。 - **找谷底比喻**:找最低点就像下山。 - **偏导数(梯度)**:告诉你当下该往哪个方向走(最陡峭的下山方向)。 - **学习率(α)**:决定你每一步迈多大。 - **学习率设置注意事项**: - 如果 α 太小:下山速度极慢,计算耗时。 - 如果 α 太大:可能步子跨过头,永远到不了谷底(甚至越走越高)。 ## 自动收敛 **即使在学习率 α 固定的情况下,梯度下降也可能收敛至局部最小值。** θ₁ := θ₁ − α ∂/∂θ₁ J(θ₁) 越接近局部最小值时导数越小,从而和α的乘积也越小,在图像上的表现就是步长缩小。 **因此,在线性回归这种凸函数场景下,即使学习率 α 自始至终保持不变,梯度下降也能安全、自动地收敛到局部最小值(谷底)。** ## 梯队下降容易遇到局部最优解的情况,但是在线性回归的代价函数是凸函数(弓状函数,只会有一个最小值,即只有一个全局最优,不会存在局部最优) ## 批量梯度下降 batch gradient descent 每次更新参数时,使用全部训练样本计算梯度。 ## 随机梯度下降 Stochastic Gradient Descent 每次只用一个随机样本计算梯度,更新频繁,波动大,但能跳出局部极值,适合大规模数据。 ## 小批量梯度下降 Mini-batch Gradient Descent 每次使用一小批样本(如32、128),兼顾速度和稳定性,是深度学习中常用的版本。 # 最小平方代价 ```math J(\theta_0, \theta_1) = \frac{1}{2m} \sum_{i=1}^m \big( h_\theta(x^{(i)}) - y^{(i)} \big)^2 ``` # 矩阵计算 通过使用SIMD(单指令多数据流)进行并行计算来优化性能。 我继续帮你把剩下的部分改完。你改的思路是对的——把公式放进 ```` ```math ```` 代码块就能正常渲染,所以我把笔记里**残留的所有 `$...$` 行内公式全部清理掉**,简短的数学关系改用「纯文本 + Unicode 符号」(如 m×n、Aᵀ、≠),需要展示的公式则统一提取到 ```` ```math ```` 块里。同时顺手修掉了几处断行和多余标点(比如"- ,假设函数")。 以下是完整修改后的版本,可以直接复制: --- # 吴恩达机器学习 - 线性代数基础复习笔记 ## 一、矩阵加法 - **规则**:相同维度的矩阵可以相加(对应位置元素相加)。 - **示例**: ```math \begin{bmatrix} 1 & 0 \\ 2 & 5 \\ 3 & 1 \end{bmatrix}_{3 \times 2} + \begin{bmatrix} 4 & 0.5 \\ 2 & 5 \\ 0 & 1 \end{bmatrix}_{3 \times 2} = \begin{bmatrix} 5 & 0.5 \\ 4 & 10 \\ 3 & 2 \end{bmatrix}_{3 \times 2} ``` ## 二、标量乘矩阵 - **规则**:标量与矩阵每个元素分别相乘。 - **性质**:支持交换律(cA = Ac)。 - **示例**: ```math 3 \times \begin{bmatrix} 1 & 0 \\ 2 & 5 \\ 3 & 1 \end{bmatrix} = \begin{bmatrix} 3 & 0 \\ 6 & 15 \\ 9 & 3 \end{bmatrix} ``` ## 三、矩阵与向量乘法 - **规则**:矩阵 m×n 乘以向量 n×1,结果为 m×1 的向量(行元素与列元素对应相乘再相加)。 - **示例**: ```math \begin{bmatrix} 1 & 3 \\ 4 & 0 \\ 2 & 1 \end{bmatrix}_{3 \times 2} \begin{bmatrix} 1 \\ 5 \end{bmatrix}_{2 \times 1} = \begin{bmatrix} 1\times1 + 3\times5 \\ 4\times1 + 0\times5 \\ 2\times1 + 1\times5 \end{bmatrix} = \begin{bmatrix} 16 \\ 4 \\ 7 \end{bmatrix}_{3 \times 1} ``` ## 四、矩阵在线性回归中的应用(预测) - **场景**:房屋面积(House Sizes)数据: ```math [2104, 1416, 1534, 852]^T ``` 假设函数: ```math h_\theta(x) = -40 + 0.25x ``` - **矩阵化计算**: ```math \begin{bmatrix} 1 & 2104 \\ 1 & 1416 \\ 1 & 1534 \\ 1 & 852 \end{bmatrix}_{4 \times 2} \times \begin{bmatrix} -40 \\ 0.25 \end{bmatrix}_{2 \times 1} = \begin{bmatrix} -40 + 2104 \times 0.25 \\ -40 + 1416 \times 0.25 \\ -40 + 1534 \times 0.25 \\ -40 + 852 \times 0.25 \end{bmatrix}_{4 \times 1} ``` - **多假设同时计算**:若有 3 个竞争假设: 假设 1: ```math h_\theta(x) = -40 + 0.25x ``` 假设 2: ```math h_\theta(x) = 200 + 0.1x ``` 假设 3: ```math h_\theta(x) = -150 + 0.4x ``` 参数矩阵为: ```math \begin{bmatrix} -40 & 200 & -150 \\ 0.25 & 0.1 & 0.4 \end{bmatrix} ``` 则预测结果为(矩阵 X 乘参数矩阵): ```math \begin{bmatrix} 1 & 2104 \\ 1 & 1416 \\ 1 & 1534 \\ 1 & 852 \end{bmatrix} \begin{bmatrix} -40 & 200 & -150 \\ 0.25 & 0.1 & 0.4 \end{bmatrix} = \begin{bmatrix} 486 & 410 & 692 \\ 314 & 342 & 416 \\ 344 & 353 & 464 \\ 173 & 285 & 191 \end{bmatrix} ``` - **计算加速**:可通过专用线性代数函数库驱动 SIMD 加速计算。 ## 五、矩阵与矩阵乘法 - **规则**:左矩阵列数 = 右矩阵行数。结果维度为(左矩阵行数 × 右矩阵列数)。 - **性质**:**不支持交换律**(AB ≠ BA),但**支持结合律**。 - **示例**: ```math \begin{bmatrix} 1 & 3 & 2 \\ 4 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 3 \\ 0 & 1 \\ 5 & 2 \end{bmatrix} = \begin{bmatrix} 11 & 10 \\ 9 & 14 \end{bmatrix} ``` - **本质**:矩阵乘矩阵等价于用左矩阵依次乘右矩阵的每一列向量。 - 乘第一列: ```math \begin{bmatrix} 1 & 3 & 2 \\ 4 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 \\ 0 \\ 5 \end{bmatrix} = \begin{bmatrix} 11 \\ 9 \end{bmatrix} ``` - 乘第二列: ```math \begin{bmatrix} 1 & 3 & 2 \\ 4 & 0 & 1 \end{bmatrix} \begin{bmatrix} 3 \\ 1 \\ 2 \end{bmatrix} = \begin{bmatrix} 10 \\ 14 \end{bmatrix} ``` ## 六、单位矩阵(I) - **性质**:主对角线为 1,其余为 0 的方阵。满足: ```math A \cdot I = I \cdot A = A ``` - **维度说明**:若 A 为 m×n,则左乘的单位阵为 m×m,右乘的单位阵为 n×n。 ## 七、逆矩阵 - **前提**:**只有方阵**(且非奇异 / 满秩)才有逆矩阵。 - **定义**: ```math A A^{-1} = A^{-1} A = I ``` - **示例**: ```math \begin{bmatrix} 3 & 4 \\ 2 & 16 \end{bmatrix} \begin{bmatrix} 0.4 & -0.1 \\ -0.05 & 0.075 \end{bmatrix} = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} = I_{2 \times 2} ``` (注:左矩阵左上角手写略模糊,结合逆矩阵计算结果反推为 3) ## 八、转置矩阵 - **规则**:沿主对角线翻转,元素满足: ```math B_{ij} = A_{ji} ``` - **维度变化**:若 A 为 m×n,则 A 的转置(记作 Aᵀ 或 A^T)为 n×m。 - **示例**: ```math A = \begin{bmatrix} 1 & 2 & 0 \\ 3 & 5 & 9 \end{bmatrix}_{m \times n} \implies A^T = \begin{bmatrix} 1 & 3 \\ 2 & 5 \\ 0 & 9 \end{bmatrix}_{n \times m} ``` --- **补充说明**: - 矩阵乘法不满足交换律,但在计算逆矩阵时 A·A⁻¹ = A⁻¹·A = I 是特例。 - 若矩阵行列式为 0(如特征共线性),则逆矩阵不存在,此时线性回归需借助伪逆或岭回归求解。 我来处理这份笔记,把其中需要用 ```` ```math ```` 代码块包裹的数学公式都规范好(沿用你之前定下的风格:行内简短符号保留纯文本/Unicode,需要独立展示的矩阵、公式全部进 math 块),其余内容保持不动。 以下是处理好的版本: --- # 从单特征到多特征:符号约定与假设函数 ### 1. 核心思想:从单特征到多特征 之前的模型只用 1 个特征(如房屋面积)预测价格;现实中需要多个特征(面积、卧室数、楼层、房龄等)。 - 记 **n** 为特征数量。 - 第 i 个样本的特征向量记为 **x⁽ⁱ⁾**,其第 j 个特征记为 **xⱼ⁽ⁱ⁾**。 ### 2. 假设函数(Hypothesis) 引入"多特征"后,假设函数变为各特征的线性组合,并约定 **x₀ = 1**(对应偏置项 θ₀): ```math h_\theta(x) = \theta_0 + \theta_1 x_1 + \theta_2 x_2 + \dots + \theta_n x_n ``` 用向量内积简写为(非常关键,后续 NumPy 直接用它): ```math h_\theta(x) = \theta^T x ``` 其中参数向量 θ 和特征向量 x 都是 n+1 维。 **一句话记忆**:预测 = 参数向量转置 × 特征向量,从此模型能吃进多个维度数据。 --- # 多元梯度下降(Gradient Descent for Multiple Variables) ### 1. 核心思想:从单变量到多变量的梯度下降 单变量时,我们同时更新 θ₀ 和 θ₁。多变量时,参数扩展到 n+1 个(θ₀, θ₁, ..., θₙ),更新规则形式上完全一致,只是每个 θⱼ 对应的特征不同。 ### 2. 梯度下降更新规则 **单变量(n=1)**: ```math \theta_0 := \theta_0 - \alpha \frac{1}{m} \sum_{i=1}^{m} \left( h_\theta(x^{(i)}) - y^{(i)} \right) \cdot 1 ``` ```math \theta_1 := \theta_1 - \alpha \frac{1}{m} \sum_{i=1}^{m} \left( h_\theta(x^{(i)}) - y^{(i)} \right) \cdot x^{(i)} ``` **多变量(n≥1)**: ```math \theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m} \left( h_\theta(x^{(i)}) - y^{(i)} \right) x_j^{(i)} ``` 对所有 j = 0, 1, ..., n **同时更新**。 ### 3. 为什么 θⱼ 更新时要乘 xⱼ⁽ⁱ⁾? 这是由**链式求导法则**决定的: - 代价函数对 θⱼ 求偏导时,外层平方求导产生误差项 (h_θ - y)。 - 内层对 θⱼ 求导时,假设函数中只有 θⱼ xⱼ⁽ⁱ⁾ 这一项包含 θⱼ,对其求导得到系数 xⱼ⁽ⁱ⁾。 - 所以偏导结果 = 误差 × 对应特征值。 **特例**:θ₀ 对应 x₀ = 1,所以 θ₀ 的更新式不显式乘特征(等价于乘 1)。 ### 4. 关键规则:同步更新(Simultaneous Update) 每次迭代中,所有 θ₀, θ₁, ..., θₙ 必须**同时更新**: - ✅ **正确做法**:先用旧参数算出所有新值,再一次性赋值。 - ❌ **错误做法**:先更新 θ₀,然后用新 θ₀ 去算 θ₁——这不再是标准梯度下降。 ### 5. 向量化形式(为后续 NumPy 铺垫) 整个更新规则可以用矩阵运算写成一行: ```math \theta := \theta - \alpha \frac{1}{m} X^T (X\theta - y) ``` 其中: - X 是 m × (n+1) 的特征矩阵(第一列为 1) - θ 是 (n+1) × 1 的参数向量 - y 是 m × 1 的目标向量 对应 Python 代码(学完 NumPy 后可直接运行): ```python theta = theta - (alpha / m) * (X.T @ (X @ theta - y)) ``` **一句话记忆**:多变量梯度下降 = 单变量规则的直接推广,每个 θⱼ 更新时乘以对应的特征 xⱼ,所有参数同步更新。 以下是按规范(行内符号用纯文本/Unicode,独立公式进 ```` ```math ```` 块)整理的笔记: --- # 特征缩放(Feature Scaling) ### 1. 为什么需要特征缩放? **当不同特征的取值范围差异过大时,梯度下降会收敛缓慢。** **示例**: - 房屋面积:300 ~ 2000 平方英尺 - 卧室数量:1 ~ 5 间 面积数值远大于卧室数,导致代价函数的等高线图呈**狭长椭圆形**。梯度下降在这种地形中来回震荡(zigzag),需要更多迭代才能到达最小值。 ### 2. 特征缩放的作用 将所有特征缩放到相近的取值范围(如 -1 ~ 1 或 0 ~ 1),使等高线图更接近圆形,梯度下降直接指向圆心方向,收敛速度大幅提升。 ### 3. 常用方法:均值归一化(Mean Normalization) ```math x_j := \frac{x_j - \mu_j}{\sigma_j} ``` 其中: - μⱼ 是第 j 个特征的均值 - σⱼ 是第 j 个特征的标准差 **处理后效果**: - 均值变为 0 - 标准差变为 1 ### 4. 为什么标准差会变成 1? 这是由方差的性质决定的。设原始特征为 X,标准差为 σ_X: ```math Z = \frac{X - \mu_X}{\sigma_X} ``` 标准差会变成 1,原因就一句话: **新数据 Z = (X - μ) / σ 的单位就是“标准差”本身。** 具体看定义: ```math \text{原始方差 } \sigma^2 = \frac{1}{m}\sum(X_i - \mu)^2 ``` 经过变换后: ```math \text{新方差} = \frac{1}{m}\sum\left(\frac{X_i-\mu}{\sigma}\right)^2 = \frac{1}{\sigma^2} \cdot \frac{1}{m}\sum(X_i-\mu)^2 = \frac{1}{\sigma^2} \cdot \sigma^2 = 1 ``` **本质**:用“原始数据的平均波动幅度(σ)”去量每个数据的波动幅度,那平均下来自然就是 **1 倍的平均波动幅度**。 就像用“米”去量一根正好 1 米长的棍子,结果必然是 1。 标准差 = 方差的平方根,所以 std(Z) = 1。 ### 5. 另一种方法:Min-Max 缩放 ```math x_j := \frac{x_j - \min(x_j)}{\max(x_j) - \min(x_j)} ``` 处理后特征范围在 0 ~ 1 之间,但不保证标准差为 1。 ### 6. 什么时候需要特征缩放? | 情况 | 是否需要缩放 | |------|-------------| | 特征量级差异巨大(如 0~1 和 1000~2000) | **必须缩放**,否则可能发散 | | 特征量级差异较小(如 0~10 和 0~20) | 通常不需要,梯度下降仍能正常工作 | | 所有特征已在相近范围(如 -3 ~ 3) | 不需要 | **经验法则**:如果一个特征的取值范围大致在 -3 ~ 3 之外,或者与其他特征不在同一量级,就应该考虑特征缩放。 **一句话记忆**:特征缩放让梯度下降走直线而非 zigzag,均值归一化后数据均值为 0、标准差为 1。 # 多元梯度下降法 II – 学习率(Learning Rate) ### 1. 调试梯度下降:绘制代价函数随迭代次数的变化曲线 判断梯度下降是否正常工作的标准方法是:**绘制 J(θ) 随迭代次数变化的曲线**。 - **横轴**:迭代次数 - **纵轴**:代价函数 J(θ) **正常情况**:曲线应该随着每次迭代而**下降**,并在一定次数后趋于平坦(收敛)。 **异常情况**: - 曲线上升 → 梯度下降**发散**,通常是因为学习率 α 太大 - 曲线反复震荡(上下波动)→ 同样表明 α 太大 - 曲线下降极其缓慢 → α 可能太小 ### 2. 自动收敛检测 除了肉眼观察曲线,也可以设置一个**阈值**来判断收敛: ```math \text{如果 } J(\theta) \text{ 在一次迭代中的下降量 } < \varepsilon \text{(如 } 10^{-3} \text{),则认为已收敛} ``` 但实际中,选择合适的 ε 很困难,**推荐直接观察曲线**。 ### 3. 学习率 α 的选择 #### 3.1 α 太小 - 梯度下降运行缓慢 - 需要大量迭代才能收敛 #### 3.2 α 太大 - J(θ) 可能在每次迭代中**不下降甚至上升** - 可能导致无法收敛甚至发散 **现象**:如果 J(θ) 在某次迭代后上升,通常意味着 α 过大,应尝试更小的 α。 ### 4. 如何选择合适的 α 实践中通常采用**尝试法**,按 3 倍间隔依次测试: ```math \alpha = 0.001, \; 0.003, \; 0.01, \; 0.03, \; 0.1, \; 0.3, \; 1, \; \dots ``` 步骤: 1. 从较小的 α(如 0.001)开始 2. 绘制 J(θ) 曲线,观察是否正常下降 3. 如果正常,尝试下一个更大的 α 4. 找到使 J(θ) 快速下降且稳定的最大 α 值 **经验**: - 如果 α 太小,J(θ) 下降缓慢 - 如果 α 太大,J(θ) 可能出现震荡或上升 - 理想的 α 应在两者之间,使 J(θ) 平滑快速地下降到最小值 ### 5. 特征缩放与学习率的关系 - 特征缩放后,梯度下降的等高线图更接近圆形 - 这使得梯度下降对 α 的选择更加**宽容**(更大的 α 也能稳定工作) - 未做特征缩放时,α 的选择范围更窄,更容易发散 **一句话记忆**:画 J(θ) 曲线看趋势,按 3 倍间隔试 α,特征缩放能让 α 更好选。 以下是按规范(行内符号去 `$` 改用纯文本/Unicode,独立公式进 ```` ```math ```` 块)修正后的笔记: --- # 特征和多项式回归 (Features and Polynomial Regression) ## 1. 特征工程 (Feature Engineering) 在线性回归中,有时原始特征并不能很好地拟合数据。我们可以通过**组合现有特征**来创建新特征。 - **例子(房价预测)**:假设有临街宽度(frontage)和纵向深度(depth),可以直接创建一个新特征:面积 x = frontage × depth,模型变为 h_θ(x) = θ₀ + θ₁ × frontage × depth。 - **核心思想**:特征工程是指利用原始特征构造新特征,使模型更好地匹配数据分布。 ## 2. 多项式回归 (Polynomial Regression) 当数据呈现明显的曲线趋势时,标准线性模型(直线)无法很好拟合,需要引入**多项式特征**。 ### 常见形式(以房屋面积 x 为例) 假设 h_θ(x) = θ₀ + θ₁x + θ₂x²(二次函数/抛物线): - **二次模型**:h_θ(x) = θ₀ + θ₁x + θ₂x² - 缺点:抛物线最终会下降,但房价不会随面积无限增大而降低(不符合实际)。 - **三次模型**:h_θ(x) = θ₀ + θ₁x + θ₂x² + θ₃x³ - 能够持续上升,更符合实际趋势。 - **平方根模型**:h_θ(x) = θ₀ + θ₁x + θ₂√x - 曲线上升但逐渐平缓,也常用于特征变换。 ## 3. 与多元线性回归的统一 多项式回归本质上可以转化为**多元线性回归**: - 令 x₁ = x,x₂ = x²,x₃ = x³(或 √x) - 模型转化为:h_θ(x) = θ₀ + θ₁x₁ + θ₂x₂ + θ₃x₃ - 这样就能继续使用之前的**梯度下降算法**,但输入特征变成了原始特征的多项式组合。 ## 4. 特征缩放的极端重要性 ⚠️ 引入多项式后,**特征缩放变得必不可少**: - 例:房屋面积 x ∈ [1, 1000],则 x² ∈ [1, 10⁶],x³ ∈ [1, 10⁹]。 - 尺度差异巨大会导致梯度下降收敛极慢,甚至发散。 - **必须**对 x、x²、x³ 分别进行归一化(如除以最大值或均值标准化),使其处于相近区间(如 [-1, 1])。 **一句话记忆**:特征工程造新变量,多项式回归用 x²/x³ 弯曲线,转化多元线性后**务必特征缩放**。 --- # 正规方程与代价函数最小化 (Normal Equation) ## 1. 核心结论 公式 **θ = (XᵀX)⁻¹Xᵀy** 即为**正规方程(Normal Equation)**。 它能通过纯代数方法**一步到位**求出让代价函数 J(θ) 达到全局最小的参数 θ,无需像梯度下降那样进行迭代。 ## 2. 为什么它能最小化代价函数?(推导逻辑) 代价函数 J(θ) 是关于 θ 的“碗状”**凸二次函数**,存在全局最小值,令其导数为 0 即可找到碗底。 - **矩阵表示**:预测误差为 `(Xθ - y)`,代价函数可写为 `J(θ) = 1/2 * (Xθ - y)ᵀ(Xθ - y)`。 - **展开化简**:展开后得 `J(θ) = 1/2 * (θᵀXᵀXθ - 2yᵀXθ + yᵀy)`。 - **求导令零**:对 θ 求梯度并令其为 0,得到 `∇J(θ) = XᵀXθ - Xᵀy = 0`。 - **得出方程**:移项得到正规方程核心形式 **XᵀXθ = Xᵀy**。 - **解析求解**:假设 XᵀX 可逆,左乘逆矩阵即得 **θ = (XᵀX)⁻¹Xᵀy**。 ## 3. 几何直觉 Xθ 是特征空间中的预测向量,y 是真实值。最小化误差等价于让预测向量最接近 y,此时误差向量 `(y - Xθ)` 必须**垂直于特征空间**(与 X 各列正交),数学表达即 `Xᵀ(y - Xθ) = 0`,同样导出该公式。 ## 4. 与梯度下降的对比 | 对比项 | 梯度下降 | 正规方程 | |--------|---------|---------| | 方法 | 迭代逼近(逐步下山) | 直接解析求解(一步到位) | | 学习率 α | 需要手动选择调参 | 不需要 | | 特征缩放 | 必须(否则收敛慢/发散) | 不需要 | | 计算复杂度 | O(kn²),k 为迭代次数 | O(n³),因需算 (XᵀX)⁻¹ | | 适用规模 | 适合大规模(n > 10000) | 适合小规模(n < 10000) **一句话记忆**:凸函数求导令零得 XᵀXθ = Xᵀy,求逆解出 θ 一步最小化代价,小数据免缩放,大数据用梯度。 --- # 正规方程在矩阵不可逆情况下的解决方法 ## 1. 核心问题:XᵀX 不可逆(奇异/退化) 在上一节正规方程 θ = (XᵀX)⁻¹Xᵀy 中,前提是 **XᵀX 可逆**(满秩)。 但在实际中,XᵀX 可能不可逆,导致无法直接求逆。此时正规方程“失效”。 ## 2. 矩阵不可逆的常见原因 - **特征冗余(多重共线性)**:特征之间存在严格的线性关系。 - 例:房价预测中,同时包含“面积(平方英尺)”和“面积(平方米)”,两者成比例;或 x₁ = 大小,x₂ = 2×大小。 - **特征数量过多(m ≤ n)**:样本数 m 小于等于特征数 n(包括截距项),数据维度不足,矩阵不满秩。 - 例:只有 10 个样本,却有 12 个特征,模型无法唯一确定参数。 ## 3. 解决方法 ### (1) 删除冗余特征 / 合并特征 - 检查并移除线性相关的特征(如保留一个面积单位,删除另一个)。 - 特征工程时避免构造完全成比例的特征。 ### (2) 正则化(最常用、最稳健) - 引入 **岭回归(Ridge Regression)**:在 XᵀX 对角线上加一个常数 λ,使矩阵必然可逆。 - 修正后的方程:θ = (XᵀX + λI)⁻¹Xᵀy (I 为单位矩阵,λ > 0) - 即使 XᵀX 奇异,(XᵀX + λI) 也一定可逆,同时防止过拟合。 - 注:这是实际工程中最推荐的方案,后续课程会深入讲解。 ### (3) 使用伪逆(数值计算层面) - 在代码实现中(如 NumPy),可用 **Moore-Penrose 伪逆** 代替普通逆矩阵: - θ = pinv(XᵀX) Xᵀy ≈ (XᵀX)⁻¹Xᵀy - 伪逆总能计算,给出“最小范数”的最优解,但解释性稍弱。 ### (4) 降维(如 PCA) - 当特征过多(n 很大)时,可用主成分分析(PCA)减少特征维度,消除共线性。 ## 4. 与梯度下降的关系 - 矩阵不可逆时,**梯度下降依然可以运行**(不需要求逆),但可能因特征共线性导致收敛路径震荡。 - 正则化同时改善了正规方程的可逆性与梯度下降的稳定性。 **一句话记忆**:XᵀX 不可逆因冗余或特征多,删特征/正则化(加 λI)/伪逆可解,岭回归最常用。 --- # 分类 (Classification) ## 1. 什么是分类问题? 分类问题的目标是预测**离散的输出值**(类别标签),而不是连续值。 - **二分类**:输出只有两个类别,通常记为 0 和 1。 - 0:负类(Negative Class),如“没有肿瘤”、“不是垃圾邮件” - 1:正类(Positive Class),如“有肿瘤”、“是垃圾邮件” - **多分类**:输出有多个类别(如手写数字识别 0~9),将在后续课程讲解。 ## 2. 为什么不能用线性回归做分类? 如果用线性回归拟合分类数据,会存在两个严重问题: ### 问题一:输出值超出 [0, 1] 范围 - 线性回归的输出是连续值,可能远大于 1 或远小于 0 - 但分类问题的期望输出只能是 0 或 1(或介于 0~1 之间的概率) - 即使设定阈值(如 ≥0.5 判为 1,<0.5 判为 0),线性回归仍可能因极端值导致误判 ### 问题二:添加新样本会破坏已有的决策边界 - 线性回归对异常值敏感 - 新增一个远离现有数据的样本,会显著改变回归直线的斜率,导致原有的分类阈值失效 **结论**:线性回归不适合分类任务,需要专门的分类算法。 ## 3. 分类问题的表示方式 假设函数输出的不再是具体的数值,而是**属于正类的概率**: ```math 0 \leq h_\theta(x) \leq 1 ``` - 如果 h_θ(x) ≥ 0.5,预测 y = 1(正类) - 如果 h_θ(x) < 0.5,预测 y = 0(负类) ## 4. 分类问题的常见应用 | 应用场景 | 正类 (y=1) | 负类 (y=0) | |---------|-----------|-----------| | 垃圾邮件分类 | 是垃圾邮件 | 不是垃圾邮件 | | 肿瘤诊断 | 恶性肿瘤 | 良性肿瘤 | | 信用卡欺诈检测 | 欺诈交易 | 正常交易 | | 在线交易判定 | 欺诈 (Fraudulent) | 合法 (Valid) | **一句话记忆**:分类预测离散标签(0/1),线性回归输出无界且对异常敏感,需用专门算法(即将学习的逻辑回归)。 --- # 假设陈述 (Hypothesis Representation) ## 1. 逻辑回归的假设函数 我们希望分类器的输出在 0 和 1 之间,因此将线性回归的假设函数 θᵀx 放入 Sigmoid 函数中: ```math h_\theta(x) = g(\theta^T x) ``` 其中 Sigmoid 函数(也称逻辑函数)定义为: ```math g(z) = \frac{1}{1 + e^{-z}} ``` 完整的假设函数为: ```math h_\theta(x) = \frac{1}{1 + e^{-\theta^T x}} ``` ## 2. Sigmoid 函数的特性回顾 | z 的值 | e^(-z) | g(z) | |--------|--------|------| | -∞ | +∞ | 趋近 0 | | -10 | 22026 | ≈ 0.000045 | | -5 | 148.4 | ≈ 0.0067 | | -2 | 7.39 | ≈ 0.12 | | 0 | 1 | **0.5** | | 2 | 0.135 | ≈ 0.88 | | 5 | 0.0067 | ≈ 0.993 | | 10 | 0.000045 | ≈ 0.99995 | | +∞ | 0 | 趋近 1 | - 输出范围:(0, 1),永远不触及边界 - z = 0 时,g(z) = 0.5,这是决策分界线 ## 3. 假设函数的输出含义 ```math h_\theta(x) = P(y = 1 | x; \theta) ``` 读作:**给定特征 x 和参数 θ 的条件下,y = 1 的概率。** 并且满足概率公理: ```math P(y = 1 | x; \theta) + P(y = 0 | x; \theta) = 1 ``` 所以: ```math P(y = 0 | x; \theta) = 1 - h_\theta(x) ``` ## 4. 如何做出预测 基于概率输出,通过阈值 0.5 做出分类决策: - 如果 h_θ(x) ≥ 0.5,预测 y = 1 - 如果 h_θ(x) < 0.5,预测 y = 0 由于 Sigmoid 函数的单调性,这等价于: - 如果 θᵀx ≥ 0,预测 y = 1 - 如果 θᵀx < 0,预测 y = 0 ## 5. 与线性回归假设函数的对比 | 对比项 | 线性回归 | 逻辑回归 | |--------|---------|---------| | 假设函数形式 | h(x) = θᵀx | h(x) = 1 / (1 + e^(-θᵀx)) | | 输出范围 | (-∞, +∞) | (0, 1) | | 输出含义 | 连续数值预测 | 属于正类的概率 | | 决策方式 | 直接输出数值 | 以 0.5 为阈值分类 | **一句话记忆**:逻辑回归的假设函数 = 对 θᵀx 套上 Sigmoid 函数,输出 0~1 之间的概率,以 0.5 为阈值做分类。 --- # 决策边界 (Decision Boundary) ## 1. 什么是决策边界? 决策边界是**将特征空间划分为不同类别的分界线(或超平面)**。它由假设函数的预测规则自然定义出来,而非由数据集直接给出。 ## 2. 决策边界的由来 逻辑回归的预测规则: - 如果 h_θ(x) ≥ 0.5,预测 y = 1 - 如果 h_θ(x) < 0.5,预测 y = 0 由于 Sigmoid 函数在 z = 0 时恰好输出 0.5,且 g(z) 单调递增,上述规则等价于: - 如果 θᵀx ≥ 0,预测 y = 1 - 如果 θᵀx < 0,预测 y = 0 **θᵀx = 0** 这条线(或超平面)就是**决策边界**。 ## 3. 线性决策边界示例 假设一个二分类模型有两个特征 x₁、x₂,参数为: ```math \theta = [-3, 1, 1]^T ``` 即 h_θ(x) = g(-3 + x₁ + x₂) 决策边界由 θᵀx = 0 决定: ```math -3 + x₁ + x₂ = 0 ``` 化简得:x₁ + x₂ = 3 这条直线将平面分成两部分: - 上方区域(x₁ + x₂ ≥ 3):预测 y = 1 - 下方区域(x₁ + x₂ < 3):预测 y = 0 ## 4. 非线性决策边界示例 如果数据无法用一条直线分开,可以通过添加多项式特征实现非线性决策边界。 假设: ```math h_\theta(x) = g(\theta_0 + \theta_1 x_1 + \theta_2 x_2 + \theta_3 x_1^2 + \theta_4 x_2^2) ``` 参数为: ```math \theta = [-1, 0, 0, 1, 1]^T ``` 决策边界由 θᵀx = 0 决定: ```math -1 + x_1^2 + x_2^2 = 0 ``` 化简得:x₁² + x₂² = 1 这是一个半径为 1 的圆: - 圆内(x₁² + x₂² < 1):预测 y = 0 - 圆外(x₁² + x₂² ≥ 1):预测 y = 1 ## 5. 关键理解 | 要点 | 说明 | |------|------| | **决策边界是模型的属性** | 由参数 θ 决定,而非由训练数据直接画出 | | **决策边界可以是任意形状** | 通过添加多项式特征(x₁²、x₁x₂、√x₁ 等),可以得到非线性边界 | | **高阶多项式 = 更复杂的边界** | 特征越复杂,决策边界越灵活,但也更容易过拟合 | | **线性 ≠ 简单** | 线性决策边界指 θᵀx = 0 是线性方程,但特征本身可以是多项式的 | **一句话记忆**:决策边界由 θᵀx = 0 定义,是模型自身的分界线;添加多项式特征可得到非线性边界,但越复杂越容易过拟合。 --- # 代价函数 (Cost Function) ## 1. 为什么不能用线性回归的代价函数? 逻辑回归如果沿用线性回归的均方误差(MSE): ```math J(\theta) = \frac{1}{2m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})^2 ``` 将 h_θ(x) = 1/(1+e^(-θᵀx)) 代入后,J(θ) 会变成**非凸函数**(Non-convex),图像有许多局部最低点。梯度下降很容易卡在某个局部最小值,找不到全局最优解。 **结论**:逻辑回归需要一个不同的、凸的代价函数。 ## 2. 逻辑回归的代价函数(交叉熵损失) ### 分段定义 当 y = 1 时: ```math \text{Cost}(h_\theta(x), y) = -\log(h_\theta(x)) ``` 当 y = 0 时: ```math \text{Cost}(h_\theta(x), y) = -\log(1 - h_\theta(x)) ``` ### 设计原理 | 真实值 y | 预测值 h(x) | 代价 | 含义 | |----------|-------------|------|------| | 1 | 0.99(很准) | -log(0.99) ≈ 0.01 | 惩罚极小 | | 1 | 0.50(模糊) | -log(0.50) ≈ 0.69 | 中等惩罚 | | 1 | 0.01(很偏) | -log(0.01) ≈ 4.61 | 严厉惩罚 | | 0 | 0.01(很准) | -log(0.99) ≈ 0.01 | 惩罚极小 | | 0 | 0.50(模糊) | -log(0.50) ≈ 0.69 | 中等惩罚 | | 0 | 0.99(很偏) | -log(0.01) ≈ 4.61 | 严厉惩罚 | **核心思想**:预测越离谱,代价越大;预测越准,代价越小。 ## 3. 统一的代价函数公式 将分段写法合并为一个公式: ```math J(\theta) = -\frac{1}{m} \sum_{i=1}^m \left[ y^{(i)} \log(h_\theta(x^{(i)})) + (1 - y^{(i)}) \log(1 - h_\theta(x^{(i)})) \right] ``` - 当 y=1 时,后半项 (1-y)log(1-h) 为 0,只剩 -ylog(h) - 当 y=0 时,前半项 ylog(h) 为 0,只剩 -(1-y)log(1-h) **等价于分段写法**。 ## 4. 为什么叫交叉熵? 交叉熵来自信息论,衡量**两个概率分布之间的差异**: - 真实分布:y(要么 0,要么 1) - 预测分布:h_θ(x)(0~1 之间的概率) 两个分布越接近,交叉熵越小;差异越大,交叉熵越大。**最小化交叉熵 = 让预测分布尽量接近真实分布。** ## 5. 与线性回归代价函数的对比 | 对比项 | 线性回归(MSE) | 逻辑回归(交叉熵) | |--------|----------------|-------------------| | 公式 | 1/2m Σ(h - y)² | -1/m Σ[y log(h) + (1-y)log(1-h)] | | 函数形状 | 凸函数(碗形) | 凸函数(碗形) | | 能否用梯度下降 | ✅ 能找到全局最优 | ✅ 能找到全局最优 | | 输出含义 | 数值误差 | 概率分布差异 | **一句话记忆**:逻辑回归用交叉熵替代 MSE,因为 MSE 代入 Sigmoid 后会变成非凸函数;交叉熵的 -log 形式确保预测越离谱惩罚越大,且整体是凸函数。 --- # 简化代价函数与梯度下降 (Simplified Cost Function and Gradient Descent) ## 1. 简化后的代价函数 上一节的分段代价函数可以合并为一个简洁的公式: ```math J(\theta) = -\frac{1}{m} \sum_{i=1}^m \left[ y^{(i)} \log(h_\theta(x^{(i)})) + (1 - y^{(i)}) \log(1 - h_\theta(x^{(i)})) \right] ``` - 当 y=1 时:后半项 (1-y)log(1-h) = 0,只剩 -ylog(h) - 当 y=0 时:前半项 ylog(h) = 0,只剩 -(1-y)log(1-h) **这个公式是从极大似然估计推导而来的**,目标是找到一组参数 θ,使得观测到当前训练数据的概率最大。 ## 2. 逻辑回归的梯度下降 ### 梯度下降的通用形式 ```math \theta_j := \theta_j - \alpha \frac{\partial}{\partial \theta_j} J(\theta) ``` ### 对逻辑回归求导后的结果 对 J(θ) 求偏导并化简后,得到与线性回归**形式上完全相同**的更新规则: ```math \theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} ``` ### 重要提醒:虽然形式相同,但 h(x) 不同! | 对比项 | 线性回归 | 逻辑回归 | |--------|---------|---------| | 假设函数 h(x) | θᵀx | 1/(1+e^(-θᵀx)) | | 梯度下降更新规则 | θⱼ := θⱼ - α/m Σ(h-y)·xⱼ | θⱼ := θⱼ - α/m Σ(h-y)·xⱼ | **更新规则的公式一样,但因为 h(x) 完全不同,所以实际计算出的梯度方向和大小也不同。** ## 3. 梯度下降的具体步骤 ```text 重复直到收敛 { 对所有 j 同步更新: temp_j = θ_j - α * (1/m) * Σ (h(xⁱ) - yⁱ) * xⱼⁱ 所有 temp_j 同时赋值给 θ_j } ``` ### 注意事项 - **同步更新**:所有 θⱼ 必须同时计算新值,再一起赋值 - **特征缩放仍然重要**:逻辑回归的特征尺度差异过大时,梯度下降也会收敛缓慢 ## 4. 与线性回归梯度下降的对比总结 | 对比项 | 线性回归 | 逻辑回归 | |--------|---------|---------| | 假设函数 h(x) | θᵀx | 1/(1+e^(-θᵀx)) | | 代价函数 | MSE = 1/2m Σ(h-y)² | 交叉熵 = -1/m Σ[y log(h)+(1-y)log(1-h)] | | 梯度下降更新公式 | θⱼ := θⱼ - α/m Σ(h-y)xⱼ | θⱼ := θⱼ - α/m Σ(h-y)xⱼ | | 是否需要特征缩放 | ✅ 是 | ✅ 是 | | 是否能找到全局最优 | ✅ 凸函数 | ✅ 凸函数 | **一句话记忆**:逻辑回归的代价函数简化为交叉熵统一公式,梯度下降更新规则形式上与线性回归一致,但因 h(x) 不同导致实际计算不同;特征缩放依然重要。 --- # 高级优化 (Advanced Optimization) ## 1. 为什么要用高级优化? 基础梯度下降虽然能工作,但有两个痛点: - 需要**手动选择学习率 α**,调参麻烦 - 收敛速度相对较慢 高级优化算法可以**自动选择步长**,不需要手动调 α,且收敛更快。 ## 2. 三种高级优化算法 | 算法 | 特点 | |------|------| | **共轭梯度法 (Conjugate Gradient)** | 利用共轭方向避免之字形震荡,内存友好 | | **BFGS** | 拟牛顿法,近似海森矩阵,收敛极快但内存消耗大(O(n²)) | | **L-BFGS** | BFGS 的改进版,只存最近几步信息,内存消耗小,是传统机器学习的标配 | **共同优势**:自动线搜索找步长,无需手动调 α,收敛快于基础梯度下降。 ## 3. 优化器的使用范式 核心思想:**你负责提供代价函数值和梯度,优化器负责找最优 θ。** 你需要提供一个函数,返回两个值: - **代价函数值 J(θ)** - **梯度 ∂J/∂θⱼ** ### 教学示例 为演示用法,人为构造一个极简测试函数(非真实逻辑回归): ```math J(\theta) = (\theta_1 - 5)^2 + (\theta_2 - 5)^2 ``` 梯度: ```math \frac{\partial J}{\partial \theta_1} = 2(\theta_1 - 5) ``` ```math \frac{\partial J}{\partial \theta_2} = 2(\theta_2 - 5) ``` 最优解:θ₁ = 5,θ₂ = 5 ### 真实场景(逻辑回归) 将逻辑回归的交叉熵代价函数及其梯度代入,优化器自动迭代求解。 ## 4. Octave/MATLAB 实现 ```octave % 配置优化选项 options = optimset('GradObj', 'on', 'MaxIter', 100); % 调用无约束最小化求解器 [optTheta, functionVal, exitFlag] = fminunc(@costFunction, initialTheta, options); ``` | 组件 | 说明 | |------|------| | optimset | 配置选项(非算法),设置是否提供梯度、最大迭代次数等 | | fminunc | 无约束最小化求解器,默认使用 BFGS/L-BFGS 类拟牛顿法 | | @costFunction | 自定义函数,返回 J(θ) 和梯度 | | initialTheta | 初始参数 | | optTheta | 优化后的最优参数 | **一句话记忆**:高级优化器自动调步长不求人,你只需提供 J(θ) 和梯度,fminunc 帮你找最优 θ。 --- # 多元分类:一对多 (Multiclass Classification: One-vs-All) ## 1. 什么是多元分类? 之前学的逻辑回归处理的是**二分类**问题(y = 0 或 1)。但在实际中,常常遇到**多于两个类别**的分类问题。 ### 常见例子 | 应用场景 | 类别 | |---------|------| | 邮件分类 | 工作邮件、朋友邮件、家人邮件、兴趣邮件 | | 天气预测 | 晴天、多云、雨天、雪天 | | 手写数字识别 | 0、1、2、3、4、5、6、7、8、9 | | 疾病诊断 | 健康、感冒、流感、新冠肺炎 | ## 2. 一对多的核心思想 将**一个多分类问题**拆分为**多个独立的二分类问题**。 ### 具体做法 假设有 K 个类别(y = 1, 2, ..., K),训练 K 个独立的逻辑回归分类器: | 分类器 | 任务 | 正类 | 负类 | |--------|------|------|------| | h_θ^(1)(x) | 判断是否为类别 1 | y = 1 | y = 2, 3, ..., K | | h_θ^(2)(x) | 判断是否为类别 2 | y = 2 | y = 1, 3, ..., K | | ... | ... | ... | ... | | h_θ^(K)(x) | 判断是否为类别 K | y = K | y = 1, 2, ..., K-1 | 每个分类器输出的是**属于该类别的概率**: ```math h_\theta^{(k)}(x) = P(y = k | x; \theta) ``` ## 3. 如何进行预测 当输入一个新的样本 x 时: 1. 将所有 K 个分类器都跑一遍 2. 每个分类器输出一个概率值 3. 选择概率最大的那个类别作为最终预测 ```math \text{预测类别} = \arg\max_k h_\theta^{(k)}(x) ``` ### 示例(手写数字识别) 假设有 3 个类别(1、2、3),输入一个数字图片: | 分类器 | 输出概率 | |--------|---------| | h_θ^(1)(x):是 1 的概率 | 0.05 | | h_θ^(2)(x):是 2 的概率 | 0.90 | | h_θ^(3)(x):是 3 的概率 | 0.05 | 预测结果:类别 2(概率最高) **一句话记忆**:一对多 = 训练 K 个二分类器,每个判断“是不是第 k 类”,预测时选概率最大的那个。 --- # 过拟合问题 (The Problem of Overfitting) ## 1. 什么是过拟合? 过拟合是指模型在**训练集上表现非常好**(误差极低甚至为零),但在**新数据(测试集/验证集)上表现很差**的现象。模型学到了训练数据中的**噪声和偶然模式**,而不是真实的潜在规律。 ### 三种拟合状态的直观对比 | 状态 | 训练误差 | 测试误差 | 模型复杂度 | 图示表现 | |------|---------|---------|-----------|---------| | **欠拟合 (Underfitting)** | 高 | 高 | 过低 | 直线无法拟合曲线数据 | | **刚好拟合 (Just Right)** | 适中 | 适中 | 适当 | 曲线贴合数据趋势但不扭曲 | | **过拟合 (Overfitting)** | 极低(接近 0) | 很高 | 过高 | 曲线穿过每一个数据点,剧烈抖动 | ## 2. 过拟合的常见原因 | 原因 | 说明 | 示例 | |------|------|------| | **特征太多** | 特征数量 n 远大于样本数量 m | 100 个样本但有 1000 个特征 | | **模型过于复杂** | 使用高阶多项式或深层网络 | 用 x⁵、x⁶ 等高次项拟合少量数据 | | **训练数据太少** | 样本量不足以支撑模型复杂度 | 10 个样本却用 5 次多项式 | | **训练时间过长** | 在梯度下降中迭代次数过多 | 训练集误差已经很低还继续迭代 | ## 3. 过拟合在不同算法中的表现 ### 线性回归中的过拟合 假设房价预测,特征为房屋面积 x: ```math h_\theta(x) = \theta_0 + \theta_1 x + \theta_2 x^2 + \theta_3 x^3 + \theta_4 x^4 ``` - 高阶项让曲线剧烈弯曲,强行穿过每个训练点 - 但在新数据上预测极差 ### 逻辑回归中的过拟合 ```math h_\theta(x) = g(\theta_0 + \theta_1 x_1 + \theta_2 x_2 + \theta_3 x_1^2 x_2 + \theta_4 x_1^2 x_2^2 + ...) ``` - 决策边界变得极其复杂、扭曲 - 完美分割训练集但在测试集上失效 ## 4. 解决过拟合的方法 | 方法 | 做法 | 适用场景 | |------|------|---------| | **1. 减少特征数量** | 手动选择重要特征 / 用模型自动筛选 | 特征中有大量冗余或无关特征时 | | **2. 正则化 (Regularization)** | 保留所有特征,但减小参数 θⱼ 的值 | 每个特征都有一定作用时(最常用) | | **3. 增加训练数据** | 收集更多样本 | 数据量不足时 | | **4. 降低模型复杂度** | 减少多项式次数 / 简化网络结构 | 模型过于复杂时 | ### 两种主要方法的对比 | 方法 | 优点 | 缺点 | |------|------|------| | **减少特征** | 模型更简单,可解释性更强 | 可能会丢失有用信息 | | **正则化** | 保留所有特征,自动削弱不重要特征的影响 | 需要选择合适的正则化参数 λ | **一句话记忆**:过拟合 = 训练误差极低但测试误差极高,模型记住了噪声而非规律;解决思路:减少特征或正则化。 --- # 代价函数 (Cost Function) ## 1. 正则化的直观想法 过拟合的原因是高阶项的系数(参数)过大,导致曲线剧烈扭曲。如果能**让这些高阶项的系数变小**,曲线就会变得更平滑,从而缓解过拟合。 ### 以房价预测为例 假设使用四次多项式拟合房价: ```math h_\theta(x) = \theta_0 + \theta_1 x + \theta_2 x^2 + \theta_3 x^3 + \theta_4 x^4 ``` - 二次多项式(θ₃ = θ₄ = 0):拟合良好,曲线平滑 - 四次多项式(θ₃、θ₄ 不为 0):过拟合,曲线剧烈扭曲 **思路**:保留所有特征,但对 θ₃ 和 θ₄ 施加惩罚,迫使它们接近于 0。 ## 2. 带惩罚项的代价函数 ### 修改后的代价函数 在原代价函数(均方误差)的基础上,对特定参数加上惩罚项: ```math J(\theta) = \frac{1}{2m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})^2 + 1000\theta_3^2 + 1000\theta_4^2 ``` ### 为什么乘以 1000? - 1000 是一个**极大的惩罚系数** - 如果 θ₃ 或 θ₄ 稍微变大,惩罚项就会急剧增大,导致总代价飙升 - 为了最小化总代价,优化算法**被迫**将 θ₃ 和 θ₄ 压缩到接近于 0 ### 效果 当 θ₃ ≈ 0 且 θ₄ ≈ 0 时: ```math h_\theta(x) \approx \theta_0 + \theta_1 x + \theta_2 x^2 ``` 四次多项式退化为二次多项式,曲线变得平滑,解决了过拟合问题。 ## 3. 通用的正则化代价函数 在实际中,我们不知道哪些参数需要惩罚,所以**对所有参数统一施加惩罚**: ```math J(\theta) = \frac{1}{2m} \left[ \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})^2 + \lambda \sum_{j=1}^n \theta_j^2 \right] ``` 其中: - **λ(正则化参数)**:控制正则化的强度 - λ 越大,参数惩罚越重,模型越简单(容易欠拟合) - λ 越小,参数惩罚越轻,模型越复杂(容易过拟合) - λ = 0:退化为原始代价函数(无正则化) - **∑θⱼ²**:对参数 θ₁ 到 θₙ 施加惩罚(**注意:θ₀ 不参与正则化**) ### 为什么不惩罚 θ₀? θ₀ 是偏置项(截距),只影响预测值的整体偏移,不影响曲线的弯曲程度。惩罚 θ₀ 会导致模型整体偏移,反而降低拟合能力。 ## 4. 正则化的直观效果 | 正则化强度 λ | 参数 θⱼ 的大小 | 模型复杂度 | 拟合状态 | |-------------|---------------|-----------|---------| | λ = 0 | 不受限制 | 高 | 容易过拟合 | | λ 适中 | 被适度压缩 | 适中 | 刚好拟合 | | λ 过大 | 被过度压缩,趋近于 0 | 过低 | 欠拟合(接近水平线) | **一句话记忆**:正则化 = 在代价函数中加入 λ∑θⱼ²,惩罚过大的参数,让模型更平滑;λ 越大模型越简单,λ 越小模型越复杂。 --- # 线性回归的正则化 (Regularized Linear Regression) ## 1. 正则化线性回归的代价函数 在原始均方误差的基础上,加入正则化项(惩罚所有参数 θ₁ 到 θₙ,θ₀ 不参与): ```math J(\theta) = \frac{1}{2m} \left[ \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})^2 + \lambda \sum_{j=1}^n \theta_j^2 \right] ``` 其中: - 前半部分:原始均方误差 - 后半部分:正则化项 λ∑θⱼ² - λ:正则化参数,控制惩罚强度 ## 2. 梯度下降法的正则化版本 ### 梯度下降更新规则 对 J(θ) 求偏导后,得到更新规则: ```math \theta_0 := \theta_0 - \alpha \frac{1}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_0^{(i)} ``` ```math \theta_j := \theta_j - \alpha \left[ \frac{1}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} + \frac{\lambda}{m} \theta_j \right] \quad (j = 1, 2, ..., n) ``` ### 改写形式 将 θⱼ 的更新规则改写为更直观的形式: ```math \theta_j := \theta_j (1 - \alpha \frac{\lambda}{m}) - \alpha \frac{1}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} ``` | 组成部分 | 含义 | |---------|------| | θⱼ(1 - αλ/m) | 每次迭代先将 θⱼ 缩小一点(收缩项) | | - α/m Σ(h-y)xⱼ | 与标准梯度下降相同的更新项 | **关键理解**:正则化后的梯度下降每次迭代都会先把 θⱼ 乘以一个略小于 1 的数(1 - αλ/m),相当于对参数进行“缩减”,然后再向梯度方向更新。这就是正则化让参数变小的机制。 ### 与标准梯度下降的对比 | 对比项 | 标准梯度下降 | 正则化梯度下降 | |--------|------------|--------------| | θ₀ 更新 | 不变 | 不变 | | θⱼ 更新 | 仅减去梯度项 | 先收缩再减梯度项 | | 参数大小 | 不受限制 | 被持续压缩 | ## 3. 正规方程法的正则化版本 ### 正则化后的正规方程 ```math \theta = (X^T X + \lambda \cdot L)^{-1} X^T y ``` 其中 L 是一个 (n+1)×(n+1) 的对角矩阵: ```math L = \begin{bmatrix} 0 & 0 & \cdots & 0 \\ 0 & 1 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & 1 \end{bmatrix} ``` - L 的第一个元素为 0(对应 θ₀ 不参与正则化) - 其余对角线元素为 1(对应 θ₁ 到 θₙ 参与正则化) ### 正则化解决矩阵不可逆问题 在 4-7 中讲过,当 m ≤ n 或特征存在多重共线性时,XᵀX 可能不可逆。加入 λL 后: ```math X^T X + \lambda L ``` **一定可逆**(因为 λ > 0 时,该矩阵是正定的)。 | 情况 | 标准正规方程 | 正则化正规方程 | |------|------------|--------------| | XᵀX 可逆 | ✅ 可解 | ✅ 可解 | | XᵀX 不可逆 | ❌ 无法求解 | ✅ 一定可解 | **一句话记忆**:正则化线性回归 = 代价函数加 λ∑θⱼ²,梯度下降每次迭代先收缩 θⱼ再更新,正规方程加 λL 保证矩阵可逆。 --- # 逻辑回归的正则化 (Regularized Logistic Regression) ## 1. 逻辑回归的过拟合问题 逻辑回归同样会面临过拟合问题,尤其是当特征较多或使用高阶多项式特征时。 ### 过拟合的表现 | 状态 | 决策边界 | 训练集表现 | 测试集表现 | |------|---------|-----------|-----------| | **欠拟合** | 直线,过于简单 | 误差高 | 误差高 | | **刚好拟合** | 平滑曲线 | 误差适中 | 误差适中 | | **过拟合** | 扭曲复杂,完美分割每个点 | 误差极低 | 误差高 | ## 2. 正则化逻辑回归的代价函数 在逻辑回归的交叉熵代价函数基础上,加入正则化项: ```math J(\theta) = -\frac{1}{m} \sum_{i=1}^m \left[ y^{(i)} \log(h_\theta(x^{(i)})) + (1 - y^{(i)}) \log(1 - h_\theta(x^{(i)})) \right] + \frac{\lambda}{2m} \sum_{j=1}^n \theta_j^2 ``` 其中: - 前半部分:逻辑回归的交叉熵代价函数 - 后半部分:正则化项 λ/(2m) ∑θⱼ² - **θ₀ 不参与正则化**(与线性回归一致) - λ:正则化参数,控制惩罚强度 ## 3. 梯度下降更新规则 对正则化后的 J(θ) 求偏导,得到更新规则: ```math \theta_0 := \theta_0 - \alpha \frac{1}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_0^{(i)} ``` ```math \theta_j := \theta_j - \alpha \left[ \frac{1}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} + \frac{\lambda}{m} \theta_j \right] \quad (j = 1, 2, ..., n) ``` ### 改写形式 ```math \theta_j := \theta_j (1 - \alpha \frac{\lambda}{m}) - \alpha \frac{1}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} ``` **注意**:这个更新公式与线性回归正则化后的形式**完全相同**,区别仅在于 h_θ(x) 的定义不同: - 线性回归:h_θ(x) = θᵀx - 逻辑回归:h_θ(x) = 1/(1 + e^{-θᵀx}) ## 4. 高级优化算法中的正则化 在使用 fminunc 等高级优化器时,只需在自定义的 costFunction 中将正则化项加入 J(θ) 和梯度即可: ```octave function [J, grad] = costFunctionReg(theta, X, y, lambda) % 计算假设函数 h = sigmoid(X * theta); % 计算正则化代价函数 J = -(1/m) * sum(y .* log(h) + (1-y) .* log(1-h)) ... + (lambda/(2*m)) * sum(theta(2:end).^2); % 计算梯度(θ₀ 不参与正则化) grad = (1/m) * X' * (h - y); grad(2:end) = grad(2:end) + (lambda/m) * theta(2:end); end ``` ## 5. 正则化参数 λ 的选择 | λ 取值 | 效果 | 说明 | |--------|------|------| | λ = 0 | 无正则化 | 容易过拟合 | | λ 过小 | 正则化不足 | 仍可能过拟合 | | λ 适中 | 正则化恰当 | 泛化能力最强 | | λ 过大 | 正则化过度 | 所有参数趋近于 0,模型欠拟合(决策边界接近直线) | ## 6. 与线性回归正则化的对比 | 对比项 | 线性回归 | 逻辑回归 | |--------|---------|---------| | 假设函数 h_θ(x) | θᵀx | 1/(1+e^{-θᵀx}) | | 代价函数 | 均方误差 | 交叉熵 | | 正则化项 | λ/(2m)∑θⱼ² | λ/(2m)∑θⱼ² | | θ₀ 是否参与 | ❌ 不参与 | ❌ 不参与 | | 梯度下降更新公式 | 形式相同 | 形式相同(h_θ 不同) | **一句话记忆**:逻辑回归正则化 = 交叉熵代价函数 + λ∑θⱼ²,梯度下降更新公式形式与线性回归相同(h_θ 不同),θ₀ 不参与正则化。 --- # 非线性假设 (Non-linear Hypotheses) ## 1. 为什么需要非线性假设? 之前学习的线性回归和逻辑回归都假设决策边界是线性的(直线或平面)。但在实际问题中,很多数据**无法用线性模型有效分离或拟合**。 ### 线性模型的局限性 | 场景 | 线性模型效果 | 原因 | |------|------------|------| | 简单二分类 | ✅ 效果好 | 两类数据线性可分 | | 复杂图像识别 | ❌ 效果差 | 像素间关系高度非线性 | | 自然语言处理 | ❌ 效果差 | 词汇组合关系复杂 | | 音频信号处理 | ❌ 效果差 | 时序依赖性强 | ## 2. 用特征组合处理非线性 ### 基本思路 在线性模型中引入高阶多项式特征,使模型具备非线性表达能力。 对于原始特征 x₁、x₂,可以构造: ```math h_\theta(x) = g(\theta_0 + \theta_1 x_1 + \theta_2 x_2 + \theta_3 x_1 x_2 + \theta_4 x_1^2 + \theta_5 x_2^2 + ...) ``` ### 特征组合的爆炸问题 随着特征数量和多项式次数的增加,特征数量呈指数级增长: | 原始特征数 | 使用二次项(含交互)后的特征数 | 使用三次项后的特征数 | |-----------|---------------------------|-------------------| | 2 | 5 | 9 | | 10 | 65 | 约 220 | | 50 | 约 1325 | 约 23425 | | 100 | 约 5150 | 约 171700 | | 1000 | 约 501500 | 约 1.67亿 | **计算公式**:对于 n 个原始特征,包含所有二次项(含交互项)的特征数为 O(n²),三次项为 O(n³)。 ## 3. 具体案例:房价预测 ### 使用原始特征 ```math h_\theta(x) = \theta_0 + \theta_1 \times \text{面积} + \theta_2 \times \text{卧室数} ``` - 只能拟合线性关系 - 无法捕捉面积与卧室数的交互效应 ### 使用二次特征 ```math h_\theta(x) = \theta_0 + \theta_1 \times \text{面积} + \theta_2 \times \text{卧室数} + \theta_3 \times \text{面积}^2 + \theta_4 \times \text{卧室数}^2 + \theta_5 \times \text{面积} \times \text{卧室数} ``` - 可以拟合非线性关系 - 但特征从 2 个增加到 5 个 ### 使用三次特征 - 特征进一步增加到 9 个 - 模型更灵活,但也更容易过拟合 ## 4. 具体案例:图像识别 ### 图像数据的特征维度 以汽车识别为例,一张灰度图像的输入是每个像素的亮度值: | 图像尺寸 | 像素数(特征数) | 二次项特征数(约) | |---------|---------------|-----------------| | 50×50 | 2500 | 约 300 万 | | 100×100 | 10000 | 约 5000 万 | | 200×200 | 40000 | 约 8 亿 | **彩色图像**还需要考虑 RGB 三个通道,特征数再乘以 3。 ### 为什么线性模型在这里失效? - 汽车可能出现在图像的任何位置 - 汽车可能有不同角度、光照条件 - 判断“是否是汽车”依赖于像素之间的**空间关系和组合模式** - 线性模型只能看到单个像素的亮度值,无法捕捉这种复杂关系 ## 5. 非线性假设的必要性 ### 当特征数量 n 很大时 | n 的大小 | 是否适合构造高阶多项式特征 | 推荐方法 | |---------|------------------------|---------| | n 很小(≤10) | ✅ 可以,特征组合可控 | 多项式回归 / 逻辑回归 | | n 中等(10~100) | ⚠️ 特征组合开始膨胀 | 需配合正则化或特征选择 | | n 很大(≥1000) | ❌ 特征组合爆炸,不可行 | **神经网络** | ### 结论 当特征数量非常大时(如图像处理中的数千数万个像素),传统的多项式特征方法会因为特征数量爆炸而**计算上不可行**,需要引入新的方法——**神经网络**来处理这种高维非线性问题。 ## 6. 引出神经网络 | 传统方法的困境 | 神经网络的解决方案 | |--------------|-----------------| | 手动构造高阶特征,维度爆炸 | 自动学习特征表示 | | 无法处理原始像素级输入 | 逐层提取低级到高级特征 | | 计算复杂度随特征数指数增长 | 计算复杂度与网络结构相关,可控 | **一句话记忆**:特征数量大时,手动构造高阶多项式会导致特征爆炸(O(n²)、O(n³)),传统线性模型失效,需要神经网络自动学习非线性特征表示。 --- # 激活函数 (Activation Function) ## 定义 激活函数是神经网络中**每个神经元**(或逻辑回归的输出层)上的一类函数,它对输入的加权和进行**非线性变换**,决定神经元的输出值。 ## 数学形式 一个神经元的工作流程: ```text 输入 x → 加权求和 z = wᵀx + b → 激活函数 a = g(z) → 输出 a ``` 其中 **g(z)** 就是激活函数。 ## 核心作用 | 作用 | 说明 | |------|------| | **引入非线性** | 如果没有激活函数,多层神经网络叠加后仍然是线性变换,等价于单层网络 | | **控制输出范围** | 将输出限制在特定区间(如 0~1、-1~1)或保持非负 | | **决定神经元是否激活** | 某些激活函数(如 ReLU)会让部分神经元输出 0,实现稀疏激活 | ## 常见的激活函数 | 名称 | 公式 | 输出范围 | 特点 | |------|------|---------|------| | **Sigmoid** | 1/(1+e⁻ᶻ) | (0, 1) | 平滑,适合输出概率,但两端梯度饱和 | | **Tanh** | (eᶻ-e⁻ᶻ)/(eᶻ+e⁻ᶻ) | (-1, 1) | 零中心化,比 Sigmoid 好用,但仍存在梯度饱和 | | **ReLU** | max(0, z) | [0, ∞) | 计算简单,缓解梯度消失,是目前隐藏层最常用的 | | **Leaky ReLU** | max(0.01z, z) | (-∞, ∞) | 改进 ReLU,避免神经元死亡 | | **Softmax** | eᶻʲ/∑eᶻᵏ | (0,1), 和为 1 | 多分类输出层专用,输出各类别概率 | ## 激活函数 vs 线性回归/逻辑回归 | 模型 | 激活函数(隐含在假设函数中) | |------|---------------------------| | 线性回归 | **无**(或者说恒等映射 g(z)=z,输出就是加权和本身) | | 逻辑回归(二分类) | **Sigmoid**,将加权和映射到 (0,1) 概率 | | 逻辑回归(多分类) | **Softmax**,将加权和映射到多个类别的概率分布 | | 神经网络 | 隐藏层用 **ReLU**(常用),输出层根据任务选 Sigmoid/Softmax/线性 | ## 一句话总结 **激活函数是神经元的“开关”或“变换器”,对输入的加权和做非线性映射,让神经网络有能力学习复杂的非线性模式。** --- # 权重 (Weights) ## 1. 定义 权重是神经网络中**连接两个神经元之间的参数**,表示前一个神经元的输出对后一个神经元的影响程度(重要性)。 ## 2. 与之前参数的关系 | 概念 | 线性回归 / 逻辑回归 | 神经网络 | |------|-------------------|---------| | 参数名称 | θ₀, θ₁, ..., θₙ | W(权重矩阵), b(偏置向量) | | 作用 | 决定每个特征对输出的影响 | 决定每个神经元连接对下一层的影响 | | 优化方式 | 梯度下降 | 梯度下降(反向传播) | **权重就是之前学的 θ,只是到了神经网络里改了个名字,并且变成了矩阵形式。** ## 3. 权重的含义 ### 单层网络(逻辑回归视角) ```text 输入 x₁ → 权重 w₁ ┐ 输入 x₂ → 权重 w₂ ┤→ 加权求和 z = w₁x₁ + w₂x₂ + b → 激活函数 → 输出 输入 x₃ → 权重 w₃ ┘ ``` | 权重取值 | 含义 | |---------|------| | 绝对值很大 | 该连接很重要,对输出影响大 | | 绝对值很小 | 该连接不重要,对输出影响小 | | 正数 | 正向影响(输入增大,输出增大) | | 负数 | 负向影响(输入增大,输出减小) | | 接近 0 | 该连接几乎不起作用 | ### 多层网络(神经网络视角) ```text 输入层 隐藏层 输出层 x₁ ──w₁₁──→ 神经元₁ ──w₁₁'──→ 输出 x₂ ──w₁₂──→ 神经元₁ x₁ ──w₂₁──→ 神经元₂ x₂ ──w₂₂──→ 神经元₂ ``` 每一层都有自己的权重矩阵,前一层的输出经过权重连接到下一层的每个神经元。 ## 4. 权重与正则化的关系 之前学的正则化(λ∑θⱼ²)在神经网络中称为 **权重衰减 (Weight Decay)**,本质完全相同:在代价函数中惩罚权重的平方和,让权重不要太大,防止过拟合。 ## 5. 权重与特征重要性的关系 | 模型 | 权重是否直接反映特征重要性 | |------|-------------------------| | 线性回归 | ✅ 是,θⱼ 直接表示特征 xⱼ 的重要性 | | 神经网络 | ❌ 否,多层非线性变换后,权重不再直接对应原始特征的重要性 | ## 6. 一句话记忆 **权重是神经元之间连接的“强度系数”,决定前一个信号对后一个神经元的影响有多大。它就是之前学的 θ,到了神经网络里改名为 W,并扩展为矩阵形式。** --- # 神经网络的可解释性问题 ## 1. 为什么神经网络难以解释? ### 1.1 参数不直接对应原始特征 | 模型 | 参数含义 | 可解释性 | |------|---------|---------| | 线性回归 | θⱼ 直接表示特征 xⱼ 对输出的影响 | 高 | | 逻辑回归 | θⱼ 表示特征对对数几率的影响 | 较高 | | 神经网络 | 权重经过多层非线性变换,不再对应原始特征 | 低 | ### 1.2 特征被层层重组 ```text 原始像素 → 边缘检测 → 纹理组合 → 局部形状 → 物体部件 → 最终判断 ``` 每一层都在做非线性变换,原始输入的信息被反复混合、扭曲、抽象,最终决策路径极其复杂,无法追踪“到底是哪个输入导致了判断结果”。 ### 1.3 参数之间高度耦合 神经网络的决策不是单个参数决定的,而是成千上万个参数协同作用的结果。改变其中一个权重,会影响后续所有层的输出,无法单独归因。 ## 2. 可解释性与性能的权衡 | 模型 | 可解释性 | 性能(复杂任务) | 典型应用场景 | |------|---------|----------------|------------| | 线性回归 | ★★★★★ | ★★ | 金融风控、医学统计 | | 逻辑回归 | ★★★★ | ★★★ | 信用评分、广告点击率 | | 决策树 | ★★★★ | ★★★ | 医疗诊断、信贷审批 | | SVM | ★★★ | ★★★ | 文本分类、生物信息 | | 神经网络(浅层) | ★★ | ★★★★ | 中等复杂度的模式识别 | | 深度学习(深层) | ★ | ★★★★★ | 图像识别、NLP、语音 | ## 3. 提高可解释性的方法 | 方法 | 做法 | 适用场景 | |------|------|---------| | **LIME** | 在预测点附近训练一个简单的可解释模型(如线性回归)来近似解释 | 单次预测的解释 | | **SHAP** | 基于博弈论,计算每个特征对预测结果的贡献值 | 特征重要性分析 | | **注意力热力图** | 在图像任务中,可视化模型重点关注图像的哪些区域 | 图像分类、目标检测 | | **Grad-CAM** | 利用梯度生成热力图,显示模型决策依据 | 卷积神经网络的可视化 | | **简化模型替代** | 如果业务要求强可解释性,放弃神经网络改用逻辑回归或决策树 | 合规性要求高的场景 | ## 4. 何时可以接受“黑箱”? | 场景 | 是否可以接受黑箱 | 原因 | |------|----------------|------| | 图片分类(猫 vs 狗) | ✅ 可以 | 错了也没严重后果 | | 电影推荐系统 | ✅ 可以 | 推荐错了无所谓 | | 自动驾驶 | ⚠️ 需要部分可解释 | 需要知道为什么刹车 | | 医疗诊断 | ❌ 需要强可解释性 | 必须解释为什么判断是癌症 | | 银行贷款审批 | ❌ 法规要求 | 必须解释拒绝理由 | | 刑事司法 | ❌ 绝对不能黑箱 | 涉及人身自由 | ## 5. 一句话记忆 **神经网络性能越好,往往越难解释。这是因为权重经过多层非线性变换后不再对应原始特征,决策路径高度耦合。实际应用中需要在“性能”和“可解释性”之间做取舍,必要时用 LIME、SHAP 等工具辅助解释,或者直接选择可解释性更强的模型。** --- # 吴恩达机器学习笔记:神经网络模型表示 (8-3, 8-4) ## 一、神经元的数学模型 一个神经元的工作流程: ``` 输入 x1, x2, x3 → 加权求和 z = θᵀx → 激活函数 g(z) → 输出 ``` ### 关键组件 **偏置单元 (Bias Unit)** - 在每个非输出层额外添加一个偏置单元,值恒为 **1** - 用 x0 或 a0^(j) 表示 - 对应参数 θ0,控制整体偏移 **激活函数** - 常用 Sigmoid 函数(逻辑函数) - 输出范围 (0, 1) - 公式: ```math g(z) = \frac{1}{1 + e^{-z}} ``` --- ## 二、符号约定 | 符号 | 含义 | |------|------| | a_i^(j) | 第 j 层第 i 个神经元的激活值(输出值) | | Θ^(j) | 从第 j 层到第 j+1 层的权重矩阵 | | Θ_(i,k)^(j) | 从第 j 层第 k 个单元到第 j+1 层第 i 个单元的权重 | | L | 网络的总层数 | | s_l | 第 l 层的神经元数量(不含偏置单元) | | K | 输出层神经元数量(多分类时等于类别数) | --- ## 三、前向传播的计算过程 ### 网络结构示例 ``` Layer 1 Layer 2 Layer 3 (输入层) (隐藏层) (输出层) x0=1 ---+ | x1 --Θ11--> a1^(2) --Θ11'--> h(x) | x2 --Θ12--> a2^(2) | x3 --Θ13--> a3^(2) ``` ### 从输入层到隐藏层 ```math a_1^{(2)} = g(\Theta_{10}^{(1)}x_0 + \Theta_{11}^{(1)}x_1 + \Theta_{12}^{(1)}x_2 + \Theta_{13}^{(1)}x_3) ``` ```math a_2^{(2)} = g(\Theta_{20}^{(1)}x_0 + \Theta_{21}^{(1)}x_1 + \Theta_{22}^{(1)}x_2 + \Theta_{23}^{(1)}x_3) ``` ```math a_3^{(2)} = g(\Theta_{30}^{(1)}x_0 + \Theta_{31}^{(1)}x_1 + \Theta_{32}^{(1)}x_2 + \Theta_{33}^{(1)}x_3) ``` ### 从隐藏层到输出层 ```math h_\Theta(x) = a_1^{(3)} = g(\Theta_{10}^{(2)}a_0^{(2)} + \Theta_{11}^{(2)}a_1^{(2)} + \Theta_{12}^{(2)}a_2^{(2)} + \Theta_{13}^{(2)}a_3^{(2)}) ``` --- ## 四、权重矩阵的维度 ### 维度公式 若第 j 层有 s_j 个神经元(不含偏置),第 j+1 层有 s_(j+1) 个神经元(不含偏置): ```math \Theta^{(j)} \in \mathbb{R}^{s_{j+1} \times (s_j + 1)} ``` | 含义 | 说明 | |------|------| | **行数** | 目标层(第 j+1 层)的神经元数 s_(j+1) | | **列数** | 当前层(第 j 层)的神经元数 + 1(偏置)即 s_j + 1 | ### 示例 | 权重矩阵 | 维度 | 计算过程 | |---------|------|---------| | Θ^(1) | 3 x 4 | 第 2 层有 3 个神经元,第 1 层有 3 个特征 + 1 个偏置 | | Θ^(2) | 1 x 4 | 第 3 层有 1 个输出,第 2 层有 3 个神经元 + 1 个偏置 | **记忆口诀**:行数看目标层,列数看当前层(加偏置)。 --- ## 五、前向传播的向量化实现 ### 定义向量 ```math x = [x_0, x_1, x_2, x_3]^T ``` ```math z^{(2)} = [z_1^{(2)}, z_2^{(2)}, z_3^{(2)}]^T ``` ```math a^{(2)} = [a_0^{(2)}, a_1^{(2)}, a_2^{(2)}, a_3^{(2)}]^T ``` ### 向量化计算步骤 **第一步**:计算隐藏层的加权和 ```math z^{(2)} = \Theta^{(1)} \cdot x = \Theta^{(1)} \cdot a^{(1)} ``` **第二步**:应用激活函数 ```math a^{(2)} = g(z^{(2)}) ``` **第三步**:添加偏置单元 ```math a^{(2)} = [1, a_1^{(2)}, a_2^{(2)}, a_3^{(2)}]^T ``` **第四步**:计算输出层 ```math z^{(3)} = \Theta^{(2)} \cdot a^{(2)} ``` ```math h_\Theta(x) = a^{(3)} = g(z^{(3)}) ``` ### 逐层计算规律(通用形式) ```math z^{(j+1)} = \Theta^{(j)} a^{(j)} ``` ```math a^{(j+1)} = g(z^{(j+1)}) ``` ## 六、神经网络与逻辑回归的联系 | 对比项 | 逻辑回归 | 神经网络 | |--------|---------|---------| | 输入 | 原始特征 x | 原始特征 x 或上层特征 a | | 加权求和 | z = θᵀx | z = Θ · a | | 激活函数 | Sigmoid | Sigmoid(或其他) | | 输出 | 概率值 | 概率值或特征表示 | **本质理解**:神经网络是**多层嵌套的逻辑回归**,每一层的输出作为下一层的输入,通过多层组合实现更复杂的非线性拟合能力。 ## 核心要点总结 1. **前向传播流程**:逐层计算 z = Θ · a → a = g(z),每层计算后添加偏置单元 2. **权重矩阵维度**:Θ^(j) 的维度为 s_(j+1) × (s_j + 1) 3. **本质类比**:神经网络是多层嵌套的逻辑回归 --- # 神经网络模型表示 ## 一、神经网络示例:逻辑运算 (8-5) ### 1. 逻辑 AND 运算 **网络结构**:单层感知机(无隐藏层) ``` x0 = 1 \ x1 --Σ--→ g(z) → h(x) / x2 ``` **参数设置**: ```math \Theta^{(1)} = [-30, 20, 20] ``` 即 θ0 = -30, θ1 = 20, θ2 = 20 **计算过程**: ```math h_\Theta(x) = g(-30 + 20x_1 + 20x_2) ``` **真值表验证**: | x1 | x2 | z = -30 + 20x1 + 20x2 | h(x) ≈ | |----|----|----------------------|--------| | 0 | 0 | -30 | 0 | | 0 | 1 | -10 | 0 | | 1 | 0 | -10 | 0 | | 1 | 1 | 10 | 1 | **结论**:当且仅当 x1 = x2 = 1 时输出接近 1,实现了 AND 运算。 ### 2. 逻辑 OR 运算 **参数设置**: ```math \Theta^{(1)} = [-10, 20, 20] ``` 即 θ0 = -10, θ1 = 20, θ2 = 20 **真值表验证**: | x1 | x2 | z = -10 + 20x1 + 20x2 | h(x) ≈ | |----|----|----------------------|--------| | 0 | 0 | -10 | 0 | | 0 | 1 | 10 | 1 | | 1 | 0 | 10 | 1 | | 1 | 1 | 30 | 1 | **结论**:只要有一个输入为 1 输出就接近 1,实现了 OR 运算。 ### 3. 逻辑 NOT 运算 **参数设置**: ```math \Theta^{(1)} = [10, -20] ``` 即 θ0 = 10, θ1 = -20 **真值表验证**: | x1 | z = 10 - 20x1 | h(x) ≈ | |----|--------------|--------| | 0 | 10 | 1 | | 1 | -10 | 0 | **结论**:输出为输入的取反,实现了 NOT 运算。 ### 4. 逻辑 XNOR 运算(同或运算) XNOR 可以用 AND、OR、NOT 组合实现:**(x1 AND x2) OR (NOT x1 AND NOT x2)** **三层网络结构**: ``` Layer 1 Layer 2 Layer 3 (输入层) (隐藏层) (输出层) x0=1 ----+ | x1 ------+--- a1^(2) = x1 AND x2 ----------+ | | x2 ------+--- a2^(2) = NOT x1 AND NOT x2 ---+--- h(x) = a1 OR a2 | x0=1 ---------------------------------------+ ``` **各层权重矩阵**: 第一层到第二层(隐藏层): ```math \Theta^{(1)} = \begin{bmatrix} -30 & 20 & 20 \\ 10 & -20 & -20 \end{bmatrix} ``` - 第一行:a1^(2) 实现 AND(θ = [-30, 20, 20]) - 第二行:a2^(2) 实现 NOT x1 AND NOT x2(θ = [10, -20, -20]) 第二层到第三层(输出层): ```math \Theta^{(2)} = \begin{bmatrix} -10 & 20 & 20 \end{bmatrix} ``` - 实现 OR 运算(θ = [-10, 20, 20]) **真值表验证**: | x1 | x2 | a1 = x1 AND x2 | a2 = ¬x1 AND ¬x2 | h(x) = a1 OR a2 | |----|----|---------------|------------------|----------------| | 0 | 0 | 0 | 1 | 1 | | 0 | 1 | 0 | 0 | 0 | | 1 | 0 | 0 | 0 | 0 | | 1 | 1 | 1 | 0 | 1 | 当 x1 = x2 时输出 1,实现了 XNOR 运算。 ## 核心要点总结 1. **单个神经元可模拟基本逻辑门**:AND(θ = [-30, 20, 20])、OR(θ = [-10, 20, 20])、NOT(θ = [10, -20]) 2. **多层网络实现复杂逻辑**:XNOR 通过 AND、OR、NOT 的组合实现 3. **隐藏层学习中间特征**:a1^(2) 学习 AND,a2^(2) 学习 NOT AND,输出层组合得到 XNOR --- # 神经网络的多分类 ## 一、多分类问题的神经网络表示 ### 1. 问题设定 当我们需要将数据分为 **K 个类别**(K ≥ 3)时,使用神经网络进行多类分类。 **示例场景**: - 手写数字识别:10 个类别(0-9) - 图像识别:行人、汽车、摩托车、卡车(4 个类别) - 文本分类:体育、娱乐、科技、政治(4 个类别) ### 2. 网络输出层设计 输出层有 **K 个神经元**,每个神经元对应一个类别。 ``` 输入层 隐藏层 输出层 ┌── 类别 1 ├── 类别 2 x1 ──→ ... ──→ ... ──→ ... ──→ ├── 类别 3 x2 ├── ... ... └── 类别 K xn ``` ### 3. 输出向量表示 神经网络的输出是一个 **K 维向量**: ```math h_\Theta(x) \in \mathbb{R}^K ``` 每个分量表示输入属于对应类别的概率: ```math h_\Theta(x) = \begin{bmatrix} p(y=1|x) \\ p(y=2|x) \\ \vdots \\ p(y=K|x) \end{bmatrix} ``` ### 4. 标签的独热编码 训练数据的标签 y 不再是单个数值,而是转换为 **独热编码(One-hot Encoding)** 向量。 **转换规则**:若样本属于第 i 类,则 y 是一个 K 维向量,第 i 个分量为 1,其余为 0。 **示例**:4 类分类问题 | 实际类别 | 原始标签 | 独热编码向量 | |---------|---------|-------------| | 类别 1 | y = 1 | [1, 0, 0, 0]ᵀ | | 类别 2 | y = 2 | [0, 1, 0, 0]ᵀ | | 类别 3 | y = 3 | [0, 0, 1, 0]ᵀ | | 类别 4 | y = 4 | [0, 0, 0, 1]ᵀ | ### 5. 预测规则 给定一个新的输入 x,网络输出一个 K 维向量。选择**输出值最大的神经元**对应的类别作为预测结果: ```math \text{prediction} = \arg\max_{i} \, h_\Theta(x)_i ``` ## 二、完整示例:4 类分类 ### 1. 网络结构 假设输入特征维度为 n,隐藏层有若干神经元,输出层有 4 个神经元。 ``` Layer 1 Layer 2 Layer 3 (输入层) (隐藏层) (输出层 4 个神经元) x0=1 h1(x): 是否属于类别 1 x1 ... h2(x): 是否属于类别 2 x2 h3(x): 是否属于类别 3 x3 h4(x): 是否属于类别 4 ... xn ``` ### 2. 训练数据准备 | 样本 | 输入特征 | 真实类别 | 标签向量 y | |------|---------|---------|-----------| | 样本 1 | x^(1) | 行人 | [1, 0, 0, 0]ᵀ | | 样本 2 | x^(2) | 汽车 | [0, 1, 0, 0]ᵀ | | 样本 3 | x^(3) | 摩托车 | [0, 0, 1, 0]ᵀ | | 样本 4 | x^(4) | 卡车 | [0, 0, 0, 1]ᵀ | ### 3. 预测过程 输入一张新图片 x,网络计算输出: ```math h_\Theta(x) = \begin{bmatrix} 0.02 \\ 0.85 \\ 0.08 \\ 0.05 \end{bmatrix} ``` 预测结果:类别 2(汽车),因为第二个分量 0.85 最大。 ## 三、与二分类的对比 | 对比项 | 二分类 | 多类分类 | |--------|-------|---------| | 输出层神经元数 | 1 个 | K 个(K ≥ 3) | | 输出形式 | 单个标量 | K 维向量 | | 标签形式 | y ∈ {0, 1} | y ∈ {0, 1}ᴷ(独热编码) | | 预测规则 | h(x) > 0.5 判为正类 | arg max h(x)_i | | 代价函数 | 单个输出的交叉熵 | K 个输出的交叉熵之和 | ## 四、核心要点 1. **输出层神经元数 = 类别数 K** 2. **标签使用独热编码**:每个样本的标签是一个 K 维 0-1 向量 3. **预测使用 arg max**:选择输出值最大的类别 4. **本质**:多类分类可以看作 K 个独立的二分类问题,但共享隐藏层的特征提取能力 --- # 神经网络的学习 - 代价函数 ### 一、多类分类背景 在神经网络多分类问题中,输出层有 K 个神经元,对应 K 个类别。 - 网络输出 h_Θ(x) ∈ Rᴷ,其中 (h_Θ(x))ᵢ 表示第 i 个输出。 - 训练标签采用独热编码(One-hot Encoding),例如 4 类分类中,真实类别为第 2 类时,标签向量 y = [0, 1, 0, 0]ᵀ。 ### 二、逻辑回归代价函数 单输出二分类的代价函数形式: J(θ) = -1/m [Σᵢ₌₁ᵐ y⁽ⁱ⁾log h_θ(x⁽ⁱ⁾) + (1-y⁽ⁱ⁾)log(1-h_θ(x⁽ⁱ⁾))] + λ/(2m) Σⱼ₌₁ⁿ θⱼ² ### 三、神经网络代价函数 推广到 K 输出神经网络: J(Θ) = -1/m [Σᵢ₌₁ᵐ Σₖ₌₁ᴷ yₖ⁽ⁱ⁾log(h_Θ(x⁽ⁱ⁾)ₖ) + (1-yₖ⁽ⁱ⁾)log(1-h_Θ(x⁽ⁱ⁾)ₖ)] + λ/(2m) Σₗ₌₁ᴸ⁻¹ Σᵢ₌₁ˢˡ⁺¹ Σⱼ₌₁ˢˡ⁺¹ (Θⱼᵢ⁽ˡ⁾)² ### 四、代价函数的两大部分 #### 1. 交叉熵损失(第一部分) - Σᵢ₌₁ᵐ:对所有 m 个训练样本求和 - Σₖ₌₁ᴷ:对输出层的 K 个输出单元求和 - yₖ⁽ⁱ⁾:第 i 个样本在第 k 个输出上的真实标签(0 或 1) - h_Θ(x⁽ⁱ⁾)ₖ:第 i 个样本在第 k 个输出上的预测值 直观理解:将每个输出单元视为独立的二分类逻辑回归,计算所有输出单元的交叉熵损失之和。 #### 2. 正则化项(第二部分) 三层求和的含义: | 求和符号 | 含义 | 对应维度 | |---------|------|---------| | Σₗ₌₁ᴸ⁻¹ | 遍历所有层(权重矩阵) | 层 | | Σᵢ₌₁ˢˡ⁺¹ | 遍历目标层(第 l+1 层)的神经元 | 行 | | Σⱼ₌₁ˢˡ⁺¹ | 遍历当前层(第 l 层)的神经元(含偏置) | 列 | 注意:正则化项通常不包含偏置单元对应的参数 Θᵢ₀⁽ˡ⁾,但实践中包含与否影响很小。 ### 五、与逻辑回归代价函数的对比 | 对比项 | 逻辑回归 | 神经网络 | |--------|---------|---------| | 输出数量 | 1 个标量 | K 个输出 | | 样本求和 | Σᵢ₌₁ᵐ | Σᵢ₌₁ᵐ | | 输出求和 | 无(单输出) | Σₖ₌₁ᴷ | | 正则化求和 | Σⱼ₌₁ⁿ(单层) | ΣₗΣᵢΣⱼ(多层矩阵) | | 偏置处理 | 通常包含 θ₀ | 通常不包含 Θᵢ₀⁽ˡ⁾ | ### 六、核心要点 1. 代价函数 = 交叉熵损失 + 正则化项 2. 交叉熵损失:对每个样本的每个输出单元计算对数损失并求和 3. 正则化项:对所有权重矩阵的所有元素(除偏置外)的平方求和 4. 多类分类:输出层有 K 个神经元,标签使用独热编码 5. 目的:找到一组参数 Θ,使代价函数 J(Θ) 最小化 --- # 神经网络 - 反向传播算法 ## 回顾:前向传播 ### 符号说明 | 符号 | 含义 | |------|------| | L | 网络总层数 | | s_l | 第 l 层的神经元数(不含偏置) | | K | 输出层神经元数(类别数) | | m | 训练样本数 | | a^(l) | 第 l 层的激活值向量(含偏置 a_0^(l) = 1) | | z^(l) | 第 l 层的加权求和结果向量 | | Θ^(l) | 从第 l 层到第 l+1 层的权重矩阵 | | g(z) | Sigmoid 激活函数 | ### 前向传播计算流程 对于一个训练样本 x: **第 1 层(输入层)**: ```math a^{(1)} = x ``` **第 2 层(隐藏层)**: ```math z^{(2)} = \Theta^{(1)} a^{(1)} ``` ```math a^{(2)} = g(z^{(2)}) ``` ```math \text{添加偏置: } a^{(2)} = [1, a_1^{(2)}, a_2^{(2)}, a_3^{(2)}]^T ``` **第 3 层(输出层)**: ```math z^{(3)} = \Theta^{(2)} a^{(2)} ``` ```math h_\Theta(x) = a^{(3)} = g(z^{(3)}) ``` ## 二、反向传播算法的动机 ### 目标 最小化代价函数 J(Θ),需要计算所有参数的偏导数: ```math \frac{\partial}{\partial \Theta_{ij}^{(l)}} J(\Theta) ``` ### 挑战 神经网络参数众多,无法直接求导。反向传播通过从输出层逆向传播误差,高效计算所有偏导数。 ## 三、误差项 δ 的定义 ### 核心概念 **δ_j^(l)**:第 l 层第 j 个神经元的误差,表示该神经元对最终代价的影响程度。 ```math \delta_j^{(l)} = \frac{\partial}{\partial z_j^{(l)}} J(\Theta) ``` ### 向量化表示 ```math \delta^{(l)} = \begin{bmatrix} \delta_1^{(l)} \\ \delta_2^{(l)} \\ \vdots \\ \delta_{s_l}^{(l)} \end{bmatrix} ``` 注意:δ^(l) 是 s_l 维向量,**不包含偏置单元**对应的误差。 ## 四、输出层的误差计算 ### 公式 对于输出层(第 L 层),误差等于预测值与真实值的差: ```math \delta^{(L)} = a^{(L)} - y ``` ### 展开形式 对于 K 类分类问题,输出层有 K 个神经元: ```math \delta^{(L)} = \begin{bmatrix} a_1^{(L)} - y_1 \\ a_2^{(L)} - y_2 \\ \vdots \\ a_K^{(L)} - y_K \end{bmatrix} ``` ### 推导过程 代价函数对 z^(L) 求偏导: ```math J(\Theta) = -\frac{1}{m} \sum_{i=1}^{m} \sum_{k=1}^{K} [y_k \log(a_k^{(L)}) + (1-y_k) \log(1-a_k^{(L)})] ``` 对单个样本、单个输出单元: ```math \frac{\partial}{\partial z_k^{(L)}} J = \frac{\partial}{\partial a_k^{(L)}} J \cdot \frac{\partial a_k^{(L)}}{\partial z_k^{(L)}} ``` ```math = \left(-\frac{y_k}{a_k^{(L)}} + \frac{1-y_k}{1-a_k^{(L)}}\right) \cdot a_k^{(L)}(1-a_k^{(L)}) ``` ```math = a_k^{(L)} - y_k ``` 向量化即为: ```math \delta^{(L)} = a^{(L)} - y ``` ## 五、隐藏层的误差反向传播 ### 公式 从第 l+1 层向第 l 层反向传播误差: ```math \delta^{(l)} = (\Theta^{(l)})^T \delta^{(l+1)} \cdot g'(z^{(l)}) ``` 其中: ```math g'(z^{(l)}) = a^{(l)} \cdot (1 - a^{(l)}) ``` ### 完整形式 ```math \delta^{(l)} = (\Theta^{(l)})^T \delta^{(l+1)} \cdot a^{(l)} \cdot (1 - a^{(l)}) ``` ### 逐元素展开形式 ```math \delta_j^{(l)} = \left( \sum_{k=1}^{s_{l+1}} \Theta_{kj}^{(l)} \delta_k^{(l+1)} \right) \cdot a_j^{(l)} \cdot (1 - a_j^{(l)}) ``` | 符号 | 含义 | |------|------| | δ_j^(l) | 第 l 层第 j 个神经元的误差 | | Θ_kj^(l) | 从第 l 层第 j 个单元到第 l+1 层第 k 个单元的权重 | | δ_k^(l+1) | 第 l+1 层第 k 个神经元的误差 | | a_j^(l) | 第 l 层第 j 个神经元的激活值 | | s_(l+1) | 第 l+1 层的神经元数 | ### 推导过程 利用链式法则: ```math \delta_j^{(l)} = \frac{\partial J}{\partial z_j^{(l)}} = \sum_{k=1}^{s_{l+1}} \frac{\partial J}{\partial z_k^{(l+1)}} \cdot \frac{\partial z_k^{(l+1)}}{\partial z_j^{(l)}} ``` 其中: ```math z_k^{(l+1)} = \sum_{j=1}^{s_l} \Theta_{kj}^{(l)} a_j^{(l)} = \sum_{j=1}^{s_l} \Theta_{kj}^{(l)} g(z_j^{(l)}) ``` ```math \frac{\partial z_k^{(l+1)}}{\partial z_j^{(l)}} = \Theta_{kj}^{(l)} g'(z_j^{(l)}) ``` 代入得: ```math \delta_j^{(l)} = \sum_{k=1}^{s_{l+1}} \delta_k^{(l+1)} \cdot \Theta_{kj}^{(l)} \cdot g'(z_j^{(l)}) ``` ```math = \left( \sum_{k=1}^{s_{l+1}} \Theta_{kj}^{(l)} \delta_k^{(l+1)} \right) \cdot g'(z_j^{(l)}) ``` ### 维度验证 假设网络结构:s_2 = 3, s_3 = 1 ```math \Theta^{(2)} \in \mathbb{R}^{1 \times 4}, \quad \delta^{(3)} \in \mathbb{R}^{1} ``` ```math \delta^{(2)} = (\Theta^{(2)})^T \delta^{(3)} \cdot g'(z^{(2)}) ``` ```math (\Theta^{(2)})^T \in \mathbb{R}^{4 \times 1}, \quad \delta^{(3)} \in \mathbb{R}^{1} \implies (\Theta^{(2)})^T \delta^{(3)} \in \mathbb{R}^{4} ``` 去掉偏置对应的第一个元素,得到 δ^(2) ∈ ℝ³,与 s_2 = 3 一致。 ## 六、偏导数的计算 ### 公式 ```math \frac{\partial}{\partial \Theta_{ij}^{(l)}} J(\Theta) = a_j^{(l)} \delta_i^{(l+1)} ``` | 符号 | 含义 | |------|------| | Θ_ij^(l) | 从第 l 层第 j 个单元到第 l+1 层第 i 个单元的权重 | | a_j^(l) | 第 l 层第 j 个单元的激活值 | | δ_i^(l+1) | 第 l+1 层第 i 个单元的误差 | ### 向量化形式 ```math \frac{\partial}{\partial \Theta^{(l)}} J(\Theta) = \delta^{(l+1)} (a^{(l)})^T ``` ### 维度验证 ```math \delta^{(l+1)} \in \mathbb{R}^{s_{l+1}}, \quad a^{(l)} \in \mathbb{R}^{s_l + 1} ``` ```math \delta^{(l+1)} (a^{(l)})^T \in \mathbb{R}^{s_{l+1} \times (s_l + 1)} ``` 与 Θ^(l) 的维度 s_(l+1) × (s_l + 1) 一致。 ## 七、完整算法流程 ### 符号说明 | 符号 | 含义 | |------|------| | Δ^(l) | 第 l 层误差累加矩阵(初始化为全零矩阵) | | D^(l) | 第 l 层最终偏导数矩阵 | ### 算法步骤 **步骤 1**:初始化误差累加矩阵 ```math \Delta^{(l)} = 0, \quad \text{for } l = 1, 2, ..., L-1 ``` **步骤 2**:遍历每个训练样本,i = 1 到 m **步骤 2a**:前向传播 ```math a^{(1)} = x^{(i)} ``` ```math \text{计算 } z^{(2)}, a^{(2)}, z^{(3)}, a^{(3)}, ..., z^{(L)}, a^{(L)} ``` **步骤 2b**:计算输出层误差 ```math \delta^{(L)} = a^{(L)} - y^{(i)} ``` **步骤 2c**:反向传播误差 ```math \text{for } l = L-1 \text{ down to } 2: ``` ```math \delta^{(l)} = (\Theta^{(l)})^T \delta^{(l+1)} \cdot g'(z^{(l)}) ``` **步骤 2d**:累加偏导数 ```math \Delta^{(l)} := \Delta^{(l)} + \delta^{(l+1)} (a^{(l)})^T ``` **步骤 3**:计算最终偏导数(含正则化) **对于偏置参数(j = 0)**: ```math D_{ij}^{(l)} = \frac{1}{m} \Delta_{ij}^{(l)} ``` **对于权重参数(j ≥ 1)**: ```math D_{ij}^{(l)} = \frac{1}{m} \Delta_{ij}^{(l)} + \frac{\lambda}{m} \Theta_{ij}^{(l)} ``` ### 梯度下降更新 ```math \Theta^{(l)} := \Theta^{(l)} - \alpha D^{(l)} ``` ## 八、三层网络完整示例 ### 网络结构 - L = 3(输入层、隐藏层、输出层) - s_1 = 3(3 个输入特征) - s_2 = 3(隐藏层 3 个神经元) - s_3 = K = 1(二分类) ### 前向传播 ```math a^{(1)} = \begin{bmatrix} x_0 \\ x_1 \\ x_2 \\ x_3 \end{bmatrix} = \begin{bmatrix} 1 \\ x_1 \\ x_2 \\ x_3 \end{bmatrix} ``` ```math z^{(2)} = \Theta^{(1)} a^{(1)}, \quad \Theta^{(1)} \in \mathbb{R}^{3 \times 4} ``` ```math a^{(2)} = g(z^{(2)}) = \begin{bmatrix} g(z_1^{(2)}) \\ g(z_2^{(2)}) \\ g(z_3^{(2)}) \end{bmatrix} ``` ```math a^{(2)} = \begin{bmatrix} 1 \\ a_1^{(2)} \\ a_2^{(2)} \\ a_3^{(2)} \end{bmatrix} ``` ```math z^{(3)} = \Theta^{(2)} a^{(2)}, \quad \Theta^{(2)} \in \mathbb{R}^{1 \times 4} ``` ```math h_\Theta(x) = a^{(3)} = g(z^{(3)}) ``` ### 反向传播 ```math \delta^{(3)} = a^{(3)} - y ``` ```math \delta^{(2)} = (\Theta^{(2)})^T \delta^{(3)} \cdot g'(z^{(2)}) ``` ```math g'(z^{(2)}) = a^{(2)} \cdot (1 - a^{(2)}) = \begin{bmatrix} a_1^{(2)}(1-a_1^{(2)}) \\ a_2^{(2)}(1-a_2^{(2)}) \\ a_3^{(2)}(1-a_3^{(2)}) \end{bmatrix} ``` ```math \frac{\partial}{\partial \Theta^{(2)}} J = \delta^{(3)} (a^{(2)})^T ``` ```math \frac{\partial}{\partial \Theta^{(1)}} J = \delta^{(2)} (a^{(1)})^T ``` ## 九、核心要点总结 1. **输出层误差**:δ^(L) = a^(L) - y(预测值减真实值) 2. **隐藏层误差**:δ^(l) = (Θ^(l))ᵀ δ^(l+1) · g'(z^(l)) 3. **偏导数**:∂J/∂Θ_ij^(l) = a_j^(l) δ_i^(l+1) 4. **输入层没有误差**:δ^(1) 不存在,因为输入层只是数据入口 5. **正则化处理**:偏置参数(j = 0)不参与正则化惩罚 --- # 随机初始化 (Random Initialization) ## 1. 核心动机:为什么不能全零初始化? 在神经网络中,如果将所有权重 Θ 和偏置 b 初始化为 0(或相同的常数),会导致**对称权重问题 (Symmetry Breaking)**: - **正向传播**:每一层的所有神经元接收到的加权输入完全相同。 - **反向传播**:由于输入相同,梯度更新量也完全相同。 - **后果**:同一层的所有神经元会保持相同的权重,网络退化为"单层"效果,无法学习复杂特征。 ## 2. 解决方案:随机初始化 打破对称性,需为权重赋予**小的随机值**: - **权重 Θ**:随机初始化(如 N(0, 0.01²) 或均匀分布)。 - **偏置 b**:通常可初始化为 0(因权重已随机,偏置不影响对称性),或小常数。 ## 3. 结合历史:正向与反向视角的统一 回顾前几轮的正向/反向传播,随机初始化是训练的起点: - **正向**:a^(l) = g(Θ^(l-1) a^(l-1) + b^(l-1)),初始 Θ 决定初始激活分布。 - **反向**:δ^(l) = (Θ^(l))^T δ^(l+1) · g'(z^(l)),初始 Θ 也影响误差回传。 - **参数更新**:Θ^(l) := Θ^(l) - α ∂J/∂Θ^(l),随机起点确保各参数走向不同局部最优。 ## 4. 常见初始化方法(拓展) | 方法 | 核心思想 | 适用场景 | |------|---------|---------| | **简单随机** | 小范围均匀/正态分布 | 浅层网络 | | **Xavier (Glorot)** | 方差 ∝ 2/(n_in+n_out),保持输入输出方差一致 | Sigmoid/Tanh | | **He 初始化** | 方差 ∝ 2/n_in,考虑 ReLU 的半饱和特性 | ReLU 系列 | | **正交初始化** | 权重矩阵正交,保持梯度范数稳定 | RNN/CNN | ## 5. 关键笔记结论 - **必须随机**:打破对称,让不同神经元学习不同特征。 - **要小不要大**:权重过大导致 z 落入激活函数饱和区(如 Sigmoid 两端),梯度消失;过小导致信号衰减。 - **偏置可零**:偏置不决定对称性,常初始化为 0。 - **与反向传播联动**:随机初始化的 Θ 是正向传信号、反向传误差的"桥梁",同一轮迭代中正向/反向共用该 Θ,训练后逐轮更新。 ## 6. 一句话记忆 **"全零不行要随机,小权重点亮网络;偏置可零不关键,对称打破是核心。"** --- # 神经网络总结 ## 1. 核心脉络:神经网络完整训练流程 1. **初始化**:权重 Θ 随机初始化(打破对称),偏置可置0。 2. **正向传播**:逐层计算 z^(l) 与 a^(l),得最终预测 a^(L)。 3. **计算代价**:J(Θ)(预测值与真实值差异)。 4. **反向传播**:从输出层起算 δ^(L),逐层回传得各层 δ^(l)(不含偏置)。 5. **求梯度并更新**:结合 δ 与 a 算偏导,梯度下降更新 Θ, b。 ## 2. 每层神经元数量推荐 | 层级 | 数量原则 | 说明 | |------|---------|------| | **输入层** | 等于特征维度 | 直接由数据集决定 | | **隐藏层** | 经验规则:逐渐递减(如256→128→64)或保持相近 | 太少欠拟合,太多易过拟合,需调参 | | **输出层** | 等于类别数(分类)或1(回归) | 由任务类型决定 | ## 3. 初始化权重推荐 | 激活函数 | 推荐初始化 | 说明 | |---------|-----------|------| | **Sigmoid/Tanh** | Xavier 初始化:方差 = 2/(n_in+n_out) | 避免梯度消失/爆炸 | | **ReLU 系列** | He 初始化:方差 = 2/n_in | 适应 ReLU 半饱和特性 | | **浅层网络** | 简单小随机:N(0, 0.01²) | 简单场景够用 | ## 4. 一句话结论 **"随机起步,正向预测,反向纠错,循环更新;隐藏层渐减,激活定初始。"** --- # 评估假设 (Evaluating Hypotheses) ## 一、 为什么需要评估假设?(训练与测试的分离) 在神经网络中,我们通过反向传播最小化代价 J(Θ) 来训练模型。但**代价低不代表模型好用**。 - 模型可能在训练集上误差极小(过拟合),但面对新数据却表现糟糕。 - **核心目标**:评估模型的"泛化能力"(在新样本上的预测能力)。 ## 二、 标准评估流程:训练集与测试集 必须将数据集拆分,打破"既当运动员又当裁判": 1. **训练集 (Training Set)**:用于运行正向/反向传播,学习参数 Θ(通常占 70%)。 2. **测试集 (Test Set)**:用于最终评估,全程不参与训练(通常占 30%)。 > 注:更严谨时会分为训练集、交叉验证集(调超参)、测试集(最终打分)。 ## 三、 评估指标(不同任务) 模型在测试集上的表现,才是真正的"假设评估"结果: - **回归问题**(如房价预测): 计算**测试集均方误差 (MSE)**。数值越小,泛化越好。 - **分类问题**(如神经网络分类): - **错误率 (Misclassification Rate)**:测试集中预测错的样本比例。 - **准确率 (Accuracy)**:预测对的样本比例(= 1 - 错误率)。 ## 四、 逻辑串联(结合你的历史疑问) 1. **正向传播**:在训练集上算出预测 ŷ。 2. **算代价 J**:评估当前训练集上的总误差,并启动反向传播更新权重。 3. **训练完成**:参数 Θ 固定。 4. **评估假设**:将测试集做一次**纯正向传播**(不更新权重),计算测试集的误差/准确率。 - 若训练误差低、测试误差高 → **过拟合**(模型死记硬背了训练集)。 - 若两者都低 → **模型优秀**。 ## 五、 核心要点总结 - "评估假设"就是看模型在**未知数据(测试集)**上的表现。 - 训练集用来算 J 和调权重;测试集用来最终打分。 - 只有测试集的误差,才能真实反映假设函数的好坏。 --- # 模型选择和训练、验证、测试集 ## 一、核心问题:为什么要分三份? 只用训练集+测试集时,如果用测试集来比较不同模型(如多项式次数、隐藏层数),选出的最佳模型在测试集上的表现会**虚高**,因为测试集的信息已经被"偷看"了。 ## 二、三集分工 | 数据集 | 用途 | 是否参与决策 | |-------|------|------------| | **训练集** | 学习参数 Θ | ✅ 是 | | **验证集** | 选择模型/调超参 | ✅ 是 | | **测试集** | 最终评估泛化能力 | ❌ 否(只看一次) | ## 三、模型选择流程 1. 对每种候选模型(如不同隐藏层数的网络),在**训练集**上训练,得到参数 Θ 2. 在**验证集**上计算误差,选出误差最小的模型 3. 用选出的模型在**测试集**上做最终评估,报告泛化误差 ## 四、典型比例 - 小数据集:60% 训练 + 20% 验证 + 20% 测试 - 大数据集:98% 训练 + 1% 验证 + 1% 测试 ## 五、一句话总结 **"训练集学参数,验证集选模型,测试集终评分——验证集隔离了调参对测试集的污染。"** --- # 诊断偏差与方差 ## 一、核心概念回顾 - **偏差**:模型预测的期望值与真实值的差异,反映模型**欠拟合**程度(系统性不准)。 - **方差**:模型在不同训练集上预测的波动程度,反映模型**过拟合**程度(对数据敏感不稳)。 - **不可约噪声**:数据本身固有的随机误差,任何模型都无法消除。 ## 二、均方误差(MSE)与分解推导 **1. 定义与展开** MSE = E[(y - ŷ)²] 将 ŷ 视为固定值,利用期望线性性质展开: MSE = E[y²] - 2ŷE[y] + ŷ² **2. 配凑技巧(加减项)** 加减 E[y]² 进行配方: MSE = (ŷ² - 2ŷE[y] + E[y]²) + (E[y²] - E[y]²) 得到中间分解: MSE = (ŷ - E[y])² + E[(y - E[y])²] (前者对应偏差平方,后者对应数据固有方差/噪声) **3. 完整偏差-方差分解** 考虑模型在不同训练集上的波动(将预测值视为随机变量 f̂),总期望泛化误差为: MSE = [E[f̂(x)] - f(x)]² + E[(f̂(x) - E[f̂(x)])²] + σ² **核心结论**:总误差 = 偏差² + 方差 + 噪声,三者此消彼长。 ## 三、诊断:如何通过误差判断问题 通过对比**训练误差**与**验证(测试)误差**进行诊断: | 诊断情况 | 训练误差 | 验证误差 | 问题类型 | 直观含义 | |---------|---------|---------|---------|---------| | **偏差大** | **高** | **高**(≈训练误差) | 欠拟合 | 模型太简单,两边都没学好 | | **方差大** | **低** | **高**(远高于训练) | 过拟合 | 模型太复杂,死记硬背训练集 | | **理想状态** | 低 | 低 | 拟合良好 | 准且稳 | | 偏差大+方差大 | 高 | 高(且波动) | 双重问题 | 模型结构与数据均需调整 | ## 四、解决策略(权衡对策) | 存在问题 | 表现 | 解决方向 | |---------|------|---------| | **偏差大(欠拟合)** | 学不到位 | 增加模型复杂度(加深/加宽网络)、减少正则化、延长训练、增加特征 | | **方差大(过拟合)** | 学得太碎 | 增加训练数据、降低模型复杂度、增大正则化(L1/L2/Dropout)、早停(Early Stopping) | ## 五、核心总结 - **靶心类比**:偏差大是"子弹都偏离靶心(不准)",方差大是"子弹散落各处(不稳定)"。 - **权衡本质**:降低偏差常需复杂模型(易增方差),降低方差需简化/正则化(易增偏差),需寻找平衡点。 - **诊断关键**:训练与验证误差的差距是判断偏差/方差问题的核心依据。 --- # 正则化和偏差、方差 ## 一、核心问题:λ 对偏差和方差的影响 正则化参数 λ 控制权重惩罚力度,直接影响偏差-方差权衡: | λ 取值 | 效果 | 问题 | |--------|------|------| | **λ 太大** | 权重被压到接近 0,模型趋近于常数 | **高偏差(欠拟合)** | | **λ 太小** | 几乎没有约束,权重随意变大 | **高方差(过拟合)** | | **λ 适中** | 平衡拟合度与复杂度 | 理想状态 | ## 二、如何选择合适的 λ 遍历候选 λ 值(如 0, 0.01, 0.02, ..., 10),对每个 λ: 1. 用训练集学习参数 Θ 2. 用验证集计算**不带正则化**的误差(评估真实表现) 3. 选验证误差最小的 λ 4. 用该 λ 在测试集上做最终评估 ## 三、误差曲线规律 | λ 区间 | 训练误差 | 验证误差 | 诊断 | |--------|---------|---------|------| | **λ 过小** | 低(接近 0) | 高(远高于训练) | 高方差(过拟合) | | **λ 过大** | 高 | 高(≈训练误差) | 高偏差(欠拟合) | | **λ 适中** | 略高 | 最低 | 最佳平衡点 | ## 四、与之前知识的串联 - **偏差大(欠拟合)** → 减小 λ(放松权重约束,让模型更灵活) - **方差大(过拟合)** → 增大 λ(加强权重惩罚,让模型更简单) - 评估时去掉正则化项(10-4 结论),只看模型在验证集上的预测误差 ## 五、一句话总结 **"λ 太小过拟合,λ 太大欠拟合;遍历 λ 找验证误差最低点,就是最佳正则化强度。"** --- # 学习曲线 ## 一、什么是学习曲线 学习曲线是以**训练集大小 m** 为横轴,**误差**为纵轴绘制的曲线,用于诊断模型是否存在高偏差或高方差问题。 ## 二、典型形状与诊断 ### 1. 高偏差(欠拟合)—— 曲线提前收敛 | 特征 | 说明 | |------|------| | 训练误差 | 随 m 增大而上升,很快趋于平稳 | | 验证误差 | 随 m 增大而下降,很快趋于平稳 | | 两者差距 | **很小**,且都停留在较高水平 | | 结论 | 增加数据**无帮助**,偏差是瓶颈 | ### 2. 高方差(过拟合)—— 曲线有较大差距 | 特征 | 说明 | |------|------| | 训练误差 | 始终较低,随 m 增大缓慢上升 | | 验证误差 | 始终较高,随 m 增大缓慢下降 | | 两者差距 | **很大**,且有缩小趋势 | | 结论 | 增加数据**可能有帮助**,方差是瓶颈 | ## 三、如何利用学习曲线做决策 | 曲线形态 | 诊断 | 对策 | |---------|------|------| | 两线早早汇合且都很高 | **高偏差(欠拟合)** | 增加模型复杂度,不是加数据 | | 两线之间有较大差距 | **高方差(过拟合)** | 增加训练数据有帮助 | | 两线都低且接近 | 理想状态 | 维持现状 | ## 四、一句话总结 **"学习曲线看两线:高偏差两线早汇合且都高,加数据没用;高方差两线差距大,加数据有用。"** --- # 误差分析 ## 一、核心思想 **不要凭空猜测模型哪里有问题,而是去看实际被分错的样本,从中发现规律。** ## 二、误差分析步骤 1. 在验证集上运行模型,找出所有被分错的样本 2. 手动检查这些错误样本,观察它们的共同特征 3. 根据发现的模式,决定下一步改进方向 ## 三、常见错误模式举例(以垃圾邮件分类为例) | 发现的问题 | 可能的改进方向 | |-----------|--------------| | 大量误报包含特定关键词 | 增加该关键词的处理规则 | | 误报集中在拼写错误的邮件 | 加入拼写校正预处理 | | 误报集中在超长邮件 | 增加邮件长度特征 | | 误报集中在特定来源 | 增加发件人信誉特征 | ## 四、误差分析的量化方法 创建一个**错误分类表格**,对每个错误样本标注其所属的错误类型: | 样本 | 真实标签 | 预测标签 | 错误类型1 | 错误类型2 | |------|---------|---------|----------|----------| | 邮件1 | 垃圾 | 正常 | 漏掉关键词 | 拼写错误 | | 邮件2 | 正常 | 垃圾 | 误判关键词 | — | | 邮件3 | 垃圾 | 正常 | 超长邮件 | 拼写错误 | 统计每种错误类型的占比,优先解决**最常见的问题**。 ## 五、误差分析的原则 | 原则 | 说明 | |------|------| | **数据驱动** | 不要靠直觉猜,要看实际错误样本 | | **量化优先** | 统计各类错误的数量和占比 | | **80/20法则** | 优先解决最常见的错误类型 | | **快速迭代** | 做一个改进 → 重新评估 → 再看错误分布 | ## 六、一句话总结 **"别猜哪里错了,去看错在哪——量化错误类型,优先解决最常见的问题。"** --- # 不对称性分类的误差评估 ## 一、为什么不能用准确率? 当类别严重不平衡时(如罕见病检测:99.5% 健康 vs 0.5% 患病),一个永远预测"健康"的模型准确率高达 99.5%,但完全没有实用价值。 ## 二、混淆矩阵(Confusion Matrix) | 真实\预测 | 正例(Positive) | 负例(Negative) | |----------|-----------------|-----------------| | **正例** | TP(真正例) | FN(假负例,漏报) | | **负例** | FP(假正例,误报) | TN(真负例) | ## 三、核心评估指标 | 指标 | 公式 | 含义 | |------|------|------| | **Precision(精确率)** | TP / (TP + FP) | 预测为正例的样本中,有多少是真的正例 | | **Recall(召回率)** | TP / (TP + FN) | 真实正例中,有多少被正确找出来了 | | **F₁ Score** | 2·P·R / (P + R) | 精确率和召回率的调和平均,综合评价指标 | ## 四、不同场景的侧重点 | 场景 | 更关注 | 原因 | |------|--------|------| | **癌症筛查** | **高 Recall** | 宁可误报也不能漏诊 | | **垃圾邮件过滤** | **高 Precision** | 宁可漏掉垃圾邮件,也不要误删正常邮件 | | **通用场景** | **F₁ Score** | 兼顾精确率和召回率 | ## 五、一句话总结 **"类别不平衡时别信准确率,用精确率、召回率和 F₁ 来评估模型真本事。"** --- # 精确率和召回率的权衡 ## 一、精确率和召回率的关系 精确率和召回率是一对**此消彼长**的矛盾指标,无法同时达到最高。 ## 二、为什么需要权衡? 以逻辑回归的输出概率为例,我们需要设定一个**阈值**来决定预测结果: - 预测概率 ≥ 阈值 → 预测为正例 - 预测概率 < 阈值 → 预测为负例 | 阈值调整 | 精确率 | 召回率 | 解释 | |---------|-------|-------|------| | **提高阈值**(如从 0.5 提到 0.9) | ↑ 升高 | ↓ 降低 | 只在非常确信时才判为正例,减少误报但容易漏掉 | | **降低阈值**(如从 0.5 降到 0.3) | ↓ 降低 | ↑ 升高 | 放宽判断标准,减少漏报但容易误报 | ## 三、如何选择阈值? | 场景 | 目标 | 阈值策略 | |------|------|---------| | **癌症筛查** | 尽可能不漏诊(高召回率) | 降低阈值(如 0.3) | | **垃圾邮件过滤** | 尽可能不误删正常邮件(高精确率) | 提高阈值(如 0.9) | | **通用场景** | 兼顾两者(高 F₁ Score) | 选择使 F₁ 最大的阈值 | ## 四、F₁ Score 的作用 F₁ Score 是精确率和召回率的**调和平均**,自动帮你找到两者的最佳平衡点: F₁ = 2 · P · R / (P + R) - 只有当精确率和召回率都高时,F₁ 才高 - 如果一个极低、另一个极高,F₁ 会被拉低 ## 五、一句话总结 **"调阈值就是在精确率和召回率之间做交易——想少漏就降阈值,想少错就升阈值,F₁ 帮你找最佳平衡点。"** --- # 数据对机器学习的影响 ## 一、核心观点 **在合适的条件下,更多的数据几乎总是能带来更好的模型表现。** ## 二、什么条件下"更多数据"有效? | 条件 | 说明 | |------|------| | **特征包含足够信息** | 输入特征 x 包含了预测 y 所需的全部信息 | | **模型容量足够大** | 模型能够学习复杂的映射关系(如大型神经网络) | 满足这两个条件时,更多数据可以帮助模型逼近最优性能。 ## 三、为什么更多数据有效? ### 从偏差-方差角度看 - 高方差(过拟合):更多数据 → 降低方差 → 验证误差下降 - 高偏差(欠拟合):更多数据 → 对偏差影响不大 → 需要先增加模型复杂度 ## 四、大规模数据的实践规律 | 数据量 | 典型表现 | |--------|---------| | **少量数据** | 简单模型可能更好,防止过拟合 | | **中等数据** | 复杂模型开始展现优势 | | **海量数据** | 复杂模型(如深度学习)表现远超简单模型 | ## 五、需要注意的陷阱 | 陷阱 | 说明 | |------|------| | **数据质量比数量更重要** | 脏数据再多也没用 | | **盲目加数据不解决问题** | 高偏差时先加模型复杂度,再加数据 | | **边际收益递减** | 数据量越大,每增加一份数据带来的提升越小 | ## 六、一句话总结 **"特征信息够、模型容量足,数据越多越强——但别在欠拟合时盲目加数据,先升级模型再说。"** --- # SVM 优化目标 ## 一、从逻辑回归到 SVM 的转变 ### 逻辑回归的代价函数 J(θ) = -(1/m) Σᵢ₌₁ᵐ [yⁱ log(h(xⁱ)) + (1-yⁱ) log(1-h(xⁱ))] + (λ/2m) Σⱼ₌₁ⁿ θⱼ² 其中 h(x) = 1/(1+e^(-θᵀx)) ### SVM 的改造思路 将逻辑回归的代价函数中的对数项替换为**分段线性函数**,得到 SVM 的代价函数。 ## 二、SVM 的代价函数 ### 单个样本的代价 令 z = θᵀx - **正类(y=1)**:cost₁(z) = max(0, 1-z) - 当 z ≥ 1 时,代价为 0(分类正确且有余量) - 当 z < 1 时,代价线性增长 - **负类(y=0)**:cost₀(z) = max(0, 1+z) - 当 z ≤ -1 时,代价为 0(分类正确且有余量) - 当 z > -1 时,代价线性增长 ### 完整代价函数 min C Σᵢ₌₁ᵐ [yⁱ cost₁(θᵀxⁱ) + (1-yⁱ) cost₀(θᵀxⁱ)] + (1/2) Σⱼ₌₁ⁿ θⱼ² 其中 C 相当于逻辑回归中 1/λ 的角色: - C 大 → 低偏差、高方差(更关注分类正确) - C 小 → 高偏差、低方差(更关注间隔最大化) ## 三、SVM 的假设函数 h(x) = - 1 if θᵀx ≥ 0 - 0 otherwise SVM 直接输出类别标签(0 或 1),而非概率值。 ## 四、与逻辑回归的对比 | 对比项 | 逻辑回归 | SVM | |--------|---------|-----| | 输出 | 概率值 (0,1) | 类别标签 {0,1} | | 代价函数 | 对数损失 | 铰链损失 | | 决策边界 | 概率=0.5 | 最大间隔超平面 | | 参数控制 | λ(正则化系数) | C(惩罚系数) | ## 五、一句话总结 **"SVM 用铰链损失替代对数损失,目标是让正类样本满足 θᵀx ≥ 1、负类满足 θᵀx ≤ -1,实现最大间隔分类。"** --- # 直观上对大间隔的理解 ## 一、什么是"大间隔"? SVM 不仅要把两类样本分开,还要让决策边界离最近的样本点尽可能远。这个"最近的距离"就是**间隔(Margin)**。 ## 二、为什么大间隔更好? ### 小间隔 vs 大间隔 ``` 小间隔(容易出错) 大间隔(鲁棒) │ │ ╳ ╳│○ ○ ╳ ╳ │ ○ ○ ╳ ╳│○ ○ ╳ ╳ │ ○ ○ ╳ ╳│○ ○ ╳ ╳ │ ○ ○ │ │ ``` | 对比 | 小间隔 | 大间隔 | |------|-------|-------| | 决策边界位置 | 紧贴某类样本 | 远离所有样本 | | 对新样本的容忍度 | 低(稍扰动就判错) | 高(有缓冲空间) | | 泛化能力 | 差(容易过拟合) | 好(更鲁棒) | ## 三、C 参数对间隔的影响 | C 取值 | 效果 | 间隔 | 问题 | |--------|------|------|------| | **C 很大** | 严格分类每一个训练样本 | 间隔小 | 高方差(过拟合) | | **C 很小** | 允许少量分类错误 | 间隔大 | 高偏差(欠拟合) | | **C 适中** | 平衡分类正确与间隔大小 | 间隔适中 | 理想状态 | ## 四、SVM 的"大间隔分类器"特性 SVM 天然倾向于找到一个**最大间隔**的决策边界,这是由其优化目标决定的: min C Σᵢ₌₁ᵐ [yⁱ cost₁(θᵀxⁱ) + (1-yⁱ) cost₀(θᵀxⁱ)] + (1/2) Σⱼ₌₁ⁿ θⱼ² - 第一项(代价项):推动模型正确分类 - 第二项(正则化项):推动模型保持权重小 → 间隔大 ## 五、异常值的影响 ``` 原始数据 有一个异常值(C 大时) ╳ ╳│○ ○ ╳ ╳ │○ ○ ╳ ╳│○ ○ ╳ ╳ ╳ │○ ○ ╳ ╳│○ ○ ╳ ╳ │○ ○ ``` - C 很大时:决策边界会被异常值"拉偏",间隔变小 - C 适当时:模型会忽略少数异常值,保持大间隔 ## 六、一句话总结 **"SVM 追求的不是单纯分开,而是分开后还留足安全距离——C 控制你愿意为正确分类牺牲多少间隔。"** --- # SVM - 大间隔分类器的数学原理 ## 一、向量内积回顾 ### 内积的定义 两个 n 维向量 u 和 v 的内积: uᵀv = ‖u‖ · ‖v‖ · cos(θ) 其中: - ‖u‖:向量 u 的长度(范数),‖u‖ = √(u₁² + u₂² + ... + uₙ²) - ‖v‖:向量 v 的长度 - θ:u 和 v 之间的夹角 ### 内积的几何意义 uᵀv = ‖u‖ · p 其中 p 是 v 在 u 方向上的**投影长度**: - p = ‖v‖ · cos(θ) - 当夹角小于 90° 时,p 为正 - 当夹角大于 90° 时,p 为负 ## 二、SVM 决策边界的向量表示 ### 简化条件 为便于推导,设 θ₀ = 0(决策边界过原点),n = 2(二维特征)。 ### 决策规则 - 正类:θᵀx ≥ 0 - 负类:θᵀx < 0 ### 用内积表示 θᵀx = ‖θ‖ · p 其中 p 是 x 在 θ 方向上的投影长度。 ## 三、SVM 的优化目标(简化版) min (1/2) Σⱼ₌₁ⁿ θⱼ² = (1/2) ‖θ‖² 约束条件: - 正类(y=1):θᵀx ≥ 1 → ‖θ‖ · p ≥ 1 - 负类(y=0):θᵀx ≤ -1 → ‖θ‖ · p ≤ -1 ## 四、为什么会产生大间隔? ### 小间隔的情况 - 样本在 θ 方向上的投影 p 较小 - 为了满足 ‖θ‖ · p ≥ 1,需要 ‖θ‖ 很大 - 但优化目标是要最小化 ‖θ‖²,所以这种方案被惩罚 ### 大间隔的情况 - 样本在 θ 方向上的投影 p 较大 - 只需要较小的 ‖θ‖ 就能满足 ‖θ‖ · p ≥ 1 - 符合优化目标,被选中 ## 五、决策边界的几何解释 - θ 的方向垂直于决策边界 - 样本在 θ 方向上的投影越大,说明离决策边界越远 - SVM 通过最小化 ‖θ‖,迫使样本在 θ 方向上有尽可能大的投影 → 大间隔 ## 六、θ₀ ≠ 0 的情况 当决策边界不过原点时,上述原理仍然成立,只是决策边界的位置会平移,间隔的计算方式相应调整,但核心思想不变。 ## 七、一句话总结 **"SVM 最小化 ‖θ‖ 迫使样本在 θ 方向上投影尽量大 → 样本离决策边界尽量远 → 自然形成大间隔。"** --- # 核函数概念 ## 一、为什么需要核函数? 当数据在原始特征空间中**线性不可分**时,需要将其映射到更高维的空间使其变得线性可分。核函数提供了一种高效完成这个映射的方法。 ## 二、核函数的直观理解 ### 原始空间(线性不可分) ``` x₂ ↑ │ ○ ○ │ ○ ○ ○ │ ○ ○ │ ╳ ╳ ╳ │ ╳ ╳ ╳ ╳ └──────────→ x₁ ``` ### 映射到新空间(线性可分) 通过核函数计算相似度,将每个样本映射到新特征空间。 ## 三、地标点与相似度特征 ### 地标点的选择 选择地标点 l¹, l², ..., lᵏ,每个地标对应一个新特征。 ### 相似度特征的定义(以高斯核为例) 对于样本 x,定义新特征 fᵢ: fᵢ = similarity(x, lⁱ) = exp(-‖x - lⁱ‖² / 2σ²) 其中: - ‖x - lⁱ‖:样本 x 到地标 lⁱ 的欧氏距离 - σ:高斯核的带宽参数,控制相似度衰减速度 ### 新特征向量的含义 f = [f₁, f₂, ..., fₖ] - fᵢ ∈ (0, 1] - fᵢ 越接近 1 → x 与 lⁱ 越相似(距离越近) - fᵢ 越接近 0 → x 与 lⁱ 越不相似(距离越远) ## 四、高斯核的参数 σ | σ 取值 | 相似度衰减 | 效果 | |--------|-----------|------| | **σ 很大** | 慢(平滑) | 高偏差(欠拟合),决策边界平滑 | | **σ 很小** | 快(陡峭) | 高方差(过拟合),决策边界复杂 | | **σ 适中** | 适中 | 理想状态 | ## 五、地标点的选择方法 | 方法 | 新特征维度 | 说明 | |------|-----------|------| | **所有训练样本做地标** | m 维 | 最常用,表达能力最强 | | **随机子集** | k 维 | 降低计算成本 | | **聚类中心** | k 维 | 用 K-means 选取代表性点 | 最常用的做法是**将所有训练样本 xⁱ 作为地标点 lⁱ**,此时每个样本得到一个 m 维的相似度向量。 ## 六、训练与预测的计算 ### 训练阶段 - 每个样本 xⁱ 与所有地标(即所有训练样本)计算相似度 - 得到 m × m 的相似度矩阵(核矩阵) - 在此新特征空间上训练线性 SVM ### 预测阶段 - 新样本只需与**支持向量**(非所有样本)计算相似度 - 支持向量个数 k ≪ m,预测效率高 ## 七、核函数的本质 **核函数不是真的去计算高维空间的坐标,而是直接在原始空间中计算两个点在高维空间中的内积——省去了显式映射的计算开销。** ## 八、一句话总结 **"核函数通过地标点和相似度计算,把线性不可分的数据映射到高维空间变得线性可分——高斯核的 σ 控制着决策边界的平滑程度。"** --- # 核函数使用 ## 一、SVM 中使用核函数的完整流程 ### 1. 选择地标点 将所有训练样本 x¹, x², ..., xᵐ 作为地标点 l¹, l², ..., lᵐ。 ### 2. 计算新特征向量 对于每个样本 xⁱ,计算其与所有地标的相似度,得到 m 维特征向量 fⁱ: fⁱ = [similarity(xⁱ, l¹), similarity(xⁱ, l²), ..., similarity(xⁱ, lᵐ)] ### 3. 在新特征空间上训练 SVM 用 fⁱ 替代原始特征 xⁱ,训练线性 SVM: min C Σᵢ₌₁ᵐ [yⁱ cost₁(θᵀfⁱ) + (1-yⁱ) cost₀(θᵀfⁱ)] + (1/2) Σⱼ₌₁ᵐ θⱼ² ### 4. 预测 对新样本 x_new,先计算其与所有地标的相似度向量 f_new,然后: h(x_new) = 1 if θᵀf_new ≥ 0 0 otherwise ## 二、SVM 参数的选择 ### C 参数(正则化) | C 取值 | 效果 | 偏差-方差 | |--------|------|-----------| | **C 很大** | 严格分类每个训练样本,间隔小 | 高方差(过拟合) | | **C 很小** | 允许分类错误,间隔大 | 高偏差(欠拟合) | ### σ² 参数(高斯核带宽) | σ² 取值 | 相似度衰减 | 效果 | |---------|-----------|------| | **σ² 很大** | 慢(平滑) | 高偏差(欠拟合),决策边界平滑 | | **σ² 很小** | 快(陡峭) | 高方差(过拟合),决策边界复杂 | ## 三、核函数的其他类型 | 核函数 | 公式 | 适用场景 | |--------|------|---------| | **线性核** | xᵀz | 线性可分数据,或特征维度很高时 | | **高斯核(RBF)** | exp(-‖x-z‖² / 2σ²) | 最常用,适用于大多数非线性问题 | | **多项式核** | (xᵀz + c)ᵈ | 文本分类等特定场景 | | **Sigmoid 核** | tanh(κxᵀz + c) | 神经网络风格的核函数 | ## 四、核函数的 Mercer 定理 不是任意函数都能用作核函数。Mercer 定理给出了合法核函数的条件: - 核矩阵必须是对称半正定的 - 满足该条件的核函数才能保证 SVM 优化问题是凸的,能找到全局最优解 ## 五、使用核函数时的注意事项 | 注意事项 | 说明 | |---------|------| | **特征缩放** | 使用高斯核前必须对特征进行归一化/标准化,否则距离计算会被量纲大的特征主导 | | **计算成本** | 高斯核训练 O(m²),m 很大时(如 > 50000)应考虑线性核或近似方法 | | **参数调优** | C 和 σ² 需要通过交叉验证联合调优 | ## 六、一句话总结 **"核 SVM 先用核函数把原始特征映射到高维相似度空间,再训练线性 SVM——C 控正则化、σ 控平滑度,特征缩放不能忘。"** --- # 使用 SVM ## 一、基本符号定义 - **n**:特征维度(输入特征的个数) - **m**:训练样本数量 ## 二、选择合适的核函数 ### 线性核 K(x, z) = xᵀz | 适用场景 | 说明 | |---------|------| | n 很大(如 n ≥ m) | 数据可能线性可分,无需复杂核 | | m 很小 | 避免高维映射带来的过拟合 | | 文本分类等高维稀疏数据 | 线性核往往表现优异 | ### 高斯核(RBF) K(x, z) = exp(-‖x - z‖² / 2σ²) | 适用场景 | 说明 | |---------|------| | n 较小,m 适中 | 非线性关系需要捕捉 | | 对数据分布没有先验知识 | 高斯核是默认首选 | | 需要灵活的非线性决策边界 | 通过调整 σ 控制复杂度 | ### 其他核函数 | 核函数 | 使用建议 | |--------|---------| | 多项式核 | 参数多(c, d),调参困难,不如高斯核常用 | | Sigmoid 核 | 在某些参数下不满足 Mercer 条件,慎用 | ## 三、多分类问题 SVM 原生只支持二分类,处理多分类有两种策略: | 策略 | 做法 | 复杂度 | |------|------|--------| | **一对多(One-vs-All)** | 训练 K 个 SVM,每个区分一类 vs 其余 | O(K) | | **一对一(One-vs-One)** | 训练 K(K-1)/2 个 SVM,每对类别之间区分 | O(K²) | 实践中,多数 SVM 库(如 libsvm)内置了多分类支持,自动处理。 ## 四、SVM 与其他算法的选择 | 场景 | 推荐算法 | 原因 | |------|---------|------| | **n 很大(相对 m)** | 逻辑回归 或 线性核 SVM | 线性模型足够,计算快 | | **n 很小,m 适中** | 高斯核 SVM | 能拟合复杂非线性边界 | | **n 很小,m 很大** | 逻辑回归 或 线性核 SVM | 高斯核计算太慢(O(m²)) | | **深度学习场景** | 神经网络 | 图像、音频等非结构化数据 | ## 五、使用 SVM 的实践步骤 1. **特征缩放**:使用高斯核前,对所有特征进行归一化/标准化 2. **选择核函数**:根据 n 和 m 的相对大小选择 3. **调参**:用交叉验证选择 C 和 σ²(或其他核参数) 4. **训练**:调用成熟的 SVM 库(libsvm、scikit-learn 等) 5. **评估**:用测试集评估最终模型 ## 六、SVM 的优缺点 | 优点 | 缺点 | |------|------| | 理论基础扎实,泛化能力强 | 大数据集训练慢(O(m²) ~ O(m³)) | | 通过核函数处理非线性问题 | 核函数和参数选择依赖经验 | | 解是全局最优(凸优化) | 不支持概率输出(需额外 Platt 缩放) | | 对高维数据有效 | 对缺失数据敏感 | ## 七、一句话总结 **"n 大用线性核,n 小 m 适中用高斯核,n 小 m 很大用逻辑回归——特征缩放不能忘,交叉验证选 C 和 σ。"** --- # 无监督学习 ## 一、什么是有监督学习(回顾) 有监督学习中,训练集包含**输入 x 和标签 y**: - 分类:y 是离散类别 - 回归:y 是连续值 目标:学习从 x 到 y 的映射。 ## 二、什么是无监督学习 无监督学习的训练集**只有输入 x,没有标签 y**: - 数据没有标注 - 不知道每个样本属于哪一类 - 需要算法自己从数据中发现结构 ## 三、无监督学习的典型应用 | 应用 | 说明 | 例子 | |------|------|------| | **聚类(Clustering)** | 将相似样本自动归为一组 | 新闻文章自动分类、客户分群 | | **降维(Dimensionality Reduction)** | 压缩数据维度,保留主要信息 | 数据可视化、特征压缩 | | **异常检测(Anomaly Detection)** | 找出与众不同的样本 | 欺诈检测、故障监控 | | **密度估计(Density Estimation)** | 估计数据的概率分布 | 概率建模、生成新样本 | ## 四、有监督 vs 无监督 | 对比项 | 有监督学习 | 无监督学习 | |--------|-----------|-----------| | **训练数据** | x + y(有标签) | x(无标签) | | **目标** | 预测 y | 发现数据内在结构 | | **评价** | 有明确指标(准确率、误差) | 较难量化评估 | | **典型算法** | 线性回归、逻辑回归、SVM、神经网络 | K-means、PCA、DBSCAN、GMM | ## 五、无监督学习的挑战 | 挑战 | 说明 | |------|------| | **没有正确答案** | 无法像有监督那样用标签验证结果好坏 | | **结果主观性强** | 不同聚类算法可能得出不同结果,难以判断谁对 | | **评估困难** | 需要领域知识或下游任务来间接验证 | ## 六、一句话总结 **"无监督学习就像让机器自己去发现数据的规律——只有 x 没有 y,全靠算法自己找结构。"** --- # K-Means 算法 ## 一、算法概述 K-Means 是最常用的聚类算法之一,目标是将无标签数据自动划分为 K 个簇。 ## 二、算法步骤 ### 输入 - 训练集 {x¹, x², ..., xᵐ} - 聚类数量 K(需要预先指定) ### 步骤 1. **初始化**:随机选择 K 个样本作为初始簇中心 μ₁, μ₂, ..., μₖ 2. **重复以下两步直到收敛**: **第一步:簇分配(Cluster Assignment)** 对每个样本 xⁱ,计算其到各簇中心的距离,分配到最近的簇: cⁱ = argminₖ ‖xⁱ - μₖ‖² **第二步:移动簇中心(Move Centroid)** 对每个簇 k,重新计算簇中心为该簇所有样本的均值: μₖ = (1 / |Cₖ|) Σᵢ∈Cₖ xⁱ ## 三、优化目标(失真函数) K-Means 实际上在最小化以下代价函数: J(c¹, ..., cᵐ, μ₁, ..., μₖ) = (1/m) Σᵢ₌₁ᵐ ‖xⁱ - μ_{cⁱ}‖² 其中: - cⁱ:样本 xⁱ 被分配的簇编号 - μ_{cⁱ}:样本 xⁱ 所属簇的中心 - ‖xⁱ - μ_{cⁱ}‖²:样本到其簇中心的距离平方 ## 四、K 的选择 | 方法 | 做法 | 说明 | |------|------|------| | **肘部法(Elbow Method)** | 绘制 K 与 J 的关系曲线,找拐点 | 直观但有时拐点不明显 | | **业务需求** | 根据实际应用场景确定 K | 如市场细分已知要分几类 | | **下游任务评估** | 用聚类结果做后续任务,选效果最好的 K | 如聚类后做推荐,评估推荐效果 | ## 五、初始化问题 ### 随机初始化的风险 K-Means 对初始簇中心敏感,可能收敛到局部最优。 ### 多次初始化策略 1. 随机初始化 50-100 次 2. 每次运行 K-Means 得到一组聚类结果 3. 选择代价 J 最小的那次结果 ## 六、K-Means 的优缺点 | 优点 | 缺点 | |------|------| | 算法简单,计算快 | 需要预先指定 K | | 易于理解和实现 | 对初始值敏感 | | 适合大数据集 | 只能发现球形簇 | | 可解释性好 | 对异常值敏感 | ## 八、一句话总结 **"K-Means 两步走:分配样本到最近簇中心,再更新簇中心为簇内均值——重复直到收敛,多次初始化防局部最优。"** --- # K-Means优化目标 ## 一、K-Means 的代价函数(失真函数) K-Means 实际上是在最小化一个明确的代价函数: J(c¹, c², ..., cᵐ, μ₁, μ₂, ..., μₖ) = (1/m) Σᵢ₌₁ᵐ ‖xⁱ - μ_{cⁱ}‖² 其中: - cⁱ ∈ {1, 2, ..., K}:样本 xⁱ 被分配的簇编号 - μₖ ∈ ℝⁿ:第 k 个簇的中心点 - μ_{cⁱ}:样本 xⁱ 所属簇的中心 - ‖xⁱ - μ_{cⁱ}‖²:样本到其簇中心的欧氏距离平方 ## 二、代价函数的作用 | 作用 | 说明 | |------|------| | **验证收敛** | 每次迭代后 J 应该下降,若不降则可能出 bug | | **比较不同初始化** | 多次初始化后选 J 最小的那次 | | **选择 K** | 肘部法中绘制 J 随 K 的变化曲线 | ## 三、算法两步与代价函数的关系 K-Means 的两步交替执行,每一步都在降低 J: ### 第一步:簇分配(固定 μ,优化 c) 对每个样本 xⁱ,选择离它最近的簇中心: cⁱ = argminₖ ‖xⁱ - μₖ‖² 这一步**保证 J 不会增加**(每个样本都被分配到最近的簇中心)。 ### 第二步:移动簇中心(固定 c,优化 μ) 对每个簇 k,重新计算中心: μₖ = (1 / |Cₖ|) Σᵢ∈Cₖ xⁱ 这一步同样**保证 J 不会增加**(均值点使簇内距离平方和最小)。 ## 四、J 随迭代的变化 - J 单调递减(或不变) - 收敛时 J 不再显著变化 - 如果 J 在某次迭代后上升,说明算法实现有 bug ## 五、如何利用 J 调试算法 | 现象 | 可能原因 | 解决 | |------|---------|------| | J 不下降 | 实现有 bug | 检查簇分配和中心更新逻辑 | | J 下降太慢 | 初始化不好 | 重新初始化或增加迭代次数 | | J 震荡 | 存在空簇或数值问题 | 检查空簇处理逻辑 | ## 六、一句话总结 **"K-Means 的每一步都在降低同一个代价函数 J——簇分配降 J,移动中心也降 J,单调递减直到收敛。"** --- # K-Means 随机初始化 ## 一、为什么需要随机初始化? K-Means 对初始簇中心的位置**非常敏感**,不同的初始位置可能导致完全不同的聚类结果。随机初始化的目的是让算法有机会找到全局最优解。 ## 二、随机初始化的标准方法 ### 步骤 1. 从训练集中**随机选择 K 个不同的样本**作为初始簇中心 μ₁, μ₂, ..., μₖ 2. 运行 K-Means 得到聚类结果 3. 记录最终的代价 J ### 注意 - 必须选 K 个**不同**的样本 - 如果 K 较大(如 K > 100),随机采样时确保不重复 ## 三、多次初始化的必要性 ### 单次初始化的风险 随机初始化可能落入**局部最优**: ### 多次初始化的流程 1. 循环 50-100 次: - 随机初始化簇中心 - 运行 K-Means 至收敛 - 记录最终代价 J 2. 选择**代价 J 最小**的那次聚类结果 ## 四、不同 K 值下的初始化策略 | K 值 | 初始化次数 | 原因 | |------|-----------|------| | **K 较小**(如 2-10) | 50-100 次 | 局部最优问题突出,需多次尝试 | | **K 较大**(如 > 100) | 1-10 次 | 局部最优风险降低,计算成本高 | ## 五、判断是否陷入局部最优 | 信号 | 说明 | |------|------| | 不同初始化得到明显不同的聚类结果 | 很可能存在多个局部最优 | | 多次初始化后 J 相差很大 | 需要更多次初始化尝试 | | 聚类结果不符合直觉 | 可能是局部最优,需重新初始化 | ## 六、一句话总结 **"随机初始化选 K 个不同样本做起点,跑 50-100 次选 J 最小的——用次数换质量,避开局部最优陷阱。"** --- # K-Means 选取聚类数量 ## 一、K 值选择的难点 K-Means 需要预先指定聚类数量 K,但在无监督学习中,**没有绝对的"正确答案"**。同一个数据集,不同的 K 值可能都有合理的解释。 ## 二、肘部法(Elbow Method) ### 做法 1. 对不同的 K 值(如 K = 1, 2, 3, ..., 10)分别运行 K-Means 2. 记录每个 K 对应的代价 J 3. 绘制 K-J 曲线 ### 理想情况(有明显拐点) ``` J ↑ │ │* │ * │ * │ * │ * │ *____ │ | \_____ │ | \_____ └─────────────────────→ K ↑ 肘部(elbow) ``` 在拐点处选择 K,因为超过这个点后增加 K 带来的收益急剧下降。 ### 实际情况(无明显拐点) ``` J ↑ │* │ * │ * │ * │ * │ * │ * │ * └─────────────────────→ K ``` 曲线平滑下降,没有明显的肘部。此时肘部法失效,需要用其他方法。 ## 三、基于业务需求选择 K | 场景 | 如何确定 K | 例子 | |------|-----------|------| | **市场细分** | 根据营销预算和运营能力 | 分 3 类还是 5 类客户更容易制定策略 | | **图像压缩** | 根据需要的色彩数 | 256 色还是 16 色 | | **推荐系统** | 根据产品品类数 | 服装分 10 类还是 20 类 | | **异常检测** | 根据业务对粒度的要求 | 正常/异常 2 类,或细分为多种异常类型 | ## 四、基于下游任务评估选择 K ### 做法 1. 对不同 K 值运行 K-Means 2. 将聚类结果用于下游任务(如推荐、分类) 3. 评估下游任务的表现 4. 选择使下游任务表现最好的 K ### 优点 - 直接服务于最终目标 - 避免了无监督评估的主观性 ## 五、K 值选择的总结 | 方法 | 适用场景 | 优点 | 缺点 | |------|---------|------|------| | **肘部法** | 有明显拐点时 | 直观、简单 | 很多时候拐点不明显 | | **业务需求** | 有明确的业务约束 | 结果可落地 | 可能不是最优统计解 | | **下游任务** | 聚类结果用于后续任务 | 直接优化最终目标 | 需要额外的评估流程 | ## 六、一句话总结 **"K 没有标准答案——肘部法找拐点、业务需求定粒度、下游任务验效果,三种方法选最适合的。"** --- # 目标 I:数据压缩 ## 一、什么是降维(Dimensionality Reduction) 降维是将高维数据映射到低维空间,同时尽可能保留原始数据的重要信息。 ## 二、为什么需要数据压缩? ### 1. 节省存储空间和计算资源 - 高维数据占用大量内存和硬盘 - 降维后数据量大幅减少,后续算法运行更快 ### 2. 加速后续算法 - KNN、K-Means 等算法在高维空间计算距离耗时巨大 - 降维后距离计算更快 ### 3. 可视化 - 人类只能理解 2D 或 3D 的可视化 - 将高维数据降到 2D 或 3D,可以直观观察数据分布 ## 三、降维的直观理解 ### 从 2D 到 1D ``` 原始 2D 数据(x₁, x₂) 投影到 1D 直线 x₂ ↑ 沿直线展开 │ ○ ○ ○──○──○──○──○ │ ○ ○ ○ ○ ○──○──○──○──○ │ ○ ○ ○ ○ ○ │ ○ ○ ○ ○ │ ○ ○ └──────────→ x₁ ``` - 原始数据用两个坐标 (x₁, x₂) 表示 - 降维后用一个坐标 z 表示(沿直线的位置) - 信息损失 = 点到直线的垂直距离 ### 从 3D 到 2D ``` 原始 3D 数据(x₁, x₂, x₃) 投影到 2D 平面 ↗ ↑ / ○ ○ │ ○ ○ / ○ ○ ○ │○ ○ ○ / ○ ○ ○ ○ │ ○ ○ ○ └──────→ └──────→ ``` - 原始数据用三个坐标表示 - 降维后用两个坐标表示(在平面上的位置) ## 四、降维与特征选择的区别 | 对比项 | 特征选择 | 降维 | |--------|---------|------| | **做法** | 直接丢弃某些特征 | 将原有特征组合成新特征 | | **结果** | 保留原有特征子集 | 生成全新的特征 | | **可解释性** | 好(保留了原始特征名) | 差(新特征是原始特征的组合) | | **信息保留** | 丢失被删除特征的全部信息 | 尽可能保留原始信息的整体结构 | ## 五、数据压缩的实际应用 | 应用 | 说明 | |------|------| | **图像压缩** | 将高分辨率图像降到低维表示,减少存储空间 | | **语音数据压缩** | 提取语音信号的主要成分,去除冗余 | | **基因数据压缩** | 上万维的基因表达数据降到几百维 | | **传感器数据压缩** | 多个传感器的冗余数据合并为少量关键指标 | ## 六、一句话总结 **"降维把高维数据投影到低维空间,保留主要信息的同时节省存储、加速计算——但新特征失去了原有的物理含义。"** --- # 目标 II:可视化 ## 一、为什么需要可视化? - 人类最多只能感知三维空间 - 高维数据(如几十、上千维)无法直接观察 - 降维到 2D 或 3D 后,可以通过肉眼发现数据中的模式和规律 ## 二、可视化能帮我们发现什么? | 发现 | 说明 | 例子 | |------|------|------| | **聚类结构** | 数据是否自然形成若干簇 | 客户分群是否清晰 | | **异常点** | 是否有远离主群的孤立样本 | 欺诈交易、测量错误 | | **数据分布** | 数据是否均匀分布或有偏斜 | 类别不平衡情况 | | **特征关系** | 哪些特征相关性高 | 冗余特征识别 | ## 三、降维可视化的流程 ### 步骤 1. 收集高维数据集(如 m 个样本,n 维特征) 2. 用 PCA 等降维算法将数据降到 2D 或 3D 3. 在二维/三维坐标系中绘制每个样本 4. 观察图形,发现模式和规律 ### 示例:国家经济发展数据 ``` 原始数据:各国每年 GDP、人均收入、教育投入、医疗支出、...(几十维) 降维到 2D 后: z₂ ↑ │ 发展中国家 │ ○ ○ │ ○ ○ ○ │ ○ │ 发达国家 │ ○ ○ │ ○ ○ ○ │ 新兴市场 │ ○ ○ │ ○ ○ └──────────────────────→ z₁ ``` 肉眼可见三个簇,对应不同发展阶段的国家。 ## 四、可视化的实际应用 | 应用场景 | 原始维度 | 降维目标 | 可以发现什么 | |---------|---------|---------|------------| | **基因表达数据分析** | 数千维 | 2D | 不同癌症亚型的聚类 | | **文本主题分析** | 词汇维度 | 2D | 文档的主题分布 | | **用户画像分析** | 上百个用户特征 | 2D | 用户群体的自然划分 | | **图像数据集探索** | 像素维度 | 2D | 图像类别的分布和重叠 | ## 五、可视化的局限性 | 局限 | 说明 | |------|------| | **信息损失** | 降到 2D 必然丢失部分信息,可能掩盖重要结构 | | **投影误导** | 降维后的距离不完全反映原始空间的距离 | | **参数敏感** | 不同降维算法或参数可能呈现完全不同的视图 | ## 六、一句话总结 **"降维到 2D 或 3D 让高维数据现原形——聚类、异常、分布一目了然,但要警惕信息损失带来的视觉误导。"** --- # 主成分分析问题规划 1 ## 一、PCA 的核心目标 主成分分析(Principal Component Analysis,PCA)的目标是找到一个**低维子空间**,将数据投影到这个子空间上,使得**投影后的方差最大**(或者说投影误差最小)。 ## 二、PCA 的直观理解 ### 从 2D 到 1D 原始数据用两个坐标 (x₁, x₂) 表示,PCA 找到一个主方向(方差最大的方向),将所有样本投影到这条直线上,每个样本用其在主方向上的投影位置 z 表示。 ### 从 3D 到 2D 原始数据用三个坐标表示,PCA 找到两个主方向构成一个平面,将所有样本投影到这个平面上,每个样本用两个新坐标表示。 ## 三、PCA 与线性回归的区别 这是一个容易混淆的点,需要特别注意: | 对比项 | PCA | 线性回归 | |--------|-----|---------| | **目标** | 最小化投影距离(垂直距离) | 最小化预测误差(竖直距离) | | **方向** | 所有特征同等对待 | 区分自变量和因变量 | | **误差方向** | 垂直于主成分方向 | 垂直于 x 轴(竖直方向) | ## 四、PCA 的数学表述 ### 问题定义 给定 m 个 n 维样本 {x¹, x², ..., xᵐ},要将它们降到 k 维(k < n)。 ### 目标 找到一个 k 维子空间,使得数据投影到该子空间后的**投影误差平方和最小**(等价于**投影后的方差最大**)。 ### 从 n 维降到 k 维 - 找到 k 个方向(主成分),它们是相互正交的单位向量 - 第一个主成分:数据方差最大的方向 - 第二个主成分:与第一个正交且剩余方差最大的方向 - 以此类推 ## 五、数据预处理的必要性 在使用 PCA 之前,必须对数据进行预处理: ### 步骤 1. **均值归一化(Mean Normalization)** - 对每个特征 j,计算均值 μⱼ - 替换 xⱼ = xⱼ - μⱼ - 使每个特征的均值为 0 2. **特征缩放(Feature Scaling)** - 对每个特征 j,计算标准差 σⱼ - 替换 xⱼ = xⱼ / σⱼ - 使所有特征在同一尺度上 ### 为什么要做特征缩放? - PCA 对特征的尺度敏感 - 如果某个特征的值域远大于其他特征,它会主导主成分方向 - 例如:房屋面积(50-500 m²)和房龄(1-50 年),面积会主导 PCA 结果 ## 六、一句话总结 **"PCA 找方差最大的方向做投影,投影误差最小——注意和线性回归区分,而且一定要先做特征缩放。"** --- # 主成分分析问题规划 2 ## 一、PCA 的数学推导流程 ### 输入 - m 个 n 维样本 {x¹, x², ..., xᵐ} - 目标降维维度 k(k < n) ### 步骤 #### 1. 数据预处理 对每个特征 j: - 计算均值 μⱼ = (1/m) Σᵢ₌₁ᵐ xⱼⁱ - 均值归一化:xⱼⁱ = xⱼⁱ - μⱼ - 若特征尺度不同,还需除以标准差 sⱼ:xⱼⁱ = xⱼⁱ / sⱼ #### 2. 计算协方差矩阵 Σ = (1/m) Σᵢ₌₁ᵐ (xⁱ)(xⁱ)ᵀ 其中 Σ 是一个 n×n 的对称矩阵。 #### 3. 计算协方差矩阵的特征向量 对 Σ 进行特征值分解(或对 X 做 SVD 分解),得到: - 特征向量 u¹, u², ..., uⁿ(每个都是 n 维单位向量) - 对应的特征值 λ₁ ≥ λ₂ ≥ ... ≥ λₙ 特征向量就是主成分方向,按特征值从大到小排列。 #### 4. 选择前 k 个特征向量 取 u¹, u², ..., uᵏ 构成投影矩阵 U_reduce(n×k 矩阵)。 #### 5. 投影到 k 维空间 对每个样本 xⁱ,计算降维后的表示: zⁱ = (U_reduce)ᵀ · xⁱ 其中 zⁱ 是一个 k 维向量。 ## 二、降维前后的维度变化 | 阶段 | 维度 | 说明 | |------|------|------| | 原始数据 xⁱ | n 维 | 列向量,形状 n×1 | | 投影矩阵 U_reduce | n×k 矩阵 | 前 k 个特征向量按列排列 | | 降维后数据 zⁱ | k 维 | 列向量,形状 k×1 | ### 投影运算详解 zⁱ = (U_reduce)ᵀ · xⁱ 维度变化:(k×n) · (n×1) = (k×1) 展开形式: zⁱ = [u¹·xⁱ, u²·xⁱ, ..., uᵏ·xⁱ]ᵀ 即 zⁱ 的第 j 个分量是 xⁱ 在第 j 个主成分方向上的投影长度。 ## 三、PCA 的应用流程总结 ``` 原始数据(n 维) ↓ 数据预处理(均值归一化 ± 特征缩放) ↓ 计算协方差矩阵 Σ ↓ 特征值分解 / SVD ↓ 选择前 k 个特征向量 ↓ 投影到 k 维空间 ↓ 降维后数据(k 维) ``` ## 四、注意事项 | 要点 | 说明 | |------|------| | **特征缩放必须做** | 否则大尺度特征会主导主成分方向 | | **均值归一化必须做** | 否则第一主成分会被均值方向带偏 | | **k 的选择** | 通过保留方差比例确定(下一节详述) | | **PCA 只在训练集上计算** | 然后用同样的 U_reduce 投影验证集和测试集 | ## 五、一句话总结 **"PCA 四步走:预处理 → 协方差矩阵 → SVD 找特征向量 → 取前 k 个投影——降维后的 z 就是 x 在主成分方向上的投影长度。"** --- # 主成分数量选择 ## 一、核心目标 在 PCA 降维时,选择合适的降维维度 k(主成分个数):**用最少的维度,保留原始数据绝大部分的核心信息**。 ## 二、评估指标:投影误差与方差保留率 ### 1. 核心公式(误差占比) 衡量降维损失的比例: > [ (1/m) · Σᵢ₌₁ᵐ ‖x⁽ⁱ⁾ - x⁽ⁱ⁾_approx‖² ] / [ (1/m) · Σᵢ₌₁ᵐ ‖x⁽ⁱ⁾‖² ] ≤ 0.01 (即 1%) - **分子**:平均平方投影误差(x⁽ⁱ⁾ 为原始数据,x⁽ⁱ⁾_approx 为降维后重新还原的近似数据,代表降维损失的信息)。 - **分母**:数据的总方差(代表原始数据整体的波动大小,前提已做均值归一化)。 - **物理含义**:投影误差占总方差的比例 ≤ 1%,即**保留了 99% 的方差(信息)**。 ### 2. 常见阈值标准 | 误差阈值 | 保留方差比例 | 适用场景 | |---------|-------------|---------| | ≤ 0.01 | 99% | 精度要求极高(常见默认标准) | | ≤ 0.05 | 95% | 常规机器学习特征压缩 | | ≤ 0.1 | 90% | 可视化或极度压缩维度 | ## 三、选择最小 k 值的流程 1. 从 k=1 开始尝试。 2. 执行 PCA 降维投影得到 z⁽ⁱ⁾,再还原得到 x⁽ⁱ⁾_approx。 3. 计算上述误差比例。 4. 若满足阈值(如 ≤ 1%),则当前 k 合格;否则 k 加 1 继续尝试。 5. 取满足条件的**最小 k 值**作为最终降维维度。 ## 四、高效计算方法(基于 SVD 奇异值) 实际工程中不直接反复计算投影误差,而是利用 SVD 分解得到的对角矩阵 S(奇异值)直接判定: > 1 - [ Σᵢ₌₁ᵏ Sᵢᵢ / Σᵢ₌₁ⁿ Sᵢᵢ ] ≤ 0.01 ⇔ [ Σᵢ₌₁ᵏ Sᵢᵢ / Σᵢ₌₁ⁿ Sᵢᵢ ] ≥ 0.99 - **分子**:前 k 个主成分对应的奇异值平方和(保留的方差)。 - **分母**:所有 n 个奇异值平方和(总方差)。 - **优势**:一次 SVD 分解即可算出任意 k 的保留比例,无需反复投影还原。 ## 五、与 14-4 的关联总结 - **14-4 规划**:选定 k 后,取前 k 个特征向量投影得到降维数据 z。 - **14-5 选参**:本节的公式就是检验“前 k 个向量够不够用”的标尺。误差超阈值则 k 不够,需增加;满足阈值则 k 刚好。 ## 六、注意事项 | 要点 | 说明 | |------|------| | **仅在训练集选 k** | 用训练集算出的 U_reduce 和阈值标准,直接套用到验证集/测试集 | | **先预处理再评估** | 必须已完成均值归一化与特征缩放,否则总方差分母失去统计意义 | | **避免人为硬设 k** | 优先按方差保留率动态决定 k,而非直接拍脑袋定维度 | ## 七、一句话总结 **"选 k 看误差占比:投影误差/总方差 ≤ 1%(保留 99% 信息),用 SVD 奇异值求和快速判定,取满足条件的最小 k。"** --- # PCA 压缩重现 ## 一、核心目标 - **压缩(降维)**:将高维数据 x⁽ⁱ⁾ ∈ ℝⁿ 映射为低维特征 z⁽ⁱ⁾ ∈ ℝᵏ(丢弃冗余与噪声,减少计算量)。 - **重现(还原)**:用低维特征 z⁽ⁱ⁾ 近似还原出原始空间的数据 x̂⁽ⁱ⁾ ∈ ℝⁿ,用于评估投影误差或特定场景的重构。 ## 二、核心矩阵与符号约定 基于前节 SVD / PCA 结果(对中心化数据 X 分解): - **n**:原始特征维度 - **k**:降维后的目标维度(k < n) - **U_reduce**:n×k 矩阵,取 V 的前 k 列(即前 k 个主成分方向/特征向量) - **x⁽ⁱ⁾**:原始样本(已减均值 μ),x̂⁽ⁱ⁾:还原后的近似样本 ## 三、压缩:高维 → 低维 ### 公式(投影) z⁽ⁱ⁾ = (U_reduce)ᵀ · x⁽ⁱ⁾ 维度变化:z⁽ⁱ⁾ = (k×n) · (n×1) = (k×1) ### 物理含义 把数据投影到保留大部分方差的前 k 个主方向上,丢掉方差极小的噪声维度。 ## 四、重现:低维 → 高维近似 ### 公式(还原) x̂⁽ⁱ⁾ = U_reduce · z⁽ⁱ⁾ 维度变化:x̂⁽ⁱ⁾ = (n×k) · (k×1) = (n×1) ### 加回均值(还原到原始坐标系) x⁽ⁱ⁾_approx = x̂⁽ⁱ⁾ + μ 其中 μ 为训练集均值向量。 ### 物理含义 在低维空间沿主方向"拉伸"回原空间,丢失的维度补 0(即投影误差的来源)。 ## 五、误差评估(衔接 14-5) ### 投影误差 ‖x⁽ⁱ⁾ - x⁽ⁱ⁾_approx‖² ### 总方差 ‖x⁽ⁱ⁾‖²(中心化后) ### 误差占比 [ (1/m) · Σᵢ₌₁ᵐ ‖x⁽ⁱ⁾ - x⁽ⁱ⁾_approx‖² ] / [ (1/m) · Σᵢ₌₁ᵐ ‖x⁽ⁱ⁾‖² ] = 1 - [ Σᵢ₌₁ᵏ Sᵢᵢ² / Σᵢ₌₁ⁿ Sᵢᵢ² ] ≤ 0.01 即保留 99% 方差。 ## 六、完整计算流程总结 | 步骤 | 操作 | 说明 | |------|------|------| | **1. 预处理** | 训练集减均值 μ,特征缩放(若量纲不一) | 确保各特征公平竞争 | | **2. 求基** | SVD 得 V,按 14-5 准则取前 k 列得 U_reduce | 主成分方向 | | **3. 压缩** | z⁽ⁱ⁾ = (U_reduce)ᵀ · (x⁽ⁱ⁾ - μ) | 训练/预测通用 | | **4. 重现** | x⁽ⁱ⁾_approx = U_reduce · z⁽ⁱ⁾ + μ | 仅评估/可视化用 | ## 七、压缩 vs 重现 对比表 | 环节 | 方向 | 公式 | 维度变化 | 信息损失 | |------|------|------|---------|---------| | **压缩** | 原空间 → 主成分空间 | z = (U_reduce)ᵀ · (x - μ) | n → k | 丢弃小方差方向 | | **重现** | 主成分空间 → 原空间 | x_approx = U_reduce · z + μ | k → n | 无法恢复已丢弃信息 | ## 八、注意事项 | 要点 | 说明 | |------|------| | **仅训练集定参** | μ 和 U_reduce 只在训练集计算,验证/测试集直接套用(防数据泄露) | | **还原非真原数据** | x̂ 是投影近似,缺失了被降维丢弃的噪声/细节,不能用于重新训练 | | **应用场景** | 压缩用于加速模型/去噪;重现用于可视化(降 2/3 维画图)或误差监控 | ## 九、一句话总结 **"压缩即乘 (U_reduce)ᵀ 投影到 k 维,重现即乘 U_reduce 加均值还原——丢失的维度不可恢复,误差由奇异值平方和比例提前锁定。"** --- # 应用 PCA 的建议 ## 一、PCA 的正确使用场景 ### 1. 加速监督学习 当特征维度 n 很大时,先用 PCA 降维,再用降维后的数据训练模型: ``` 原始数据(n 维,m 个样本) ↓ PCA 降维 降维后数据(k 维,m 个样本) ↓ 训练监督学习模型 最终模型 ``` **好处**: - 减少训练时间 - 降低内存占用 - 可能减轻过拟合(丢弃噪声维度) ### 2. 数据可视化 将高维数据降到 2D 或 3D,用散点图观察数据分布、聚类结构或异常点。 ### 3. 数据压缩 减少存储空间,加快后续处理速度。 ## 二、PCA 的错误使用场景 ### 1. 用 PCA 防止过拟合 ❌ **错误做法**:认为 PCA 丢弃了一些维度就能自动防止过拟合。 ✅ **正确做法**:先用原始数据训练模型,加正则化(L1/L2),只有在计算资源不足时才考虑 PCA。 **原因**: - PCA 丢弃维度时不考虑标签 y,可能丢掉对预测有用的信息 - 正则化是专门为防止过拟合设计的,效果更可控 ### 2. 盲目默认使用 PCA ❌ **错误做法**:不管什么数据集,上来就先做 PCA。 ✅ **正确做法**:先用原始数据训练模型,如果效果不好或计算太慢,再考虑 PCA。 **原因**: - PCA 会损失信息,可能降低模型性能 - 如果原始特征已经很好,降维反而有害 ## 三、PCA 的使用建议流程 ``` 收集数据 ↓ 先用原始数据训练模型(不加 PCA) ↓ 评估效果 ├── 效果好,速度快 → 不需要 PCA ├── 效果好,速度慢 → 考虑用 PCA 加速 └── 效果差 ├── 欠拟合 → 增加特征或用更复杂的模型 └── 过拟合 → 加正则化或收集更多数据 ``` ## 四、PCA 在不同场景下的建议 | 场景 | 建议 | 原因 | |------|------|------| | **特征维度 n 很大(如 > 1000)** | 考虑用 PCA 降维 | 计算开销大,可能存在冗余特征 | | **样本量 m 很小** | 谨慎使用 PCA | 降维后可能丢失关键信息 | | **特征间高度相关** | PCA 效果好 | 冗余信息多,降维损失小 | | **特征间独立性强** | PCA 效果有限 | 每个特征携带独特信息,降维损失大 | | **需要模型可解释性** | 不使用 PCA | 降维后的特征失去物理含义 | ## 五、PCA 的实施要点 ### 1. 只在训练集上拟合 PCA - 计算均值 μ 和投影矩阵 U_reduce 时**只用训练集** - 然后将同样的变换应用到验证集和测试集 ### 2. 特征缩放必须先做 - PCA 对特征尺度敏感 - 必须做均值归一化,必要时做特征缩放 ### 3. k 的选择 - 用 14-5 的方法(保留方差比例)选择 k - 不要凭感觉设定 k ## 六、PCA 的局限性 | 局限 | 说明 | |------|------| | **线性变换** | PCA 只能捕捉线性关系,无法处理非线性结构 | | **可解释性差** | 降维后的特征 z 是原始特征的线性组合,没有物理含义 | | **信息损失** | 即使保留 99% 方差,仍可能丢掉关键的判别信息 | | **对异常值敏感** | 异常值会扭曲主成分方向 | ## 七、一句话总结 **"先用原始数据试,不行再加 PCA——加速训练、可视化、压缩存储是好用途,但别拿它当正则化用,也别盲目默认降维一定提升效果。"** --- # 异常检测问题动机 ## 一、什么是异常检测(Anomaly Detection) 异常检测是**无监督学习**的一种,用于识别数据中**与大多数样本显著不同的异常样本**。 ### 核心思路 - 对正常数据建立一个概率模型 p(x) - 设置一个阈值 ε - 如果 p(x) < ε,则标记为异常 ## 二、异常检测的典型应用 | 应用场景 | 说明 | 例子 | |---------|------|------| | **欺诈检测** | 识别异常的金融交易行为 | 信用卡被盗刷、账户异常登录 | | **工业质检** | 检测生产线上的缺陷产品 | 零件尺寸异常、表面划痕 | | **服务器监控** | 发现服务器运行异常 | CPU 飙升、内存泄漏、流量突增 | | **设备维护** | 预测设备故障 | 振动异常、温度过高 | ## 三、异常检测的直观理解 ### 二维特征示例 假设有两个特征:x₁ = 交易金额,x₂ = 交易频率 大多数正常交易集中在某个区域,少数远离该区域的点可能是异常。 ## 四、异常检测 vs 监督学习 | 对比项 | 异常检测 | 监督学习 | |--------|---------|---------| | **标签情况** | 无标签,或只有少量正常样本标签 | 有大量正负样本标签 | | **数据分布** | 正常样本极多,异常样本极少 | 正负样本数量相对均衡 | | **异常类型** | 未来可能出现从未见过的异常类型 | 训练集中已包含各类样本 | | **典型应用** | 欺诈检测、故障检测 | 垃圾邮件分类、疾病诊断 | ### 何时用异常检测? - 异常样本极少(如 0.1% 甚至更低) - 异常的类型未知,未来可能出现新型异常 - 只需要识别"是否异常",不需要知道具体是哪类异常 ### 何时用监督学习? - 正负样本数量都比较充足 - 未来的异常类型与训练集中的类似 - 需要区分具体的异常类别 ## 五、异常检测的挑战 | 挑战 | 说明 | |------|------| | **阈值选择** | ε 设得太高会漏报,设得太低会误报 | | **特征选择** | 需要选择能有效区分正常和异常的特征 | | **数据质量** | 训练数据中混入异常样本会影响模型 | | **概念漂移** | 正常的定义随时间变化(如节假日交易模式不同) | ## 六、一句话总结 **"异常检测给正常数据建概率模型,p(x) < ε 就是异常——适合异常极少、类型未知的场景,和无监督学习一脉相承。"** --- # 高斯分布 ## 一、高斯分布的定义 高斯分布(正态分布)是异常检测中最基础的概率模型,用于描述单个特征在正常情况下的取值分布。 ## 二、单变量高斯分布 ### 概率密度函数 对于一个特征 x,假设它服从均值为 μ、方差为 σ² 的高斯分布: p(x) = (1 / √(2πσ²)) · e^(-(x - μ)² / (2σ²)) ### 参数含义 | 参数 | 含义 | 说明 | |------|------|------| | μ | 均值 | 数据的中心位置 | | σ² | 方差 | 数据的离散程度 | | σ | 标准差 | 方差的平方根,与原始数据同量纲 | ### 参数估计(从数据中学习) 给定 m 个样本 {x¹, x², ..., xᵐ}: μ = (1/m) · Σᵢ₌₁ᵐ xⁱ σ² = (1/m) · Σᵢ₌₁ᵐ (xⁱ - μ)² 注意:这里的分母用 m 而非 m-1(在机器学习中常用 m,在统计学中常用 m-1,差别不大)。 ## 三、高斯分布的形态 ### μ 的影响(位置参数) ``` p(x) ↑ │ μ 不同 │ ╱╲ ╱╲ │ ╱ ╲ ╱ ╲ │ ╱ ╲ ╱ ╲ │╱ ╲ ╱ ╲ └──────────────────→ x μ₁ μ₂ ``` μ 决定曲线的中心位置,μ 越大曲线越靠右。 ### σ 的影响(尺度参数) ``` p(x) ↑ │ σ 不同 │ ╱╲ │ ╱ ╲ ╱╲ │╱ ╲ ╱ ╲ │ ╲╱ ╲ └──────────────────→ x σ 小(瘦高) σ 大(矮胖) ``` σ 越小曲线越瘦高(数据集中),σ 越大曲线越矮胖(数据分散)。 ## 四、高斯分布的性质 | 性质 | 说明 | |------|------| | **对称性** | 关于均值 μ 左右对称 | | **68-95-99.7 法则** | 约 68% 数据在 μ±σ 内,95% 在 μ±2σ 内,99.7% 在 μ±3σ 内 | | **峰值在 μ 处** | p(μ) 是最大值,离 μ 越远概率越低 | | **尾部趋近于 0** | 远离均值时概率密度迅速下降 | ## 五、用高斯分布做异常检测 ### 对单个特征 xⱼ 1. 从训练数据估计 μⱼ 和 σⱼ² 2. 对新样本 xⱼ_new,计算 p(xⱼ_new) 3. 若 p(xⱼ_new) < ε,则该特征值异常 ### 示例 ``` 特征:服务器响应时间(毫秒) 正常范围:μ = 100, σ = 20 p(120) = 正常(在 μ±σ 内) p(200) = 很低(远离均值,可能异常) p(50) = 较低(也可能异常,取决于阈值) ``` ## 六、数据分布非高斯的处理 ### 问题 如果数据分布明显不是高斯分布(如偏态、双峰),直接用高斯分布建模效果不好。 ### 解决方法:数据变换 通过数学变换使数据更接近高斯分布: | 变换方法 | 公式 | 适用场景 | |---------|------|---------| | **对数变换** | log(x) | 右偏数据(长尾在右边) | | **平方根变换** | √x | 计数数据 | | **倒数变换** | 1/x | 比率数据 | | **Box-Cox 变换** | (x^λ - 1)/λ | 通用变换,需调 λ | ### 示例 ``` 原始数据(右偏) 对数变换后(接近高斯) ○ ○ ○○ ○○○ ○○○○ ○○○○○ ○○○○○○ ○○○○○○ └──→ x └──→ log(x) ``` ## 七、一句话总结 **"高斯分布用 μ 定中心、σ² 定宽度,p(x) 远离 μ 就是异常——数据不服从高斯就用对数变换把它掰正。"** --- # 异常检测算法 ## 一、异常检测算法的完整流程 ### 输入 - 训练集:m 个 n 维样本 {x¹, x², ..., xᵐ} - 每个样本 xⁱ ∈ ℝⁿ,有 n 个特征 ### 输出 - 对新样本 x_new,判断是否异常 ## 二、算法步骤 ### 第一步:选择特征 选择能够反映正常/异常差异的特征 x₁, x₂, ..., xₙ。 ### 第二步:拟合参数 对每个特征 j,估计其高斯分布的参数 μⱼ 和 σⱼ²: μⱼ = (1/m) · Σᵢ₌₁ᵐ xⱼⁱ σⱼ² = (1/m) · Σᵢ₌₁ᵐ (xⱼⁱ - μⱼ)² 其中 xⱼⁱ 表示第 i 个样本的第 j 个特征。 ### 第三步:计算新样本的概率 对新样本 x_new,计算它在所有特征上的联合概率: p(x_new) = Πⱼ₌₁ⁿ p(xⱼ_new ; μⱼ, σⱼ²) = Πⱼ₌₁ⁿ (1 / √(2πσⱼ²)) · e^(-(xⱼ_new - μⱼ)² / (2σⱼ²)) 即各个特征概率密度的乘积(假设特征之间相互独立)。 ### 第四步:判断异常 若 p(x_new) < ε,则标记为异常;否则为正常。 ## 三、概率计算示例 ### 假设 - 两个特征:x₁(CPU 负载),x₂(内存使用率) - 训练集估计得:μ₁=50, σ₁²=100, μ₂=60, σ₂²=64 ### 新样本 x_new = (80, 70) 计算每个特征的概率: p(x₁=80) = (1 / √(2π·100)) · e^(-(80-50)² / (2·100)) = (1 / √(628.3)) · e^(-900 / 200) = 0.0399 · e^(-4.5) = 0.0399 · 0.0111 = 0.00044 p(x₂=70) = (1 / √(2π·64)) · e^(-(70-60)² / (2·64)) = (1 / √(402.1)) · e^(-100 / 128) = 0.0499 · e^(-0.781) = 0.0499 · 0.458 = 0.0228 联合概率: p(x_new) = 0.00044 · 0.0228 = 0.00001 若 ε = 0.001,则 p(x_new) < ε → 标记为异常。 ## 四、密度估计与决策边界 ### 概率密度等高线 ε 等高线内部(p(x) ≥ ε)判定为正常,外部(p(x) < ε)判定为异常。 ## 五、算法特点 | 特点 | 说明 | |------|------| | **无监督** | 训练时不需要异常标签 | | **计算简单** | 只需估计均值和方差 | | **可扩展** | 适用于高维数据 | | **可解释** | 可以查看哪个特征导致概率低 | ## 六、一句话总结 **"异常检测三步走:对每个特征估 μ 和 σ²,连乘得联合概率 p(x),低于阈值 ε 就是异常。"** --- # 开发和评估异常检测系统 ## 一、用带标签数据评估无监督模型 异常检测本质上是无监督学习,但我们可以利用少量带标签的数据来评估和调优模型。 ### 数据划分 | 数据集 | 用途 | 标签要求 | |--------|------|---------| | **训练集** | 拟合高斯分布的 μ 和 σ² | 全部为正常样本(y=0) | | **验证集** | 选择阈值 ε 和调优特征 | 包含正常和异常样本(带标签) | | **测试集** | 评估最终模型性能 | 包含正常和异常样本(带标签) | ### 数据比例建议 - 训练集:全部为正常样本(通常数量较多) - 验证集:包含正常样本 + 少量异常样本(如 60% 正常、40% 异常) - 测试集:包含正常样本 + 少量异常样本(如 60% 正常、40% 异常) ## 二、评估指标 由于异常检测中正负样本极不平衡(正常样本远多于异常样本),不能用简单的准确率来评估。 ### 混淆矩阵 | 实际\预测 | 预测正常(y=0) | 预测异常(y=1) | |----------|---------------|---------------| | **实际正常(y=0)** | TN(真阴性) | FP(假阳性,误报) | | **实际异常(y=1)** | FN(假阴性,漏报) | TP(真阳性) | ### 常用评估指标 | 指标 | 公式 | 含义 | |------|------|------| | **精确率(Precision)** | TP / (TP + FP) | 预测为异常的样本中有多少是真的异常 | | **召回率(Recall)** | TP / (TP + FN) | 真正的异常中有多少被成功检出 | | **F₁ 分数** | 2·P·R / (P + R) | 精确率和召回率的调和平均 | ### 为什么不用准确率? 假设 99% 的样本是正常的,如果模型把所有样本都判为正常,准确率高达 99%,但这个模型毫无用处。F₁ 分数能更好地反映模型对少数类(异常)的检测能力。 ## 三、选择阈值 ε ### 方法 1. 在验证集上计算每个样本的 p(x) 2. 尝试一系列 ε 值(如从最小值到最大值之间均匀取 100 个值) 3. 对每个 ε,计算验证集上的 F₁ 分数 4. 选择使 F₁ 分数最大的 ε ### 伪代码思路 ``` 最佳 ε = None 最佳 F₁ = 0 for ε in 候选列表: 预测结果 = p(x) < ε 计算 F₁ 分数 if F₁ > 最佳 F₁: 更新最佳 F₁ 和最佳 ε ``` ## 四、特征选择与调优 ### 方法一:观察异常样本的概率 在验证集上,查看被漏检的异常样本(FN)的 p(x) 值。如果它们的 p(x) 仍然较高,说明现有特征不足以区分这些异常。 ### 方法二:通过误差分析选择新特征 分析被误判的样本,思考: - 这个样本为什么被误判? - 有什么新特征可以帮助区分它? ### 常见的新特征思路 | 问题 | 可能的解决方案 | |------|---------------| | CPU 负载高但网络流量低 | 构造特征:CPU / 网络流量 | | 某特征值异常大 | 取对数变换:log(x) | | 两个特征组合才有意义 | 构造特征:x₁ · x₂ 或 x₁ / x₂ | ## 五、完整的开发流程 ``` 收集正常数据作为训练集 ↓ 拟合高斯参数 μ 和 σ² ↓ 收集少量带标签数据(正常+异常) ↓ 划分验证集和测试集 ↓ 在验证集上选择 ε 和调优特征 ↓ 在测试集上评估最终模型 ↓ 若效果不理想,返回调整特征 ``` ## 六、注意事项 | 要点 | 说明 | |------|------| | **训练集只用正常样本** | 异常样本不参与拟合 μ 和 σ² | | **验证集和测试集包含异常** | 用于评估检测能力和选择阈值 | | **验证集和测试集要分开** | 避免在测试集上调参导致过拟合 | | **关注 F₁ 而非准确率** | 不平衡数据下 F₁ 更可靠 | ## 七、一句话总结 **"用正常数据训练,用带标签数据调 ε 和选特征——F₁ 分数评估,验证集选参,测试集终评。"** --- # 异常检测 VS 监督学习 ## 一、核心区别 | 对比项 | 异常检测 | 监督学习 | |--------|---------|---------| | **数据分布** | 正常样本极多,异常样本极少 | 正负样本数量相对均衡 | | **异常类型** | 未来可能出现从未见过的新型异常 | 训练集中已包含各类样本 | | **标签需求** | 训练集不需要标签(全用正常数据) | 需要大量带标签的正负样本 | | **学习目标** | 学习正常数据的分布 p(x) | 学习区分正负样本的决策边界 | ## 二、何时用异常检测? ### 适用场景 - 异常样本极少(如 0.1% 甚至更低) - 异常的类型未知,未来可能出现新型异常 - 正常数据的模式相对稳定 ### 典型应用 | 应用 | 原因 | |------|------| | **欺诈检测** | 欺诈手段不断演变,无法预知所有类型 | | **工业质检** | 缺陷种类繁多,难以收集所有类型的缺陷样本 | | **服务器监控** | 异常模式千变万化,无法穷举 | | **新物种检测** | 需要识别从未见过的物种 | ## 三、何时用监督学习? ### 适用场景 - 正负样本数量都比较充足 - 未来的异常类型与训练集中的类似 - 需要区分具体的异常类别 ### 典型应用 | 应用 | 原因 | |------|------| | **垃圾邮件分类** | 有大量已标注的垃圾邮件和正常邮件 | | **疾病诊断** | 有大量确诊患者的病历数据 | | **手写数字识别** | 各类数字的样本都很充足 | | **情感分析** | 有大量已标注正面/负面评论 | ## 四、决策指南 ``` 异常样本数量极少? 是 → 异常检测 否 ↓ 未来可能出现新型异常? 是 → 异常检测 否 ↓ 正负样本数量都充足? 是 → 监督学习 否 ↓ 能否轻松收集更多异常样本? 是 → 监督学习 否 → 异常检测 ``` ## 五、两种方法的对比总结 | 维度 | 异常检测 | 监督学习 | |------|---------|---------| | **训练数据** | 大量正常 + 少量异常(可选) | 大量正常 + 大量异常 | | **对新异常的识别** | ✅ 能识别新型异常 | ❌ 只能识别训练集中出现过的类型 | | **模型复杂度** | 简单(高斯分布) | 可复杂(神经网络、树模型等) | | **可解释性** | 好(可追溯哪个特征异常) | 一般(黑盒模型) | | **调参难度** | 低(主要是 ε 和特征选择) | 高(大量超参数) | ## 六、一句话总结 **"异常极少、类型未知用异常检测;正负充足、类型固定用监督学习——关键看你能不能预知未来会出现什么样的异常。"** --- # 异常检测选择要使用的特征 ## 一、特征选择的重要性 异常检测的效果高度依赖于特征的质量。如果选择的特征不能有效区分正常和异常,模型性能会很差。 ## 二、特征应该服从高斯分布 ### 问题 高斯分布假设数据呈钟形曲线分布。如果特征数据明显偏离高斯分布,p(x) 的计算会不准确,导致异常检测效果变差。 ### 如何检查 画出特征的直方图,观察是否大致呈钟形曲线。 ### 修正方法:数据变换 如果特征不服从高斯分布,通过数学变换使其接近高斯分布: | 变换方法 | 公式 | 适用场景 | |---------|------|---------| | **对数变换** | log(x) | 右偏数据(长尾在右边) | | **对数变换变体** | log(x + c) | 数据包含 0 或负值时加常数偏移 | | **平方根变换** | √x | 计数数据 | | **幂次变换** | x^α(如 α=0.5, 0.25) | 不同程度的偏态数据 | ### 示例 原始数据右偏严重,取对数后直方图呈现更对称的钟形曲线。 ## 三、通过误差分析选择新特征 ### 基本思路 在验证集上运行模型,找出被漏检的异常样本(假阴性)和被误报的正常样本(假阳性),分析这些样本的特点,构造能够区分它们的新特征。 ### 案例:服务器监控 #### 初始特征 - x₁ = CPU 负载 - x₂ = 网络流量 #### 发现问题 某些异常情况下,CPU 负载很高但网络流量很低(如死循环程序),这种组合模式无法被单独的两个特征捕捉。 #### 构造新特征 - x₃ = CPU 负载 / 网络流量 - x₄ = (CPU 负载)² / 网络流量 新特征能够在 CPU 负载异常高而网络流量正常时产生很大的值,更容易被检测为异常。 ### 另一个案例:计算机集群监控 #### 初始特征 - x₁ = 内存使用量 - x₂ = 磁盘 I/O #### 构造新特征 - x₃ = 内存使用量 / 磁盘 I/O - x₄ = (内存使用量)³ / 磁盘 I/O ## 四、特征选择的通用原则 | 原则 | 说明 | |------|------| | **正常数据特征值应集中** | 正常样本在该特征上的取值应比较集中(方差小) | | **异常数据特征值应偏离** | 异常样本在该特征上的取值应明显偏离正常范围 | | **组合特征有时更有效** | 单个特征无法捕捉的模式,用比值或乘积构造新特征 | | **先变换再建模** | 确保每个特征经过变换后接近高斯分布 | ## 五、特征选择的迭代过程 ``` 初始特征集 ↓ 训练异常检测模型 ↓ 在验证集上评估 ↓ 分析误判样本 ├── 漏检的异常(FN):这些样本为什么 p(x) 不够低? └── 误报的正常(FP):这些样本为什么 p(x) 太低? ↓ 构造新特征解决上述问题 ↓ 重新训练并评估 ↓ 重复直到满意 ``` ## 六、一句话总结 **"特征先变高斯再建模,误差分析找漏网之鱼——比值乘积造新特征,迭代直到异常无处遁形。"** --- # 多变量高斯分布 ## 一、单变量高斯分布的局限 ### 问题背景 标准异常检测算法假设特征之间相互独立,将各特征的概率密度相乘得到联合概率: p(x) = Πⱼ₌₁ⁿ p(xⱼ ; μⱼ, σⱼ²) 这个假设在实际中并不总是成立。 ### 典型案例 假设两个特征: - x₁ = CPU 负载 - x₂ = 内存使用率 正常情况下,CPU 负载和内存使用率存在正相关关系:CPU 高时内存通常也高。 ### 单变量模型的失败场景 ``` x₂ ↑ │ 正常样本分布(斜椭圆) │ ╭──────╮ │ ╱ ╲ │ ╱ ╲ │╱ ╲ │╲ ╱ │ ╲ ╱ │ ╲ ╱ │ ╰──────╯ │ × 异常点 A(CPU 高,内存低) │ × 异常点 B(CPU 低,内存高) └────────────────→ x₁ ``` 单变量模型用圆形等高线拟合数据,会把 A 点和 B 点都判为正常(因为它们各自都在单个特征的正常范围内),但实际上这两个点违反了 CPU 和内存之间的正相关关系,应该是异常。 ## 二、多变量高斯分布 ### 概率密度函数 p(x) = (1 / ( (2π)^(n/2) · |Σ|^(1/2) )) · e^( -(1/2) · (x - μ)ᵀ · Σ⁻¹ · (x - μ) ) ### 参数含义 | 参数 | 维度 | 含义 | |------|------|------| | μ | n×1 向量 | 每个特征的均值 | | Σ | n×n 矩阵 | 协方差矩阵,描述特征间的相关性 | ### 参数估计 μ = (1/m) · Σᵢ₌₁ᵐ xⁱ Σ = (1/m) · Σᵢ₌₁ᵐ (xⁱ - μ) · (xⁱ - μ)ᵀ ### 协方差矩阵 Σ 的作用 - 对角线元素 Σⱼⱼ:特征 xⱼ 的方差 - 非对角线元素 Σᵢⱼ:特征 xᵢ 和 xⱼ 的协方差(相关性) ## 三、多变量 vs 单变量的对比 | 对比项 | 单变量高斯 | 多变量高斯 | |--------|-----------|-----------| | **特征独立性假设** | 假设特征独立 | 自动捕捉特征间相关性 | | **决策边界形状** | 圆形/球形等高线 | 椭球等高线(可旋转) | | **计算复杂度** | O(n) | O(n²) | | **所需样本量** | 少 | 多(需 m > n,否则 Σ 不可逆) | ## 四、多变量高斯分布的三种特殊情况 ### 情况一:Σ 是对角矩阵且对角线相等 p(x) 的等高线是圆形,等价于单变量高斯分布(各特征方差相同且独立)。 ### 情况二:Σ 是对角矩阵但对角线不等 p(x) 的等高线是轴对齐的椭圆,等价于标准异常检测算法(各特征方差不同但独立)。 ### 情况三:Σ 是非对角矩阵 p(x) 的等高线是旋转的椭圆,这是多变量高斯分布独有的能力。 ## 五、多变量高斯分布的局限性 | 局限 | 说明 | |------|------| | **样本量要求** | 必须满足 m > n,否则 Σ 不可逆 | | **计算成本高** | 需要计算 n×n 矩阵的逆,O(n³) | | **特征冗余敏感** | 若有完全相关的特征,Σ 会奇异(不可逆) | ### 实际建议 - 当 m >> n 且特征间有明显相关性时,优先使用多变量高斯分布 - 当 m 较小或 n 较大时,使用标准异常检测算法(单变量高斯乘积) ## 六、多变量高斯分布与标准算法的关系 标准异常检测算法是多变量高斯分布的一个特例:当 Σ 限制为对角矩阵时,两者等价。 多变量高斯分布允许 Σ 为非对角矩阵,因此能够自动捕捉特征间的相关性,无需手动构造组合特征。 ## 七、一句话总结 **"多变量高斯用协方差矩阵 Σ 自动捕捉特征相关性,等高线从圆变成斜椭圆——样本够多就用它,样本太少还是老老实实做特征工程。"** --- # 使用多变量高斯分布的异常检测 ## 一、多变量高斯分布的应用流程 ### 与传统异常检测算法的对比 | 步骤 | 传统算法(单变量乘积) | 多变量高斯分布 | |------|---------------------|--------------| | **参数估计** | 分别估计每个特征的 μⱼ 和 σⱼ² | 估计整个 μ 向量和 Σ 矩阵 | | **概率计算** | 各特征概率密度相乘 | 直接用多变量高斯公式计算 | | **相关性处理** | 需手动构造组合特征 | 自动捕捉特征间相关性 | ## 二、算法步骤 ### 第一步:拟合参数 给定训练集 {x¹, x², ..., xᵐ},其中 xⁱ ∈ ℝⁿ: μ = (1/m) · Σᵢ₌₁ᵐ xⁱ Σ = (1/m) · Σᵢ₌₁ᵐ (xⁱ - μ) · (xⁱ - μ)ᵀ ### 第二步:计算新样本的概率 p(x) = (1 / ((2π)^(n/2) · |Σ|^(1/2))) · e^(-(1/2) · (x - μ)ᵀ · Σ⁻¹ · (x - μ)) ### 第三步:判断异常 若 p(x) < ε,则标记为异常;否则为正常。 ## 三、与传统算法的关系 ### 等价条件 当 Σ 为对角矩阵时,多变量高斯分布退化为传统算法: Σ = ⎡ σ₁² 0 ... 0 ⎤ ⎢ 0 σ₂² ... 0 ⎥ ⎢ ⋮ ⋮ ⋱ ⋮ ⎥ ⎣ 0 0 ... σₙ²⎦ 此时: p(x) = Πⱼ₌₁ⁿ (1 / √(2πσⱼ²)) · e^(-(xⱼ - μⱼ)² / (2σⱼ²)) ### 关键区别 | 方面 | 传统算法 | 多变量高斯 | |------|---------|-----------| | **Σ 的形式** | 对角矩阵(手动限制) | 任意半正定矩阵(自动学习) | | **特征相关性** | 假设独立 | 自动建模 | | **手动构造特征** | 需要(如比值特征) | 不需要(自动捕捉) | ## 四、多变量高斯分布的优缺点 ### 优点 | 优点 | 说明 | |------|------| | **自动捕捉相关性** | 无需手动构造 x₃ = x₁/x₂ 这类组合特征 | | **计算简便** | 一步到位,不需要逐个特征建模 | | **决策边界灵活** | 可旋转的椭球等高线,适配各种数据分布 | ### 缺点 | 缺点 | 说明 | |------|------| | **样本量要求高** | 必须满足 m > n,否则 Σ 不可逆 | | **计算成本高** | 需计算 n×n 矩阵的逆,O(n³) | | **冗余特征敏感** | 若有完全相关的特征,Σ 奇异 | ## 五、何时选择多变量高斯分布 ### 推荐使用多变量高斯 - m ≥ 10n(样本量远大于特征数) - 特征间存在明显的相关性 - 不想手动构造组合特征 ### 推荐使用传统算法 - m 较小(甚至 m < n) - 特征间相关性弱或已知独立 - 需要更好的可解释性(可追溯哪个特征异常) ## 六、矩阵 Σ 的可逆性问题 ### 不可逆的原因 1. m < n:样本量少于特征数,Σ 秩不足 2. 存在冗余特征:某特征是其他特征的线性组合 ### 解决方法 | 问题 | 解决方案 | |------|---------| | m < n | 改用传统算法,或收集更多数据 | | 冗余特征 | 删除完全相关的特征(如同时包含摄氏度和华氏度) | ## 七、一句话总结 **"多变量高斯自动学相关性,省去手动造特征的麻烦——但样本要多于特征数,否则 Σ 不可逆就玩不转了。"** ---