机器学习

1. 机器学习是什么

机器学习就是教计算机从数据中学习,而不是通过明确的程序来完成某项任务。换句话说,机器学习是一种通过数据训练模型,使其能够对未见数据进行预测或决策的方法。例如,通过大量猫和狗图片的训练,让计算机学会区分猫和狗。

1.1. 扩展知识

机器学习已经成为现代科技的一个核心领域,下面进一步补充一些相关知识和概念:

  1. 分类与回归:这是机器学习的两大基本任务。分类任务是将输入数据划分到不同的离散类别中,比如垃圾邮件检测;回归任务则是预测连续值,比如股票价格预测。
  2. 监督学习与无监督学习:这是机器学习重要的两种类型。监督学习是指模型在训练时需要给定明确的输入--输出对,比如学生在老师的指导下学习;无监督学习则是模型要从没有标签的数据中寻找模式,比如聚类任务。
  3. 特征工程 :在机器学习中,输入数据需要转换成某种特定的格式,叫做特征,这一过程叫特征工程。好的特征能够显著提升模型的性能。
  4. 模型评估与验证:评估一个机器学习模型的好坏,通常采用交叉验证方法,通过划分训练集和测试集来衡量模型的性能。此外,常见的评估指标有准确率、召回率、F1分数等。
  5. 深度学习与神经网络 :在高级机器学习中,深度学习尤为重要。深度学习利用多层神经网络来自动学习复杂的特征,并在图像识别、自然语言处理等领域取得了巨大成功。
  6. 应用场景:机器学习的应用非常广泛,包括但不限于搜索引擎、推荐系统、语音识别、智能客服、医疗诊断等。

2. 监督学习、半监督学习和无监督学习分别是什么,它们的区别在哪?

监督学习、半监督学习和无监督学习是机器学习中的三种主要学习范式。它们的区别主要在于训练数据中的标签信息的多少

  1. 监督学习:在监督学习中,模型使用标注过的训练数据,即每个输入都有其对应的正确输出(标签)。通过大量标注数据训练,模型学习到输入和输出之间的映射关系。常见任务有分类和回归。

  2. 半监督学习:半监督学习介于监督学习和无监督学习之间。它使用少量标注数据和大量未标注数据进行训练。这种方式能够减少标注数据的需求,利用未标注数据提升模型的表现。常见手段有自训练、共训练和伪标签生成。

  3. 无监督学习:在无监督学习中,模型只使用未标注的训练数据。目标是挖掘数据中的潜在结构或模式。常见任务有聚类和降维。

2.1. 扩展知识

这三个学习范式各有其适用场景,下面详细阐述一下它们的原理、优缺点以及应用。

  1. 监督学习
  • 原理:模型通过标注数据进行训练,学会输入输出之间的映射关系。常用算法包括线性回归、支持向量机、神经网络等。
  • 优点:精度高,训练过程可以控制,误差可通过标签进行明确矫正。
  • 缺点:需要大量标注数据,数据标注成本高。
  • 应用:分类任务如垃圾邮件检测、回归任务如房价预测。
  1. 半监督学习
  • 原理:使用少量标注数据和大量未标注数据结合的方式进行训练。可以通过生成伪标签、图表示学习等方法提升模型性能。
  • 优点:在标注数据不足时,能有效利用大量未标注数据,提升模型性能。
  • 缺点:模型的训练过程复杂,需要设计合理的策略来利用未标注数据。
  • 应用:在标注数据获取困难或成本高 的场景,如医疗影像分析、自然语言处理等。
  1. 无监督学习
  • 原理:模型通过发现数据的内在模式或结构进行学习。常用算法包括K均值聚类、主成分分析(PCA)、自组织映射(SOM)。
  • 优点:不需要标注数据,适用范围广。
  • 缺点:难以评估模型效果,通常结果的可解释性较差。
  • 应用:客户细分、特征提取、数据可视化等。

3. 机器学习有哪些常见的算法?

机器学习常见的算法主要有以下几类:

  1. 监督学习算法:线性回归、逻辑回归、支持向量机、决策树、随机森林、K近邻算法(KNN)、朴素贝叶斯
  2. 非监督学习算法:K均值聚类、层次聚类、主成分分析(PCA)、独立成分分析(ICA)
  3. 强化学习算法:Q学习、SARSA算法、深度Q网络(DQN)、策略梯度方法

3.1. 扩展知识

在这几类算法中,每一种都有其独特的应用场景和优缺点,下面是一些常见的算法。

  1. 线性回归
  • 应用:主要用于回归问题,也就是预测一个连续的数值输出。比如房价预测、销量预测等。
  • 优点:简单直观,训练速度快。
  • 缺点:仅适用于线性关系的数据,对非线性关系无法处理。
  1. 逻辑回归
  • 应用:主要用于二分类问题,预测一个样本属于某一类的概率。比如广告点击率预测、垃圾邮件分类等。
  • 优点:概率输出,解释性强。
  • 缺点:对于非线性的问题,需要进行特征工程或者使用核函数。
  1. 支持向量机(SVM)
  • 应用:主要用于分类问题,能够处理线性和非线性数据。比如图像、文本分类等。
  • 优点:能够找到分类决策边界的最大化间隔,泛化能力强。
  • 缺点:对大规模数据不友好,训练时间长,适合于小样本。
  1. 决策树
  • 应用:用于分类和回归问题。比如市场策略的决策制定、疾病诊断等。
  • 优点:可以处理非线性数据,易于解释。
  • 缺点:容易过拟合,需要修剪。
  1. 随机森林
  • 应用:用于分类和回归问题。比如预测顾客忠诚度、信用评分等。
  • 优点:集成多棵决策树,减小过拟合问题,效果较好。
  • 缺点:对于高维数据,计算资源消耗较大。
  1. K近邻(KNN)算法
  • 应用:用于分类和回归问题。比如推荐系统、图像识别等。
  • 优点:理论上实现简单,不需要训练过程。
  • 缺点:计算量大,预测时间长,尤其是大数据集。
  1. 朴素贝叶斯
  • 应用:主要用于分类问题。比如文本分类、垃圾邮件过滤等。
  • 优点:简单高效,适合高维数据。
  • 缺点:假设特征之间独立,现实中并不总是成立。
  1. K均值聚类
  • 应用:用于非监督学习中的聚类分析。比如图像分割、客户分群等。
  • 优点:理解和实现简单,计算速度快。
  • 缺点:需要预先确定聚类数K,对初始值敏感。
  1. 主成分分析(PCA)
  • 应用:降维,特征提取。比如数据可视化。
  • 优点:可以有效减少数据的维度,保留主要特征信息。
  • 缺点:信息损失,不易解释。
  1. Q学习
  • 应用:强化学习中的一种值函数算法。比如游戏AI、自动驾驶等。
  • 优点:无需模型,自学能力强。
  • 缺点:收敛速度较慢,适应复杂环境能力一般。

4. 什么是损失函数?有什么作用?

损失函数(Loss Function)是机器学习模型优化过程中用来衡量模型预测值与实际值之间差异的函数。其作用主要在于提供一个标量值,用于量化模型预测与实际目标之间的误差,从而指导模型参数的更新过程,使模型预测更加准确。

4.1. 扩展知识

  1. 类型多样:
  • 回归问题:常见的损失函数有均方误差(MSE)和平均绝对误差(MAE) 。MSE计算预测值和真实值之间差的平方和的平均,适用于对异常值不敏感的应用;MAE计算的是绝对差的平均,对异常值更为敏感
  • 分类问题:交叉熵损失(Cross-Entropy Loss)比较常见,用于多类分类任务,也包括二分类。它衡量的实际类别的概率分布和预测概率分布之间的差异。
  1. 优化指导:
  • 损失函数提供了一个目标,使得训练模型的过程变成了一个优化问题,通过最小化损失函数来求解最优模型参数。
  • 梯度下降法及其变种(如Adam、RMSprop等)是常用的优化算法,通过计算损失函数相对于模型参数的梯度来指导参数更新。
  1. 调整难度:
  • 特别复杂的数据分布或难解的问题,可能需要自定义损失函数。例如,Focal Loss用于应对类别严重不平衡问题
  1. 正则化:
  • 为了防止模型过拟合,可以在损失函数中加入正则化项,如L1或L2正则化,将模型参数的某种度量(如绝对值和平方和)加入到损失函数中。
  1. 评估模型性能:
  • 损失函数不同于评估指标(如Accuracy、F1 Score等),虽然损失函数用于训练过程中的指标,但最终模型的效果还是需要通过具体的任务评分指标来评估。

5. 什么是梯度下降?它的工作原理是什么?有哪些变体?

梯度下降是一种优化算法,用于最小化(或最大化)目标函数。它主要用于机器学习和深度学习模型的训练。其核心思想是通过不断调整模型的参数,使得误差函数的值逐渐减小,最终收敛到一个局部最小值或者全局最小值。

它的基本工作原理如下:

  1. 初始化参数:从一个随机点开始。
  2. 计算梯度 :计算当前位置处的目标函数梯度,梯度反映了函数在该点的增长方向
  3. 更新参数:沿着梯度的反方向(即减少梯度的方向)移动一步,步长由学习率(Step Size)决定。
  4. 重复步骤2和3,直到达到预设的条件(比如费用函数的变化小于某个阈值,或者迭代次数达到上限)。

梯度下降的主要变体包括:

  1. 批量梯度下降(Batch Gradient Descent):使用整个训练数据集计算梯度进行更新。
  2. 随机梯度下降(Stochastic Gradient Descent, SGD):每次使用一个样本计算梯度进行更新。
  3. 小批量梯度下降(Mini-batch Gradient Descent):每次使用一个子集(小批量)样本计算梯度进行更新。

5.1. 扩展知识

在实际应用中,梯度下降算法的效率和效果可能受到多种因素的影响。下面来详细讲解一些相关的知识点:

  1. 学习率: 学习率决定了每次参数更新的步长如果学习率太大,可能会错过最优点,甚至导致不收敛;如果太小,则收敛速度会非常慢。因此,选择合适的学习率至关重要。有时候我们会使用学习率衰减策略,使得学习率随着训练的进行逐渐减小,以提高收敛效果。

  2. 动量: 带有动量的梯度下降方法(如Momentum)考虑了前几次更新的方向 ,从而帮助当前更新,类似于物理运动中的惯性。这可以帮助加速收敛并减少震荡。

  3. 自适应学习率: 一些变体(如AdaGrad、RMSProp、Adam)会根据参数的更新历史动态调整学习率,使得不同参数可以有不同的学习率。Adam(Adaptive Moment Estimation)是其中最为常用的一个,它结合了Momentum和RMSProp的优点,不仅计算了梯度的一阶矩估计,还计算了梯度平方的一阶矩估计,从而在训练深度神经网络时表现尤为优越。

  4. 收敛问题: 梯度下降可能收敛到局部最小值,特别是在具有高度非线性和复杂结构的神经网络中。为了解决这个问题,我们可以采用一些技术,比如随机初始权重、多次运行取最优解、使用更复杂的优化算法(如全局优化算法)。

6. 解释高斯牛顿法和拟牛顿法

高斯牛顿法和拟牛顿法都是用于非线性优化问题中的迭代方法。它们都用于寻找使目标函数最小化的参数值。

  1. 高斯牛顿法主要用于非线性最小二乘问题 。它基于牛顿法的思想,但是只使用了目标函数的Jacobian矩阵,而不是Hessian矩阵。每次迭代中,更新方式类似是: xk+1 =xk−(JTJ)−1JTr x_{k+1} = x_k - (J^TJ)^{-1}J^Tr xk+1=xk−(JTJ)−1JTr 其中 (J) 是目标函数的Jacobian矩阵,(r) 是残差向量。

  2. 拟牛顿法是一种用于一般非线性优化问题的方法。它并不直接计算Hessian矩阵,而是通过构造Hessian矩阵的近似来实现。常见的拟牛顿方法有BFGS和L-BFGS。更新方式通过使用更新公式来逐步逼近Hessian矩阵或者其逆矩阵。

6.1. 扩展知识

高斯牛顿法比较适用于非线性最小二乘问题,比如在机器学习中的曲线拟合问题。而且,因为它不需要Hessian矩阵,只用到Jacobian,计算相对简单一些。但值得注意的是,它在处理强非线性和不好的初始猜测值时,性能会下降,可能会导致收敛速度慢或者不收敛。

拟牛顿法更为普遍应用于各种非线性优化问题,因为它弥补了标准牛顿法在计算Hessian矩阵时的高昂成本。以BFGS为例,它通过特定的更新公式来逐步逼近Hessian矩阵。BFGS是基于秩一修正方法,更新公式如下: Bk+1 =Bk+ δkδkT δkTγk − BkγkγkTBk γkTBkγk B_{k+1} = B_k + \frac{\delta_k\delta_k^T}{\delta_k^T\gamma_k} - \frac{B_k\gamma_k\gamma_k^TB_k}{\gamma_k^TB_k\gamma_k} Bk+1=Bk+δkTγkδkδkT−γkTBkγkBkγkγkTBk 其中 (δk) (\delta_k) (δk) 是当前步长, (γk) (\gamma_k) (γk) 是梯度的变化量。

L-BFGS 是 BFGS 的一个变种,主要区别在于其采用了有限内存的方法,即只保留一部分历史信息,可以处理更大规模的问题。

补充:牛顿法核心逻辑

牛顿法是二阶优化算法,用一阶导数(梯度)+ 二阶导数(Hessian海森矩阵) 对损失函数做二阶泰勒展开,直接找函数极小值点,收敛速度远快于梯度下降(梯度下降只是一阶算法)。 迭代公式: xk+1 =xk− Hk−1 ∇f(xk) x_{k+1}=x_k - H_k^{-1}\nabla f(x_k) xk+1=xk−Hk−1∇f(xk)

  • ∇f\nabla f ∇f:一阶梯度,函数下降方向
  • HH H:Hessian矩阵(二阶导数矩阵),描述曲面曲率

致命缺点

  1. 高维参数下,Hessian矩阵计算量爆炸;
  2. 求矩阵逆 H−1H^{-1} H−1 复杂度极高,深度学习/大规模优化完全扛不住。

高斯牛顿、拟牛顿,本质都是对原版牛顿法的工程简化,分别解决不同场景下Hessian矩阵难算的问题。

补充:极简横向对比

方法 依赖矩阵 适用场景 核心亮点 短板
原版牛顿法 Hessian二阶矩阵 低维小规模简单函数 二阶收敛最快 计算爆炸,无法落地
高斯牛顿 Jacobian一阶矩阵 仅非线性最小二乘(拟合/SLAM) 最小二乘下极简高效 场景单一、易发散
拟牛顿法(BFGS/L-BFGS) 近似Hessian(梯度拟合) 所有非线性优化任务 通用、算力可控、L-BFGS省内存 深度学习大批量训练不如Adam

补充:通俗大白话

  1. 牛顿法:走路时不仅看脚下坡度往哪下(一阶梯度),还看路面弯不弯(二阶曲率),直接跳去谷底,但看曲率代价极大;
  2. 高斯牛顿:只在"平方误差拟合"这件事上偷懒,用一阶导数凑出近似曲率,仅限拟合干活;
  3. 拟牛顿法:不管什么优化任务都偷懒,靠自己前几步走路的方向变化,脑补路面弯曲程度,不用真的去算曲率,万能通用。

7. 解释过拟合和欠拟合,以及如何应对过拟合问题

过拟合是指模型在训练数据上表现得特别好,但是在新数据(比如验证集或测试集)上的表现却不好。这通常是因为模型复杂度太高,以至于它不仅学习到了训练数据中的模式,还学到了训练数据中的噪音。结果,虽然它能够极好地拟合训练数据,但无法泛化到新的数据。

欠拟合是相反的情况,指的是模型在训练数据和新数据上都表现不好。这意味着模型复杂度太低,无法捕捉数据中的重要模式和结构。

为了应对过拟合问题,通常可以采取以下措施:

  1. 增加训练数据量。更多的数据可以帮助模型更好地识别数据中的真实模式,而非噪音。
  2. 正则化。通过增加正则化项(如L1或L2正则化),限制模型的复杂度。
  3. 使用交叉验证。通过交叉验证可以更好地估计模型在未见数据上的表现,从而选择更合适的模型参数。
  4. 简化模型。减少模型复杂度(如减少神经网络的层数或节点数)也有助于防止过拟合。
  5. 数据增强 。通过在训练数据上进行一定的变换(如旋转、翻转)来生成更多的训练样本,增强模型的泛化能力。

7.1. 扩展知识

对于过拟合和欠拟合的理解,我们还可以用一个生动形象的例子来解释。假设你是一位学生,过拟合就像是你只死记硬背了课本例题,考试时碰到类似的题目能答出来,但遇到新题目就表现得不好。欠拟合则像是你连课本例题都没有看懂,考试自然也很难有好成绩。

针对过拟合问题,还可以进一步探索以下知识点:

1)提前停止(Early Stopping): 在训练神经网络时,我们可以通过监控验证集的误差来决定何时停止训练。验证集误差开始增加时,就停止训练。这样可以避免模型在训练集上继续过度拟合。

2)模型集成(Ensemble Learning): 使用多种模型的组合(如随机森林、梯度提升等),而不是依赖单个模型。集成方法可以有效降低模型的方差,减少过拟合。

3)Dropout: 在深度学习中,dropout是一种常用的正则化技术。它通过在每次训练迭代中随机"丢弃"某些神经元,使得模型更加健壮,减少过拟合的风险。

4)特征选择: 移除那些对模型预测结果贡献不大的特征,减少噪音的干扰,从而减小过拟合。

8. 什么是正则化?正则化有哪些作用?机器学习中常见的正则化方法。

正则化(Regularization)是机器学习中的一种技术,主要用于防止模型过拟合。通过在模型训练过程中引入额外的约束,正则化可以使模型在处理新数据时具有更好的泛化能力,即提高模型的泛化性能。

正则化在机器学习中的作用主要是:

  1. 防止过拟合:通过增加模型的约束,减少在训练数据上的过拟合,从而提升在测试数据上的表现。
  2. 特征选择:有些正则化方法可以自动选择特征,稀疏化模型参数,使模型更加简洁。
  3. 提高泛化性能:通过限制模型复杂度,增强泛化能力,使模型在未见过的数据上表现更佳。

常见的正则化方法有:

  1. L1正则化(Lasso回归) :通过对模型参数的绝对值加上惩罚项,可以使一些参数变为零,从而达到特征选择的效果。
  2. L2正则化(Ridge回归) :通过对模型参数的平方加上惩罚项,可以防止参数过大,避免过拟合。
  3. Dropout:在神经网络中,通过在训练过程中随机丢弃一部分神经元,防止神经元之间的相互依赖,有效防止过拟合。
  4. 早停法(Early Stopping):在训练过程中,通过监控模型在验证集上的表现,提前停止训练,避免过拟合。

8.1. 扩展知识

正则化可以通过不同的方法实现,每种方法有其独特的适用场景和优势。比如,L1正则化适用于希望进行特征选择的场景,因为它可以使部分权重变为零,从而实现特征选择。L2正则化则适用于希望防止模型权重过大的场景,它通过增加权重的平方惩罚,使得权重不会过大,增强模型的稳定性。

在神经网络中,Dropout是一种非常有效的方法。它的工作原理是在每次训练的时候,随机丢弃一部分神经元(即使这些神经元的激活为零),使得其他神经元不能过度依赖某些单一神经元,从而提高网络的鲁棒性。此外,Dropout还可以看作是一种对多个子网络进行平均的过程,因此可以有效提高模型的泛化能力。

Dropout 在训练阶段随机将部分神经元激活置零,但在测试阶段会使用全部神经元。

早停法(Early Stopping)则是一种简单而有效的策略。它通过在训练过程中监控模型在验证集上的性能,如果发现性能开始下降,则提前停止训练。这种方法特别适用于深度学习模型,因为深度学习模型往往容易受到训练时间长短和参数调整的影响,通过早停法可以避免模型过拟合。

补充:为啥叫"正则"

  1. 数学上「正则」就是:施加约束,让函数 / 解变得光滑、稳定、有良好性质,消除病态、震荡、发散
  2. 放到机器学习里,正则化 Regularization = 给模型加一套 "规则枷锁",强行规范参数行为
    • 模型自由训练时容易放飞自我:为了死死记住训练集每一个噪声点,把参数拉得特别大、曲线扭得特别弯 → 这叫不规整、不规则(irregular)。
    • 加正则惩罚项之后:限制参数大小、砍掉无用特征、限制网络复杂度 → 让模型决策边界变得平滑、保守、符合通用规律 → 变得 "正则(regular)"。

9. 线性回归和逻辑回归有什么区别?

线性回归和逻辑回归是机器学习中两个非常重要的算法,虽然它们的名字相似,但在用途和数学原理上有很大的区别。

1)用途:

  • 线性回归用于解决回归问题,即预测连续的数值型输出。
  • 逻辑回归用于解决分类问题,通常是二分类问题,即预测离散的类别标签。

2)输出:

  • 线性回归的输出是一个连续的实数
  • 逻辑回归的输出是一个介于0和1之间的概率值,通常通过设定一个阈值(如0.5)将其转换为类别标签。

3)模型形式:

  • 线性回归的模型形式为一个线性方程 y=β0+β1x1+β2x2+⋯+βnxn y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \dots + \beta_n x_n y=β0+β1x1+β2x2+⋯+βnxn, 其中 (y)(y) (y) 是预测值, (xi) (x_i) (xi) 是特征, (βi) (\beta_i) (βi) 是系数。
  • 逻辑回归的模型形式为一个线性方程后接一个Sigmoid函数 P(y=1∣x)= 11+e −(β0+β1x1+β2x2+⋯+βnxn) \displaystyle P(y=1|x) = \frac{1}{1+e^{-(\beta_0+\beta_1 x_1+\beta_2 x_2+\dots+\beta_n x_n)}} P(y=1∣x)=1+e−(β0+β1x1+β2x2+⋯+βnxn)1,其中 P(y=1∣x)P(y=1|x) P(y=1∣x) 是输出为1的概率。

4)损失函数:

  • 线性回归通常使用最小二乘法 来优化其损失函数,即均方误差(MSE) MSE=1n ∑i=1n (yi− y^i )2 \displaystyle \text{MSE} = \frac{1}{n}\sum_{i=1}^n (y_i - \hat{y}_i)^2 MSE=n1i=1∑n(yi−y^i)2。
  • 逻辑回归使用的是对数损失(Log Loss)或者叫做交叉熵损失(Cross-Entropy Loss) Log Loss=−1n ∑i=1n yilog⁡( y\^i )+(1−yi)log⁡(1− y\^i ) \displaystyle \text{Log Loss} = -\frac{1}{n}\sum_{i=1}^n \bigy_i \\log(\\hat{y}_i) + (1 - y_i)\\log(1 - \\hat{y}_i)\\big Log Loss=−n1i=1∑nyilog(y\^i)+(1−yi)log(1−y\^i)

9.1. 扩展知识

在线性回归和逻辑回归的基础上,我们可以进一步扩展到更多的相关概念和应用。

1)正则化:

  • 为了防止模型过拟合,可以在损失函数中加入正则项,以限制模型系数的大小。线性回归和逻辑回归都可以加入L1正则化(Lasso回归)或L2正则化(Ridge回归),前者会导致某些系数变为0,后者更倾向于缩小系数大小。

2)多分类问题:

  • 虽然逻辑回归通常用于二分类问题,但通过一些技巧可以扩展到多分类问题。常用的方法有"一对多"(One-vs-Rest,OvR)和"多对多"(One-vs-One,OvO),它们分别通过训练多个二分类器来实现多分类

3)模型评价指标:

  • 对于线性回归,常用的评价指标有均方误差(MSE)、均方根误差(RMSE)、平均绝对误差(MAE)和R平方( R2R^2 R2)。
  • 对于逻辑回归,常用的评价指标有准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1-score、ROC曲线和AUC值。每个指标均有其特定的应用场景和优势,选择合适的评价指标有助于更好地评估模型性能。

4)数据预处理:

  • 线性回归和逻辑回归对数据的预处理有一些相似要求,如特征缩放(归一化或标准化),以避免某些特征对模型训练产生不均衡影响。同时它们也都假设各个特征是线性可分的,若数据特征与目标之间的关系并非线性的,可以考虑进行特征工程或使用非线性模型。

10. 什么是线性回归,解释其假设和工作原理

线性回归是一种简单但强大的统计方法,用来建立因变量(Y)与一个或多个自变量(X)的线性关系。它的目标是通过最小化预测值和实际值之间的误差,来找到最佳拟合直线。

在其工作原理上,线性回归依赖于以下几个关键假设:

  1. 线性关系假设:自变量和因变量之间存在线性关系。
  2. 独立性假设:观测值之间相互独立。
  3. 同方差性 假设:不同观测值的误差项具有相同的方差
  4. 正态性 假设:误差项符合正态分布

10.1. 扩展知识

对于线性回归的进一步理解,可以从以下几个方面展开:

  1. 模型表述: 线性回归方程可以表示为 Y=β0+β1X1+β2X2+⋯+βnXn+ϵ Y = \beta_0 + \beta_1X_1 + \beta_2X_2 + \dots + \beta_nX_n + \epsilon Y=β0+β1X1+β2X2+⋯+βnXn+ϵ,其中 (β0) (\beta_0) (β0) 是截距, (β1,β2,...,βn) (\beta_1,\beta_2,\dots,\beta_n) (β1,β2,...,βn) 是回归系数, (ϵ)(\epsilon) (ϵ) 是误差项。

  2. 参数估计: 常用的估计方法是最小二乘法(Ordinary Least Squares, OLS),它通过最小化观测值与预测值之间的平方误差和来找到最佳拟合线。

  3. 模型评估:

  • 决定系数( R2R^2 R2):用于评估模型解释的方差比例,越接近1表示模型拟合效果越好。
  • 均方误差(MSE):用于衡量预测值和实际值之间的平均平方误差。

4)多重共线性: 当自变量之间呈现高线性相关性时,会导致回归系数估计不稳定。常用的解决方法包括岭回归、Lasso回归等。

5)扩展模型: 线性回归模型的基本形式只考虑了一阶项,可以扩展到多项式回归,考虑自变量的多阶项,从而捕获非线性关系。

6)应用场景: 线性回归广泛应用于经济预测、风险评估、市场分析等多个领域。通过理解其假设和工作原理,我们可以更有效地运用这一工具来解决实际问题。

10.2. Python 代码示例(线性回归)

完整代码:1.linear_regression.py

python 复制代码
# ============ 案例一:单变量线性回归(身高 → 体重) ============
from sklearn.linear_model import LinearRegression

x = [[160], [166], [172], [174], [180]]   # 身高 cm
y = [56.3, 60.6, 65.1, 68.5, 75]         # 体重 kg

model = LinearRegression()                # 实例化
model.fit(x, y)                           # 训练(最小二乘法求参数)
print(model.coef_)        # 权重(斜率 w)
print(model.intercept_)   # 偏置(截距 b)
print(model.predict([[176]]))   # 预测身高 176cm 的体重

# ============ 案例二:正规方程 vs 梯度下降(回归对比) ============
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, SGDRegressor
from sklearn.metrics import mean_squared_error
from sklearn.datasets import load_diabetes

# 1. 加载数据 + 划分
X, y = load_diabetes(return_X_y=True)
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=22)

# 2. 标准化(消除量纲,让不同特征尺度一致)
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)

# 3-1. 正规方程:一次求解最优参数,适合小数据
model1 = LinearRegression()
model1.fit(x_train, y_train)

# 3-2. 梯度下降:迭代逼近最优参数,适合大数据
model2 = SGDRegressor(learning_rate='constant', eta0=0.01)
model2.fit(x_train, y_train)

# 4. 预测 + MSE 评估
print(mean_squared_error(y_test, model1.predict(x_test)))
print(mean_squared_error(y_test, model2.predict(x_test)))

11. 进行线性回归前,为什么需要对特征进行离散化处理?

在进行线性回归前,通常需要对特征 进行离散化处理,因为离散化特征能帮助提升模型的性能和稳定性,特别是在处理带有非线性关系的数据时。具体原因包括:

  1. 提升模型能力:离散化可以捕捉特征的非线性关系。因为线性回归本质上是一个线性模型,无法直接处理非线性关系。
  2. 减少模型复杂度:离散化可以简化数据,减少模型所需关注的特征维度,进而避免过拟合。
  3. 适应模型需求:某些线性回归模型,如逻辑回归,天生适应离散化特征,对连续特征的处理可能需要更多的调整和复杂性。
  4. 处理异常值:离散化可以减少异常值的影响,因为离散化后,异常值会被归入某个区间内,不再对模型造成巨大的偏移。

11.1. 扩展知识

  1. 离散化的具体方法:
  • 等宽离散化:将连续数据等宽分割,比如一个特征的值范围在0到100,分成10个区间,每个区间宽度为10。
  • 等频离散化 :根据数据分布将数据分成频率相等的若干区间,使每个区间内的数据点数目相等
  • 按实际需求划分:根据具体业务需求或者领域知识来划分,比如年龄可以按"青年"、"中年"、"老年"来划分。
  1. 在实际项目中的应用:
  • 在某些电商推荐系统中,对用户购买习惯的特征做离散化处理可以更好的进行建模,提高推荐结果的精准度。
  • 银行评分卡模型中,对用户的财务特征进行离散化可以减少一些极端数值的干扰,改善评分模型的稳健性。
  1. 对比其他特征工程方法:
  • 标准化和归一化 :这些方法适用于连续特征,通过调整特征的值来使其适应模型的需求。而离散化是通过将连续特征转换为类别特征,可用于捕捉非线性信息
  • 特征交互:特征离散化常与特征交互结合使用,能够构建出更复杂、更有预测力的模型。例如,将离散化后的特征进行组合,以形成新的特征。

离散化处理的是「自变量 X(特征)」,不是因变量 Y
线性模型只能拟合全局单调线性,分箱分段实现非线性 假设:面积越大,房价先快速上涨,到超大户型涨幅放缓。 直接丢原始面积:一条直线强行拟合,偏差巨大。 离散成 3 个区间后,每个区间独立系数,等价于分段线性,拟合非线性趋势。

12. 解释 Ridge 回归和 Lasso 回归

Ridge 回归和 Lasso 回归是两种常用于处理多重共线性和防止过拟合的正则化技术,它们都在最小化线性回归模型的残差平方和的目标函数中加入了一个正则化项。

  1. Ridge 回归(岭回归):也叫 Tikhonov 正则化。它在目标函数中添加了所有回归系数的平方和作为罚项。公式如下:

目标函数=min⁡ ( ∑i=1n (yi−β0− ∑j=1p βj xij ) 2 +λ ∑j=1p βj2) 目标函数=\min\left( \sum_{i=1}^{n} \left(y_i - \beta_0 - \sum_{j=1}^{p} \beta_j x_{ij}\right)^2 + \lambda \sum_{j=1}^{p} \beta_j^2 \right) 目标函数=min i=1∑n(yi−β0−j=1∑pβjxij)2+λj=1∑pβj2

其中, λ\lambda λ 是正则化参数,控制着罚项的强度,防止系数过大,从而减小模型复杂度。

  1. Lasso 回归(最小绝对收缩和选择算子):它在目标函数中添加了所有回归系数的绝对值和作为罚项。公式如下:

目标函数=min⁡ ( ∑i=1n (yi−β0− ∑j=1p βj xij ) 2 +λ ∑j=1p ∣βj∣) 目标函数=\min\left( \sum_{i=1}^{n} \left(y_i - \beta_0 - \sum_{j=1}^{p} \beta_j x_{ij}\right)^2 + \lambda \sum_{j=1}^{p} |\beta_j| \right) 目标函数=min i=1∑n(yi−β0−j=1∑pβjxij)2+λj=1∑p∣βj∣

Lasso 回归相比 Ridge 回归有一个显著的特点就是它可以产生稀疏模型,即部分回归系数可以被压缩到零,这样便于特征选择。

12.1. 扩展知识

  1. 特征选择
  • Ridge 回归不会产生稀疏解,它会缩小所有系数但不会将其置零。因此,它适用于特征很多但都可能有一定影响的情况。
  • Lasso 回归由于 L1 惩罚会使得一些系数变为零,这实际上相当于进行了特征选择,非常适合处理高维数据。
  1. 正则化参数的选择
  • 两者共同点是都需要选择合适的正则化参数 λ\lambda λ,这通常通过交叉验证来确定。
  • 需要注意的是,过大的 λ\lambda λ 值会导致模型过于简单,而过小的 λ\lambda λ 值则可能无法有效避免过拟合
  1. 组合使用:弹性网(Elastic Net)
  • 在实际应用中,有时会混合使用 Ridge 和 Lasso 的正则化技巧,这就是所谓的弹性网(Elastic Net)。其正则化项是 L1 和 L2 的结合,能够同时拥有两者的优点,公式如下:

目标函数=min⁡ ( ∑i=1n (yi−β0− ∑j=1p βj xij ) 2 +λ1 ∑j=1p ∣βj∣+λ2 ∑j=1p βj2) 目标函数=\min\left( \sum_{i=1}^{n} \left(y_i - \beta_0 - \sum_{j=1}^{p} \beta_j x_{ij}\right)^2 + \lambda_1 \sum_{j=1}^{p} |\beta_j| + \lambda_2 \sum_{j=1}^{p} \beta_j^2 \right) 目标函数=min i=1∑n(yi−β0−j=1∑pβjxij)2+λ1j=1∑p∣βj∣+λ2j=1∑pβj2

弹性网将会针对不同的数据集给予更灵活的模型调优。

  1. 计算效率和模型解释性
  • Ridge 回归计算效率较高,并且模型解释性强,因为所有特征都会保留下来。
  • Lasso 回归则由于其稀疏性,在解释模型的时候会更加直观。然而,计算效率在某些高维度情况下会略差。
  1. 实际应用例子
  • 在财务数据分析中,Ridge 回归经常被用来处理众多相互之间有相关性的财务指标。
  • 在文本分类或者基因数据分析中,Lasso 回归的特征选择功能特别有用,可以帮助识别最关键的词语或者基因。

12.2. Python 代码示例(Ridge vs Lasso 稀疏性)

完整代码:2.ridge.py

python 复制代码
import numpy as np
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.metrics import mean_squared_error

# 1. 造一组"高次多项式"数据(特征多、易过拟合)
np.random.seed(22)
x = np.random.uniform(-3, 3, size=100)
y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)

X = x.reshape(-1, 1)
X_poly = np.hstack([X ** i for i in range(1, 11)])   # 10 个高次特征

# 2. 普通线性回归(无正则,系数可能很大)
lr = LinearRegression().fit(X_poly, y)
print('Linear 系数:', lr.coef_)

# 3. Lasso(L1 正则:部分系数压缩为 0,做特征选择)
lasso = Lasso(alpha=0.1).fit(X_poly, y)
print('Lasso 系数:', lasso.coef_)          # 很多 0 → 稀疏解

# 4. Ridge(L2 正则:系数整体缩小,但不为 0)
ridge = Ridge(alpha=0.1).fit(X_poly, y)
print('Ridge 系数:', ridge.coef_)          # 都接近 0 但非 0

# 5. MSE 对比
print('Linear MSE:', mean_squared_error(y, lr.predict(X_poly)))
print('Lasso  MSE:', mean_squared_error(y, lasso.predict(X_poly)))
print('Ridge  MSE:', mean_squared_error(y, ridge.predict(X_poly)))

13. 逻辑回归分别是怎样处理二分类问题和多分类问题?

逻辑回归在处理二分类问题和多分类问题时采用了不同的策略:

  1. 对于二分类问题,逻辑回归使用的是Sigmoid函数,将输入特征线性组合经过Sigmoid函数映射到(0,1)区间,从而将输出解释为类别1的概率,如果概率大于0.5就预测为类别1,否则为类别0。
  2. 对于多分类问题,逻辑回归一般使用Softmax回归(也称为多项式逻辑回归,Multinomial Logistic Regression),它将线性组合经过Softmax函数映射到(0,1)的区间,同时保证各个类别的概率和为1。通过比较这些概率的大小来进行分类。

13.1. 扩展知识

13.1.1. Sigmoid函数与阈值决策

  1. 在二分类问题中,Sigmoid函数的公式:

σ(z)= 11+exp(−z) \sigma(z) = \frac{1}{1 + exp(-z)} σ(z)=1+exp(−z)1

其中 zz z 是输入特征的线性组合结果。以上函数会将任何实数 zz z 映射到 (0,1)(0,1) (0,1) 之间。

  1. 一般情况下,我们使用0.5作为阈值(也可以根据实际情况调整),如果概率大于0.5,则预测为类别1,否则为类别0。

13.1.2. Softmax函数与概率分布

  1. 在多分类问题中,我们使用Softmax函数,其公式为:

P(y=i∣x)= exp(wi⋅x+bi) ∑(exp(wj⋅x+bj)) P(y=i|x) = \frac{exp(w_i \cdot x + b_i)}{\sum \big(exp(w_j \cdot x + b_j)\big)} P(y=i∣x)=∑(exp(wj⋅x+bj))exp(wi⋅x+bi)

其中, wi w_i wi 和 bi b_i bi 是第 ii i 个类别的模型参数, xx x 是输入特征向量。Softmax函数会将多个线性组合的结果转换成多个概率值。

  1. Softmax函数的输出是一组和为1的概率值。这组概率值表示输入样本属于每个类别的概率。最终,我们选择具有最高概率的那个类别作为预测结果。

13.1.3. 损失函数的选择

  1. 二分类问题中通常使用的是对数似然损失函数(也称为逻辑损失函数),其公式为:

L(y,p)=−ylog⁡(p)+(1−y)log⁡(1−p)L(y, p) = -\bigy\\log(p) + (1-y)\\log(1-p)\\big L(y,p)=−ylog(p)+(1−y)log(1−p)

其中 yy y 是标签, pp p 是预测的概率。

  1. 多分类问题中使用的是交叉熵损失函数,其公式为:

L(y,p)=−∑yilog⁡(pi)L(y, p) = -\sum y_i \log(p_i) L(y,p)=−∑yilog(pi)

其中 yi y_i yi 是实际类别的指示值(one-hot编码), pi p_i pi 是预测的概率。

13.1.4. 优化算法

  1. 通常,我们使用**梯度下降(Gradient Descent)**来优化逻辑回归模型。对于小规模的数据集,可以使用批量梯度下降,对于大规模的数据集,可以考虑使用随机梯度下降(SGD)或小批量梯度下降(Mini-Batch Gradient Descent)。
  2. 逻辑回归模型的参数更新通过梯度计算和损失函数的反向传播来实现。

13.2. Python 代码示例(逻辑回归二分类)

完整代码:3.logistic_regression.py

python 复制代码
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, precision_score, recall_score, f1_score

# 1. 加载数据(乳腺癌:二分类 良性/恶性)
X, y = load_breast_cancer(return_X_y=True)

# 2. 划分训练集 / 测试集
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=22)

# 3. 标准化(逻辑回归对特征尺度敏感)
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)

# 4. 训练
model = LogisticRegression()
model.fit(x_train, y_train)

# 5. 预测 + 评估
y_pred = model.predict(x_test)
print('准确率:', accuracy_score(y_test, y_pred))
print('混淆矩阵:\n', confusion_matrix(y_test, y_pred))
print('精确率:', precision_score(y_test, y_pred))
print('召回率:', recall_score(y_test, y_pred))
print('F1:', f1_score(y_test, y_pred))

# 输出类别概率(Sigmoid 输出,介于 0~1)
print('预测概率:', model.predict_proba(x_test[:5]))

14. 在逻辑回归中是否需要使用交叉验证?为什么?

在逻辑回归中需要使用交叉验证。这是因为交叉验证可以帮助我们评估模型的稳定性和泛化能力。通过分割数据集并多次训练模型,可以更准确地评估模型在未见过的数据上的表现,从而防止模型过拟合或欠拟合,提高模型的可靠性。

14.1. 扩展知识

  1. 防止过拟合和欠拟合:

过拟合是指模型在训练数据上表现很好,但在测试数据上表现不好。欠拟合是指模型在训练数据和测试数据上均表现不佳。通过交叉验证,可以更好地了解模型的真实性能,因为它使用了多个不同的训练‑验证数据集组合。

  1. 模型选择:

交叉验证是一种选择最佳模型的好方法。通过比较不同模型的交叉验证得分,我们可以选择出表现最好的模型。例如,可以通过交叉验证来调节逻辑回归模型中的正则化参数,使其达到最佳效果。

  1. 提高模型鲁棒性:

交叉验证可以使模型更加鲁棒。因为它使用了多个不同的数据划分方式进行训练和验证,能更真实地反映模型在各种数据分布下的表现。

  1. 常见方法:
  • K折交叉验证:将数据集分为K个子集,每次使用一个子集作为验证集,剩余K‑1个子集作为训练集,重复K次,然后对K次验证结果取平均。
  • 留一法交叉验证:每次只留一个样本做验证集,剩下的样本做训练集,重复N次(N是样本数量),对N次结果取平均。
  • 随机切分验证:将数据集多次随机分为训练集和验证集,多次取平均。

15. 为什么逻辑回归采用交叉熵损失函数,而不是平方损失函数?

逻辑回归采用交叉熵损失函数,而不是平方损失函数,主要因为交叉熵损失函数相比平方损失函数更适合处理分类问题,能够更好地衡量模型输出的概率分布与真实标签之间的差距。更详细地说,交叉熵损失函数在计算时考虑了输入样本的概率分布 ,从而能够更准确地捕捉模型预测的置信度;而平方损失函数在处理离散分类问题时,无法很好地反映预测概率的分布情况,可能导致模型收敛速度慢、不稳定甚至不收敛。

15.1. 扩展知识

15.1.1. 交叉熵损失函数的优势

  • 概率分布匹配 :逻辑回归模型输出的是样本属于各个类别的概率,交叉熵损失函数能够直接度量预测概率分布与真实分布之间的差异,使得模型的优化目标更明确。
  • 数值稳定性 :交叉熵损失函数不仅在数值计算上更加稳定,而且在梯度更新时,也能避免平方损失函数可能出现的梯度消失问题。

15.1.2. 平方损失函数的局限性

  • 误差度量不适合分类:平方损失函数本身设计是为了度量连续值之间的误差,在分类问题中,输出的概率值与真实的0或1之间的差距并不能够很好地反映分类模型的性能。
  • 收敛问题:对于非线性、高维度的数据集,平方损失函数在逻辑回归中可能导致收敛速度较慢,甚至在优化过程中出现不收敛的情况。

15.1.3. 理论结合实践

  • 在实际使用中,将不同损失函数应用到不同的任务场景是非常关键的,对于分类问题尤其是像逻辑回归这样的模型,选择交叉熵损失函数是基于大量经验和理论基础的。
  • 如果你在实际项目中使用像TensorFlow或PyTorch等深度学习框架时,你会发现它们对于分类任务默认推荐使用交叉熵损失函数,这也从侧面说明了交叉熵损失函数的普及和重要性。

15.1.4. 数学推导

  • 对于二分类问题,交叉熵损失函数的形式为:

L=−y∗log(p)+(1−y)∗log(1−p)L = -\bigy \* log(p) + (1 - y) \* log(1 - p)\\big L=−y∗log(p)+(1−y)∗log(1−p)

其中, yy y是真实标签, pp p是模型预测的概率。这个形式直接源于最大似然估计原理,通过最小化负对数似然函数,我们在实际优化时得到了交叉熵损失。

  • 而平方损失函数形式为:

L= (y−p)22 L = \frac{(y - p)^2}{2} L=2(y−p)2

虽然有简单的形式,但对于离散的 yy y值(0或1),无法表征模型在概率预测上的准确度。

补充练习:二分类场景中,若某样本真实标签 y=1,模型预测 p=0.01 时,交叉熵损失值约为?

4.605

根据公式 L=-log (p),计算结果为(-\ln(0.01)\approx4.605)。

16. 逻辑回归:平方损失MSE 与 交叉熵(最大似然)梯度完整推导

16.1. 逻辑回归基础公式

  1. 线性得分 z=wTx+bz = \boldsymbol{w}^T\boldsymbol{x} + b z=wTx+b
  2. Sigmoid激活输出概率 p=σ(z)= 11+e−z p = \sigma(z) = \frac{1}{1+e^{-z}} p=σ(z)=1+e−z1
  3. Sigmoid导数核心恒等式 σ′(z)=σ(z)⋅(1−σ(z))=p(1−p)\sigma'(z) = \sigma(z)\cdot(1-\sigma(z)) = p(1-p) σ′(z)=σ(z)⋅(1−σ(z))=p(1−p)

16.2. 平方损失(MSE)梯度推导

16.2.1. 单样本MSE损失函数

LMSE =12(y−p)2 L_{MSE} = \frac12 (y-p)^2 LMSE=21(y−p)2

16.2.2. 对权重w链式求导

∂L∂w = ∂L∂p ⋅ ∂p∂z ⋅ ∂z∂w = ∂∂p 12(y−p)2 ⋅σ′(z)⋅x =−(y−p)⋅p(1−p)⋅x = (p−y)⋅p(1−p)⋅x \begin{align} \frac{\partial L}{\partial w} &= \frac{\partial L}{\partial p} \cdot \frac{\partial p}{\partial z} \cdot \frac{\partial z}{\partial w} \\ &= \frac{\partial}{\partial p}\left\\frac12(y-p)\^2\\right \cdot \sigma'(z) \cdot x \\ &= -(y-p) \cdot p(1-p) \cdot x \\ &= \boldsymbol{(p-y) \cdot p(1-p) \cdot x} \end{align} ∂w∂L=∂p∂L⋅∂z∂p⋅∂w∂z=∂p∂21(y−p)2⋅σ′(z)⋅x=−(y−p)⋅p(1−p)⋅x=(p−y)⋅p(1−p)⋅x

16.2.3. 关键结论

  1. 梯度核心项: (p−y) \boldsymbol{(p-y)} (p−y),也就是题目所说梯度更新方式为 p−yp-y p−y;
  2. 额外携带衰减因子 p(1−p)p(1-p) p(1−p): 当预测非常自信( p≈0p\approx0 p≈0 或 p≈1p\approx1 p≈1)时, p(1−p)≈0p(1-p)\approx0 p(1−p)≈0,梯度消失,参数几乎不更新;
  3. MSE作用在Sigmoid输出上,损失函数为非凸函数,优化易陷入局部最优。

16.3. 最大似然估计(逻辑回归原生目标)

16.3.1. 二分类概率表达式

伯努利分布:
P(y∣x)= { p, y=1 1−p, y=0 P(y|x)= \begin{cases} p, & y=1\\ 1-p, & y=0 \end{cases} P(y∣x)={p,1−p,y=1y=0

统一简写形式: P(y∣x)=py⋅(1−p)1−yP(y|x) = p^y \cdot (1-p)^{1-y} P(y∣x)=py⋅(1−p)1−y

16.3.2. 似然函数 & 对数似然

全体样本联合似然: L= ∏i=1N piyi (1−pi) 1−yi \mathcal{L} = \prod_{i=1}^N p_i^{y_i}(1-p_i)^{1-y_i} L=∏i=1Npiyi(1−pi)1−yi

取对数(乘积转求和,方便求导): log⁡L= ∑i=1N yilog⁡pi+(1−yi)log⁡(1−pi) \log\mathcal{L} = \sum_{i=1}^N \Bigy_i\\log p_i + (1-y_i)\\log(1-p_i)\\Big logL=∑i=1Nyilogpi+(1−yi)log(1−pi)

16.3.3. 等价为交叉熵损失

优化目标:最大化对数似然   ⟺  \iff 最小化负对数似然

负对数似然 = 二分类交叉熵损失: LCE =−ylog⁡p+(1−y)log⁡(1−p) L_{CE} = -\Bigy\\log p + (1-y)\\log(1-p)\\Big LCE=−ylogp+(1−y)log(1−p)

16.4. 交叉熵损失梯度推导(对比MSE)

∂ LCE ∂w = ∂ LCE ∂p ⋅σ′(z)⋅x =− (yp− 1−y1−p ) ⋅p(1−p)⋅x =−(y−p)⋅x = (p−y)⋅x \begin{align} \frac{\partial L_{CE}}{\partial w} &= \frac{\partial L_{CE}}{\partial p}\cdot \sigma'(z)\cdot x \\ &= -\left(\frac{y}{p} - \frac{1-y}{1-p}\right) \cdot p(1-p) \cdot x \\ &= -(y-p)\cdot x \\ &= \boldsymbol{(p-y)\cdot x} \end{align} ∂w∂LCE=∂p∂LCE⋅σ′(z)⋅x=−(py−1−p1−y)⋅p(1−p)⋅x=−(y−p)⋅x=(p−y)⋅x

16.4.1. 核心差异

交叉熵直接抵消了 p(1−p)p(1-p) p(1−p) 衰减项,梯度不会消失,更新稳定。

16.5. 为什么MSE梯度方向和最大似然目标不一致

  1. 底层优化目标不同
    • 交叉熵:等价最大似然,目标是最大化样本出现概率,完全贴合分类任务;
    • MSE:为回归任务设计,只衡量数值平方差,不衡量概率分布差异。
  2. 梯度形态差异
    • MSE梯度: (p−y)⋅p(1−p)⋅x(p-y) \cdot p(1-p) \cdot x (p−y)⋅p(1−p)⋅x,自带衰减,易梯度消失;
    • 交叉熵梯度: (p−y)⋅x(p-y)\cdot x (p−y)⋅x,无衰减,更新方向精准。
  3. 损失曲面凸性 MSE+Sigmoid构成非凸损失曲面,梯度下降容易卡在局部最优,无法收敛到最大似然对应的全局最优解。

16.6. 极简版

  1. MSE梯度带 p(1−p)p(1-p) p(1−p) 衰减,预测越准梯度越小,梯度消失;
  2. 最大似然 → 最小负对数似然 = 交叉熵,梯度干净无衰减;
  3. MSE优化目标不是概率最大化,梯度更新方向与分类底层目标不匹配。

最大似然估计(Maximum Likelihood Estimation, MLE)是一套通用参数求解思想

找一组模型参数,让观测到的这批训练数据发生的概率最大。

用到的场景举例

  1. 逻辑回归(二分类伯努利分布) 用MLE推导出交叉熵损失,就是上面这套公式;
  2. 线性回归(高斯正态分布) 假设误差服从正态分布,用最大似然推导出来,最后等价于MSE平方损失
  3. 朴素贝叶斯、高斯混合模型GMM、HMM隐马尔可夫 全部核心训练准则都是最大似然;
  4. 深度学习分类(Softmax多分类) 多分类交叉熵本质也是对多项式分布做最大似然估计。

17. 解释Sigmoid函数,以及它在逻辑回归中的作用。

Sigmoid 函数是一个数学函数,通常表示为 σ(x)=1/(1+e−x)\sigma(x)=1/(1+e^{-x}) σ(x)=1/(1+e−x),其输出范围在0到1之间。它的主要特点是能够将输入的实数值映射到0与1之间,这使得它非常适合用在二分类问题中。

在逻辑回归中,Sigmoid 函数的作用是将线性回归模型的输出(即线性组合后的结果)转化为一个概率值这个概率值表示样本属于某一类别的概率。具体来说,逻辑回归会使用 Sigmoid 函数来处理线性模型的结果,然后依据这个结果决定样本属于目标类别的概率。

17.1. 扩展知识

  1. Sigmoid 函数的性质
  • 平滑且连续:Sigmoid 函数光滑且可微,这意味着我们可以对其进行梯度下降优化。
  • 单调递增:随着输入的增加,输出值逐渐升高,但永远不到达0或1。
  • 对称性:Sigmoid 函数关于原点对称,并且在(x=0, y=0.5)处有一个转折点。
  1. 逻辑回归中的具体使用
  • 模型构建:逻辑回归首先通过线性回归模型得到一个线性组合值 Z = WX + b。
  • 概率映射:将这个 Z 值通过 Sigmoid 函数映射到 0,1 区间,得到 P(y=1|X) = σ(Z)。
  • 优化目标:通过最大化似然函数或者最小化二元交叉熵损失来优化逻辑回归模型的参数。
  1. 与其他激活函数比较
  • Tanh 函数:Tanh 也是常用的激活函数,输出范围在 -1 到 1 之间,能够处理数据的中心化,常用于神经网络。
  • ReLU 函数:ReLU(Rectified Linear Unit)函数在神经网络中使用广泛,处理非线性问题时有更好的梯度传递性能,但不常用于概率模型如逻辑回归中。
  1. 可能存在的缺点
  • 梯度弥散问题:Sigmoid 函数在极端值上的梯度接近于零,可能会导致梯度弥散,影响深层神经网络的训练效果
  • 非零中心化:Sigmoid 函数的输出不是零中心化的,当输入值为负时,输出值不会非常接近零,这可能导致收敛速度较慢。

Sigmoid 函数在什么情况下可能导致训练困难

正确选项,当输入值的绝对值很大时

错误选项,当输入值接近0时

18. KNN算法过程

KNN(K--Nearest Neighbors,K 近邻算法)是一个基于实例的监督学习算法,用于分类和回归任务。它的基本思路是:

  1. 对于给定的输入样本,KNN 算法会在训练集中找到与其最近的 K 个样本
  2. 在分类任务中,KNN 算法会选择这 K 个样本中出现最多的类别作为输入样本的预测类别 。在回归任务中,则会计算这 K 个最近样本的平均值或加权平均值作为输入样本的预测值

简而言之,KNN 算法的核心是根据离目标样本最近的 K 个点进行判断,无需显式地构建模型,仅依赖于训练数据的局部特性。

18.1. 扩展知识

  1. 计算距离:KNN 算法常用的距离度量方法是欧氏距离,但也可以使用其它距离度量方法如曼哈顿距离或闵可夫斯基距离。具体的距离选择可能会影响算法的效果,且通常和数据的尺度有关。
  2. 选择 K 值 :K 值的选择直接影响算法的表现。较小的 K 值(如 K=1)会使算法对训练数据非常敏感,容易过拟合较大的 K 值则会使算法具有更好的泛化能力,但可能导致欠拟合。一般需要通过交叉验证等方法来选择合适的 K 值。
  3. 数据归一化 :在计算距离时,不同特征的量级差异会影响结果,因此对特征进行归一化非常重要,以确保每个特征在距离计算中有相同的贡献。
  4. 计算复杂度KNN 算法的计算复杂度较高,特别是在高维数据上,因为它需要计算每个输入样本与训练集所有样本的距离。因此,KNN 算法在大数据集上的表现可能不尽如人意,一般需要借助 KD 树或 Ball 树等数据结构来加速查询过程。
  5. 优缺点 : a) 优点 :原理简单、容易实现;适用于非线性数据;不需要训练过程。 b) 缺点 :计算复杂度高;对异常值敏感;存储和记忆开销大。
  6. 应用场景:KNN 算法常用于文本分类、图像识别和推荐系统等任务,特别是当数据之间的距离度量比较明确且特征空间较稳定的情况下。

18.2. Python 代码示例(KNN 分类)

完整代码:4.knn.py

python 复制代码
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

X, y = load_iris(return_X_y=True)
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=22)

# KNN 依赖距离计算,必须先标准化(消除量纲影响)
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)

# 训练(KNN 是惰性学习:fit 只是"记住"数据,预测时才计算距离)
model = KNeighborsClassifier(n_neighbors=3)
model.fit(x_train, y_train)

# 预测:返回概率 + 类别
print('预测概率:', model.predict_proba(scaler.transform([[5.1, 3.5, 1.4, 0.2]])))
print('准确率:', accuracy_score(y_test, model.predict(x_test)))

19. KNN算法中多数投票的规则

在 KNN(K--近邻)算法中,多数投票规则是用来决定一个样本的分类标签。具体操作如下:

  1. 计算新样本与已知分类样本之间的距离
  2. 选择距离最小的前 K 个邻居
  3. 对这 K 个邻居的标签进行多数投票,即哪个类别的标签出现次数最多,新样本就被分到哪个类别。

19.1. 扩展知识

KNN 算法的重要特点是它是一种懒惰学习算法------即在训练数据阶段没有显式的建模过程,直接保存训练数据,在预测时才进行计算。因此,多数投票的方法显得格外直接且有效。

另外,KNN 算法在实际应用中,有两个关键点需要注意:

  1. 如何确定距离:最常用的是欧氏距离,但在不同的应用场景下,可以使用曼哈顿距离、切比雪夫距离等。
  2. 如何选择 K 值:K 值的选择非常讲究,选择过小的 K 值,容易过拟合;过大的 K 值,可能会包含太多的噪声,导致欠拟合。一般是通过交叉验证来确定一个合适的 K。

扩展 KNN 算法的一些高级技巧:

  1. 加权 KNN :在多数投票时,可以根据距离的远近赋予不同的权重,距离越近的邻居赋予更大的权重,这样分类效果可能会更好。
  2. 数据归一化:因为 KNN 算法依赖于距离来进行分类,所以特征值范围差异较大时需要进行归一化处理,以避免某些特征对距离计算造成过大的影响。

20. KNN算法中K的取值是如何确定的?

在 K 最近邻(K--Nearest Neighbors, KNN)算法中,K 的取值对模型的表现和预测结果有很大的影响。K 通常是通过实验来确定的。这一般可以通过交叉验证(Cross-Validation)的方法来选择一个最优的 K 值。简单来说,可以在训练集上进行多次实验,评估不同 K 值的模型性能,然后选择效果最好的那个 K 值。

例如,可以从 1 到 30 之间的整数里逐一尝试,计算每个 K 值对应的验证误差,最终选择使验证误差最小的 K 作为最终的参数。

21. 扩展知识

为了更详尽地理解和应用 K 的选择方法,这里有几个关键点需要注意:

  1. K 值的大小的影响
  • K 值太小:模型会过拟合数据,即模型在训练集上的性能可能很好,但在测试集上则很差。因为 K 值小,模型更倾向于被少数样本点所影响,从而忽略全局的趋势。
  • K 值太大:模型会欠拟合数据,即模型过于平滑,无法很好地捕捉数据的局部结构。它会使得远离目标点的样本也参与决策,导致模型对局部结构的敏感性降低。
  1. 奇数 K 值的建议 :一般来说,选择奇数的 K 值可以避免在分类任务中出现平局的情况(比方说二分类问题中,如果 K 是偶数,可能会出现一半一半的情况,那样不便于作决策)。

  2. 数据集的规模和分布

  • 样本数较多时,更大的 K 通常更好,因为可以更好地平滑噪声,从而得到更稳健的模型。
  • 样本数较少或数据分布不均匀时,较小的 K 值可能更好,因为选择的邻居更可能来自同一类别。
  1. 距离度量:KNN 是一个非参数方法,选择合适的距离度量(如欧氏距离、曼哈顿距离等)也会影响最终的效果。

  2. 加权KNN:有时候不仅仅考虑最近的 K 个邻居,还会根据距离向邻居加权。距离越近的邻居权重越大,这也可以缓解部分 K 值选择的问题。

  3. 特征缩放 :由于距离度量依赖于特征值的大小,因此在应用 KNN 前,通常需要对特征进行归一化处理,以确保所有特征对距离计算的贡献相似

22. KNN算法有一个显著的缺点,就是计算量太大,可以采用什么方式应对这个问题?

KNN(K‑近邻)算法的计算量大,主要在于它需要计算每个测试点与训练集中所有点的距离。当数据集非常大时,这种计算方式会耗费大量的时间和资源。为了应对这个问题,可以采用以下几种方式:

  1. 数据预处理和降维:用PCA(主成分分析)等技术减少数据的维度。
  2. 使用近似最近邻搜索算法,例如KD‑Tree或Ball‑Tree,提高查询效率。
  3. 采用并行计算或分布式计算,借助多核CPU或GPU来进行加速。
  4. 减少数据集大小,通过随机采样或其他抽样方法。

22.1. 扩展知识

  1. 数据预处理和降维
  • PCA(Principal Component Analysis):通过PCA,我们可以将高维特征数据投影到低维空间,从而减少计算量。这样做的前提是降维后的特征仍然能够较好地保留原数据的关键信息。
  • LDA(Linear Discriminant Analysis):如果我们有标记数据,可以用LDA,更好地分离不同类别的数据点。
  1. 使用近似最近邻搜索算法
  • KD‑Tree:一种多维搜索树,特别适用于低维数据的最近邻搜索。它将数据分割成树的结构,使得查询计算量显著减少。
  • Ball‑Tree:对于高维数据,KD‑Tree的效率会下降,这时Ball‑Tree是一种更好的选择。Ball‑Tree用多个超球体(Balls)进行空间分割,更适合高维空间中的点查询。
  • LSH(Locality‑sensitive hashing):将高维数据映射到低维 Hamming 空间,用于快速地找到近似最近邻。
  1. 并行计算和分布式计算
  • 多核CPU并行计算:通过多线程编程,使得多个距离计算能够并行进行,加速KNN算法的运行。
  • GPU加速:利用GPU的高并行计算能力,对距离计算进行加速处理。
  • MapReduce:在分布式系统如Hadoop中,通过MapReduce模型将KNN的计算任务分布到多个节点进行并行计算。
  1. 减少数据集大小
  • 下采样:从原始数据集中随机抽取一定比例的数据进行计算。虽然精度可能会有所下降,但计算速度显著提升。
  • 聚类方法:先对数据集进行聚类,然后在每个聚类中心附近进行近邻搜索,减少计算量。

每种方法都有其适用的场景和局限性,实际应用中需要结合具体情况选择合适的优化策略。

23. KNN算法是如何应对维度灾难的?

KNN(K--Nearest Neighbors)算法本身对"维度灾难"(Curse of Dimensionality)没有直接的应对措施。所谓的维度灾难,指的是随着数据维度的增加,数据点之间的距离在高维空间中变得不再具有区分度,进而影响算法的性能。KNN算法在高维空间中计算邻近点时,所有数据点之间的距离趋于相似,这会使得算法无法有效地区分不同类别的样本,导致精度下降。

23.1. 扩展知识

  1. 降维技术:既然KNN本身没有应对维度灾难的直接措施,但我们可以通过降维技术来预处理数据。常见的降维方法有:
  • PCA(主成分分析) :通过线性变换将数据映射到一个新的坐标系中,使得变换后的数据在新的坐标系中方差最大化,从而降低维度。
  • LDA(线性判别分析):通过分析数据类别之间的分离情况,找到一个能够最大程度区分不同类别的低维空间。
  1. 特征选择:对数据进行特征选择,保留对分类任务有意义的特征,去除冗余和无关的特征,可以有效减少维度,提高KNN在高维数据上的性能。
  • 过滤法:基于统计特征(如相关系数、信息增益等)进行特征选择。
  • 包裹法:使用一个学习模型对特征子集进行评价,选择性能最好的特征子集。
  • 嵌入法:在训练模型的过程中同时进行特征选择。
  1. 进行数据标准化:在高维数据中,不同维度的数据可能量级差异较大,对每个维度的数据进行标准化处理,将其转化为均值为0、方差为1的数据,有助于改善KNN的性能。

  2. 使用核方法 :通过核技巧(Kernel Trick)将数据映射到一个高维空间中,在这个高维空间中有更多的特征来区别数据点,然后再在这个高维空间中使用KNN算法。实际上,核方法常与支持向量机(SVM)结合更为常见,但同样的思想可以应用于KNN算法。

  3. 增大训练样本:在一定条件下,增大训练样本能够在一定程度上缓解维度灾难的问题,因为在高维空间中,更多的数据样本意味着更丰富的邻近信息,有助于分类。

24. KNN算法和K‑means算法有什么区别?

KNN算法和K‑means算法在应用和目的上有着明显的区别。KNN(K‑nearest neighbors,K近邻算法)是一个用于分类和回归的监督学习算法 ,而K‑means则是一个用于聚类分析的无监督学习算法

  1. KNN算法(K‑nearest neighbors,K近邻算法)
  • 类别:监督学习
  • 目的:分类或回归
  • 原理:给定一个待分类的新数据点,计算其与训练数据集中所有点的距离(通常是欧几里得距离),选择距离最近的K个点,根据这些点的类别,通过投票确定新数据点的类别。
  1. K‑means算法
  • 类别:无监督学习
  • 目的:聚类分析
  • 原理:将数据点分成K个簇(clusters),通过迭代优化过程将数据点分配到最接近的质心(centroid)。质心初始随机选择,每次迭代重新计算每个簇的质心,直到簇的分配不再改变或达到最大迭代次数。

24.1. 扩展知识

它们的工作原理及一些相关知识:

24.1.1. KNN算法的工作流程

  1. 选取参数K:选择一个合适的K值(临近点的数量)。
  2. 计算距离:对每个待分类的数据点,计算它与数据集中所有点的距离。
  3. 投票机制:选择距离最近的K个点,并通过多数投票方式确定待分类点的类别(分类任务)或计算这些点的平均值(回归任务)。
  4. 决策:将待分类点归入投票结果中票数最多的类别。

24.1.2. K‑means算法的工作流程

  1. 初始化:随机选择K个质心。
  2. 分配数据点:根据每个数据点与K个质心的距离,将数据点分配到距离最近的质心所属的簇中。
  3. 更新质心:重新计算每个簇的质心,质心为该簇所有数据点的平均值。
  4. 迭代:重复步骤2和3,直到簇分配不再变化或达到了预定义的迭代次数。

24.1.3. 应用场景和优缺点

  1. KNN算法
  • 优势
    • 实现简单,无需训练过程。
    • 对非线性数据有较好的适应性。
  • 劣势
    • 计算量大,内存消耗高,尤其在大数据集上。
    • 需要选择合适的K值和距离度量方法。
  • 应用场景
    • 图像识别
    • 推荐系统
  1. K‑means算法
  • 优势
    • 实现简单,收敛速度快。
    • 对大型数据集效果较好。
  • 劣势
    • 对初始质心敏感,可能收敛到局部最优解。
    • 需要预定义簇的数量K,且K的选择对结果影响较大。
  • 应用场景
    • 数据聚类分析
    • 图像分割

24.2. Python 代码示例(K-means 聚类)

完整代码:12.kmeans.py | 扩展(轮廓系数选K):12b.kmeans_silhouette.py

python 复制代码
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

# 造 4 簇数据
x, y = make_blobs(n_samples=1000, n_features=2,
                  centers=[[-1, -1], [4, 4], [8, 8], [2, 2]],
                  cluster_std=[0.4, 0.2, 0.3, 0.2])

# KMeans 训练 + 预测(fit_predict 一步完成)
model = KMeans(n_clusters=4, n_init='auto', random_state=42)
y_pred = model.fit_predict(x)

# 轮廓系数评估聚类质量(-1~1,越接近 1 越好)
print('轮廓系数:', silhouette_score(x, y_pred))
print('簇中心:\n', model.cluster_centers_)

25. 有哪些常见的方法度量点到中心的距离?

在机器学习中,常见的度量点到中心的距离的方法主要有几种,包括欧氏距离、曼哈顿距离、切比雪夫距离和余弦相似度等。

  1. 欧氏距离(Euclidean Distance) :这是最常见的距离度量方法。它计算的是两个点在空间中直线距离,公式为 d= ((x1−x2)2+(y1−y2)2+...+(zn−zm)2) d=\sqrt{((x1-x2)^2+(y1-y2)^2+...+(zn-zm)^2)} d=((x1−x2)2+(y1−y2)2+...+(zn−zm)2) 。
  2. 曼哈顿距离(Manhattan Distance) :也称为"城市街区"距离,它计算的是两个点在坐标轴上的绝对距离总和,公式为 d=∣x1−x2∣+∣y1−y2∣+...+∣zn−zm∣d=|x1-x2|+|y1-y2|+...+|zn-zm| d=∣x1−x2∣+∣y1−y2∣+...+∣zn−zm∣。
  3. 切比雪夫距离(Chebyshev Distance) :该距离计算的是在多维空间中维度间最大值,公式为 d=max⁡(∣x1−x2∣,∣y1−y2∣,...,∣zn−zm∣)d=\max(|x1-x2|,|y1-y2|,...,|zn-zm|) d=max(∣x1−x2∣,∣y1−y2∣,...,∣zn−zm∣)。
  4. 余弦相似度(Cosine Similarity) :不同于前面几种,余弦相似度主要用于文本或高维数据分析,计算的是两个向量之间的角度,公式为 cos⁡(θ)=(A⋅B)/(∥A∥∥B∥)\cos(\theta)=(A·B)/(\|A\| \|B\|) cos(θ)=(A⋅B)/(∥A∥∥B∥)。虽然名字是余弦相似度,但实际上它也可以通过 1−cos⁡(θ)1-\cos(\theta) 1−cos(θ) 转化为距离度量。

25.1. 扩展知识

这些距离度量方法的一些应用场景和特点:

  1. 欧氏距离 欧氏距离是最经典的距离度量方法之一,广泛用于各种机器学习算法如K均值聚类(K-means Clustering)、K近邻算法(K--Nearest Neighbors, KNN)等。它的优势在于直观,能直接反映点到点之间的直线距离。但是,对于高维数据,欧氏距离的效果可能不如低维数据,因为高维空间中点到点的距离变得越来越相似,也称为"维度灾难"。

  2. 曼哈顿距离 曼哈顿距离在一些特定的数据结构如网格或城市街道结构中表现更佳,因为它考虑了在不同维度上的距离贡献。例如,在路径规划问题中,机器人在网格地图中移动时,常常使用曼哈顿距离来衡量路径长短。其优点是受到变换和平移影响较小。

  3. 切比雪夫距离 切比雪夫距离在棋盘游戏中常被用来计算距离,比如在国际象棋中,一个车从一个方格移动到另一个方格的最大步数就是切比雪夫距离。它衡量的是最少在一个方向上的前进/后退步数。

  4. 余弦相似度 余弦相似度特别适合在文本分类和信息检索中。当需要比较高维稀疏向量(如词频向量)之间的差异时,余弦相似度能很好地度量向量间的夹角。另一个应用是用户和商品间的推荐系统,通过计算用户兴趣向量和商品特征向量的相似度来做推荐。

26. K‑means聚类中每个聚类中心的初始点如何选择?

在K‑means聚类算法中,初始聚类中心的选择是一个非常重要的步骤,直接影响到算法的最终结果和收敛速度。常见的方法有以下几种:

  1. 随机选择法:随机从数据集中选择 K 个点作为初始聚类中心。这是一种最常见、简单的选择方法,但可能导致结果不稳定。

  2. K‑means++算法:这是一种改进的初始化方法,通过一种概率分配方式选择初始中心点,能显著提高聚类效果。K‑means++算法的基本思路是:首先随机选择一个数据点作为第一个中心点,然后依次选择剩余的 K‑1 个中心,每次选择的概率与该点距离最近已选择中心点的平方成正比。这样可以确保中心点分布较为分散。

  3. 密度筛选法:按照某种密度函数(例如,核心密度或其他密度估计方法)选取密度最大的 K 个点作为初始聚类中心,可以有效地找到"代表性"较强的初始点。

  4. 先验知识法:根据领域的先验知识和经验,手动选取初始聚类中心。这种方法适用于对数据有较深入理解的情况。

26.1. 扩展知识

K‑means++ 是如何工作的,以及为什么它比随机选择更有效:

K‑means++ 通过一种贪心的启发式方法来选择初始点,具体步骤如下:

  1. 从数据集中随机选择一个点作为第一个中心点。
  2. 对于每个数据点(x),计算其与最近一个已经被选为中心点的距离(D(x))。
  3. 以(D(x)^2)为概率分布,选择下一个中心点。也就是说,距离现有中心点较远的数据点有更高的被选择概率,这样可以确保新的中心点尽可能远离现有的中心点。
  4. 重复步骤 2 和 3 直到选出 K 个初始中心点。

这种方法的优点在于:

  1. 多样性保证:通过概率分布选择中心点,能够使中心点尽可能分散,提高初始中心的多样性。
  2. 降低局部最小值概率:由于中心点较为分散,K‑means++ 能够更好地避免陷入局部最小值,提高了算法的稳定性和准确性。

K‑means++ 算法的复杂度为 O(k⋅n)O(k\cdot n) O(k⋅n),其中 (k)(k) (k) 是聚类数, (n)(n) (n) 是数据点数,与原始 K‑means 相比复杂度稍有增加,但在实际应用中,聚类效果通常会更好,值得选择。

27. 举个极简直观例子(K-means++)

目标:选 k=3 个初始中心,样本在一维数轴上: 样本点:1, 2, 4, 8, 9, 10

27.1. 第1步:随机挑第1个中心

假设随机选中 2

✅ 已选中心:{2}

27.2. 第2步:计算每个点的 D(x)(到最近已选中心的距离)+ 权重 D(x)2D(x)^2 D(x)2

  • 1: ∣1−2∣=1|1-2|=1 ∣1−2∣=1 → 权重 12=11^2=1 12=1
  • 2: ∣2−2∣=0|2-2|=0 ∣2−2∣=0 → 权重 00 0
  • 4: ∣4−2∣=2|4-2|=2 ∣4−2∣=2 → 权重 44 4
  • 8: ∣8−2∣=6|8-2|=6 ∣8−2∣=6 → 权重 3636 36
  • 9: ∣9−2∣=7|9-2|=7 ∣9−2∣=7 → 权重 4949 49
  • 10: ∣10−2∣=8|10-2|=8 ∣10−2∣=8 → 权重 6464 64

总权重 = 1+0+4+36+49+64=1541+0+4+36+49+64 = 154 1+0+4+36+49+64=154 抽样概率: P(x)= D(x)2154 P(x)=\frac{D(x)^2}{154} P(x)=154D(x)2

👉 10 的权重64最大,概率最高;离中心2很近的点几乎很难被抽到 假设这次抽样选中 10 ✅ 已选中心:{2, 10}

27.3. 第3步:再算D(x)(注意!D(x)是到【最近】已选中心的距离!)

  • 1:最近是2,距离1 → 权重1
  • 2:最近是2,距离0 → 权重0
  • 4:最近是2,距离2 → 权重4
  • 8:最近是10,距离2 → 权重4
  • 9:最近是10,距离1 → 权重1
  • 10:最近是10,距离0 → 权重0

总权重 = 1+0+4+4+1+0=101+0+4+4+1+0=10 1+0+4+4+1+0=10

候选里4 和 8 权重最高,优先被选中。

假设抽到 4

✅ 最终初始中心:{2, 10, 4}

27.4. 看结果

三个中心:2、4、10,互相分得很开,不会扎堆。

27.5. 反面:如果纯随机初始化会踩坑(对比理解)

同样数据,如果运气差,随机选出 {1,2,4}

三个点全部挤在左边小区间,右边 8,9,10 完全没有初始中心 → K-means 最后很容易分出很差的局部最优。

27.6. 一句话总结这个例子

K-means++ 给离现有中心更远的点更高采样权重,就是刻意规避"初始中心扎堆",优先选出分散的种子点。

28. 如何处理K-means中的空聚类?

在 K-means 算法中,空聚类指的是当某个聚类中心(centroid)没有任何数据点归属于它。这是可能发生的,尤其在初始化阶段或者某次迭代中。处理这种空聚类的常见方法有:

  1. 重新选择聚类中心:将产生空聚类的新中心重新选择。
  2. 选择最远的点:从数据集中选择距离其他聚类中心最远的点作为新的聚类中心。
  3. 选择某个聚类中的点:从拥有最多数据点的聚类中选择一个点(如均值或随机选择的点)作为新的聚类中心。

28.1. 扩展知识

K-means 算法虽然简单直观,但也有一些需要注意的地方和改进的方法。

  1. 初始化方法
  • K-means++:这是一个改进的初始化方法,通过预处理步骤来保证初始中心(centroid)尽量远离彼此,从而减少空聚类的出现概率。
  1. 处理异常数据
  • 有时异常点或者离群点会引起空聚类的发生。可以通过预处理数据,去除异常数据点来减小这种风险。
  1. 算法变种
  • K-medoids:与 K-means 相似,但使用数据集中实际点作为中心。这种方式较少出现一组数据无中心的情况。
  • Mini-batch K-means:这是 K-means 的一种变种,每次仅使用部分数据来更新聚类中心,有时可以更稳定地处理大规模数据。
  1. 后处理
  • 在 K-means 收敛之后,还可以通过一些后处理步骤来优化结果,比如重新分配少量数据点以平衡各类的分布,减少以上问题的影响。

29. K-means 是否会陷入一直寻找聚类中心的循环中?如果是,如何应对?

K-means 算法确实有可能陷入一直寻找聚类中心的循环中。这种情况主要发生在聚类结果不收敛的情况下,即在不断地重新分配数据点到最近的聚类中心后,聚类中心的位置来回变动,导致算法无法终止。

为了应对这种情况,我们可以采取以下几种措施:

  1. 设置最大迭代次数:通过限制算法的迭代次数,即使没有达到收敛条件,也能强制终止算法。
  2. 改变初始值:K-means 对初始聚类中心的选择较为敏感,所以多次运行算法,每次随机选择初始中心,然后选择表现最好的结果。
  3. 使用改进版的算法:例如 K-means++,它采用了一种巧妙的策略来选择初始聚类中心,以减少陷入循环的可能性。

30. ✅ 轮廓系数(Silhouette Coefficient)

一句话:无监督聚类的评估指标,用来衡量「簇内紧(A_2、A_3)簇间远」的程度,非常适合K-Means选K

取值范围: −1,1 \boldsymbol{-1, 1} −1,1

  • 接近1:聚类很好,同类紧密(A_2、A_3)异类分得开
  • 接近0:样本落在两个簇边界,划分模糊
  • 负数:大概率分错了,离别的簇更近

30.1. 公式(对单个样本i

s(i)= b(i) − a(i) max⁡( a(i) ,   b(i) ) s(i)=\frac{\boldsymbol{b(i)}-\boldsymbol{a(i)}}{\max\big(\boldsymbol{a(i)},\;\boldsymbol{b(i)}\big)} s(i)=max(a(i),b(i))b(i)−a(i)

  • a(i) \boldsymbol{\boldsymbol{a(i)}} a(i):簇内凝聚度 ------样本i到同簇其他所有点的平均距离(越小越好,自己人要近)
  • b(i) \boldsymbol{\boldsymbol{b(i)}} b(i):簇间分离度 ------样本i到最近的另一个簇里所有点的平均距离(越大越好,外人要远)

整体轮廓系数 = 所有样本 s(i)s(i) s(i)的平均值

30.2. 极简手工例子

假设只有6个点,K=2聚类:

  • 簇A: A1,A2,A3 A_1,A_2,A_3 A1,A2,A3
  • 簇B: B1,B2,B3 B_1,B_2,B_3 B1,B2,B3

我们单独算 A1 A_1 A1 的轮廓系数:

  1. a(A1) a(A_1) a(A1): A1 A_1 A1 到 A2, A3 A_2,\,A_3 A2,A3 的平均距离 假设 dist(A1,A2)=1,  dist(A1,A3)=1dist(A_1,A_2)=1,\;dist(A_1,A_3)=1 dist(A1,A2)=1,dist(A1,A3)=1 a=(1+1)/2=1a=(1+1)/2=1 a=(1+1)/2=1
  2. b(A1) b(A_1) b(A1): A1 A_1 A1 去算离它最近的**别的簇(B簇)**的平均距离 dist(A1,B1)=5,  dist(A1,B2)=6,  dist(A1,B3)=7dist(A_1,B_1)=5,\;dist(A_1,B_2)=6,\;dist(A_1,B_3)=7 dist(A1,B1)=5,dist(A1,B2)=6,dist(A1,B3)=7 b=(5+6+7)/3=6b=(5+6+7)/3=6 b=(5+6+7)/3=6
  3. 代入公式:

s= 6−1max⁡(1,6) =56≈0.83 s=\frac{6-1}{\max(1,6)}=\frac{5}{6}\approx \boldsymbol{0.83} s=max(1,6)6−1=65≈0.83

s=0.83s=0.83 s=0.83 很接近1 → 说明 A1 A_1 A1这个点聚类质量很好。

如果反过来, a=6,  b=1a=6,\;b=1 a=6,b=1,则 s=(1−6)/6≈−0.83s=(1-6)/6\approx-0.83 s=(1−6)/6≈−0.83,负数,代表这个点本该属于B簇,却被分到A簇,聚类失败


30.2.1. 💡 K-Means实战用法

我们尝试K=2、K=3、K=4分别跑K-Means,计算每个K对应的整体轮廓系数

  • K=2 → score=0.81
  • K=3 → score=0.42
  • K=4 → score=0.30 👉 优先选轮廓系数最大的K=2,这就是轮廓系数帮我们选K的典型场景。

30.3. Python极简Demo(sklearn)

完整代码:15.silhouette.py

python 复制代码
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

# 造数据
X, _ = make_blobs(n_samples=100, centers=2, random_state=42)
# KMeans聚类
kmeans = KMeans(n_clusters=2, random_state=42)
labels = kmeans.fit_predict(X)
# 计算轮廓系数
score = silhouette_score(X, labels)
print(score)

30.4. 补充

  1. 轮廓系数只能评估已有聚类划分,不是直接跑聚类;
  2. 计算开销大,大数据量慎用;
  3. 适合球形(A_2、A_3)等方差的簇(正好适配K-Means的偏好),对非凸簇(环形)效果差。

31. 解释高斯混合模型

高斯混合模型(Gaussian Mixture Model,简称GMM)是一种概率模型,用于表示具有多重高斯分布的样本数据。与K均值聚类(K-Means Clustering)不同的是,GMM认为数据点是从多个高斯分布中生成的,而不是简单地分成K个簇

GMM通过三个参数来定义每个高斯成分:

  1. 均值向量 (mean vector)
  2. 协方差矩阵 (covariance matrix)
  3. 混合系数 (mixing coefficient)

这些参数可以通过期望最大化算法(Expectation--Maximization,简称EM算法)进行估计。

简单来说,GMM是通过拟合模型来估计数据的概率分布,以便进一步进行数据分类和预测。

31.1. 扩展知识

  1. 高斯分布(Gaussian Distribution):
  • 高斯分布是一种连续概率分布,通常也叫做正态分布,呈现钟形曲线。定义两个参数:均值(mean)和方差(variance),描述曲线的中心位置和宽度。
  1. 期望最大化算法(EM算法):
  • EM算法是一种迭代方法,用于在具有潜在变量的概率模型中寻找参数的最大似然估计。它包含两个步骤:
    • E步(期望步):计算潜在变量的条件期望。
    • M步(最大化步):最大化参数以期望值为基础。
  1. 协方差矩阵(Covariance Matrix)
  • 协方差矩阵表示多元高斯分布中各个变量之间的线性关系 。对变量的组合提供信息:如果是对角矩阵,则表示各变量之间独立;非对角元素则表示变量之间的协方差
  1. 高斯混合模型的应用
  • GMM常用于数据聚类,但它比K均值具备更多的灵活性,因为它允许簇具有不同的形状和大小。GMM也可以用于密度估计和异常检测等任务。
  1. 优点与缺点
  • 优点:比K均值更灵活,能够处理不同形状的簇,允许重叠的簇
  • 缺点:由于是概率模型,对初始参数估计较敏感,可能会收敛到局部最优解。运行时间相对较长。

32. 介绍EM 算法

EM 算法(Expectation--Maximization Algorithm,期望最大化算法)是一种用于找出含有潜在变量或缺失数据的概率模型中参数估计的迭代方法。它在聚类、计算机视觉、自然语言处理等领域有广泛应用。简单来说,EM 算法包括两个步骤:期望步骤(E步)和最大化步骤(M步),反复迭代,直到模型收敛。

  1. E步:给定当前参数估计,计算数据的后验分布(即期望)
  2. M步:最大化参数,使得在 E步 中计算的期望下,模型的似然函数(log--likelihood)达到最大

32.1. 扩展知识

  1. 深入理解 E步和 M步:
  • E步(Expectation):这里的"期望"指的是期望Q函数,它是隐变量给定观测数据后的条件期望。简单来说,就是计算隐藏变量的分布。
  • M步(Maximization):在 M步中,通过最大化与参数相关的Q函数,来找到新的参数估计值。
  1. 应用场景: EM 算法非常适合用于处理含有缺失数据的问题,例如以下几种场景:
  • 高斯混合模型(GMM):这是 EM 算法最经典的应用场景之一,通过 GMM 可以对数据进行聚类分析。
  • 隐马尔可夫模型(HMM):在自然语言处理和时间序列分析中,EM 算法常用于 HMM 参数估计。
  • 缺失数据填补:例如,在医疗数据中可能存在缺失值,EM 算法可以用来估计这些缺失值。
  1. 收敛性 : EM算法并不保证能找到全局最优解,但它能保证每次迭代会增加或保持似然函数的值,所以经常能够达到局部最优解。在实际应用中,可以通过多次运行 EM 算法,并从不同的初始参数开始,以期获得更好的结果。

  2. 缺点和改进

  • 初值敏感性:EM算法对初始参数设置较为敏感,所以选择合理的初始值非常关键。
  • 计算复杂度:尽管 EM 算法每一步计算简单,但复杂度还是较高。为了解决这个问题,可以使用变分 EM 或随机 EM 等改进版本。

33. 概率密度函数

概率密度(probability density):连续型随机变量,在某一点附近「单位区间上的概率」

PDF = Probability Density Function

  • 中文:概率密度函数(用于【连续】随机变量)

PMF = Probability Mass Function

  • 中文:概率质量函数(用于【离散】随机变量)

顺带配套的:

  • CDF = Cumulative Distribution Function → 累积分布函数(离散、连续都能用)

一句话区分

  • Density 密度 → 连续,积分求概率
  • Mass 质量 → 离散,直接取值就是单点概率
分布 离散 / 连续 来源
伯努利 离散 PMF 二分类单次试验,概率定义直接整理得到
均匀分布 连续 PDF 先定义 "等密度",再用 ∫p(x)dx=1 归一化求出
高斯(正态) 连续 PDF 可由中心极限定理推导;也可直接作为模型假设使用(GMM)

33.1. 伯努利分布的概率质量函数

P(X=x)=px(1−p)1−x,x∈0,1P(X=x)=p^x(1-p)^{1-x},\quad x\in{0,1} P(X=x)=px(1−p)1−x,x∈0,1

33.2. 均匀分布

区间 (a,b)(a,b) (a,b) 上均匀分布 U(a,b)\mathcal{U}(a,b) U(a,b)
(p(x))= { 1b−a , a≤x≤b 0, 其他 (p(x))= \begin{cases} \displaystyle\frac{1}{b-a}, & a\le x\le b\\ 0, & \text{其他} \end{cases} (p(x))=⎩ ⎨ ⎧b−a1,0,a≤x≤b其他

33.3. 概率密度函数求出来的是概率吗

直接代入算出来的 PDF 值 ≠ 概率! PDF 在区间上积分(面积)= 概率

33.4. 核心公式

设概率密度 f(x)f(x) f(x)

  • ✅ 概率: P(a≤X≤b)= ∫ab f(x) dx \boldsymbol{P(a\le X\le b)=\int_a^b f(x)\,dx} P(a≤X≤b)=∫abf(x)dx(面积,才是真概率,0~1之间)
  • f(2)=0.7f(2)=0.7 f(2)=0.7 不代表 P(X=2)=0.7P(X=2)=0.7 P(X=2)=0.7 f(2)=0.7f(2)=0.7 f(2)=0.7 的含义:在x=2附近,单位长度上的概率浓度是0.7

连续随机变量单点概率: P(X=x)= ∫xx f(t)dt=0 \boldsymbol{P(X=x)=\int_x^x f(t)dt=0} P(X=x)=∫xxf(t)dt=0

33.5. 类比(质量密度)

  • 质量密度 ρ(x)\rho(x) ρ(x):某点密度值 ≠ 这点的质量
  • 一小段质量 = 密度 × 长度(积分)
  • 概率密度 f(x)f(x) f(x):某点密度值 ≠ 概率
  • 小区间概率 ≈ f(x)⋅Δxf(x)\cdot \Delta x f(x)⋅Δx( Δx\Delta x Δx 很小的时候近似)

33.6. 和离散的PMF对比(极易混淆)

  • 离散(伯努利、二项):PMF: P(X=x)P(X=x) P(X=x),直接算出来就是单点概率
  • 连续(正态、均匀):PDF: f(x)f(x) f(x),只是浓度,必须积分才是概率

33.7. 举个最简单例子:均匀分布 U(0,4)U(0,4) U(0,4)

f(x)= { 0.25, 0≤x≤4 0, 其它 f(x)= \begin{cases} 0.25,&0\le x\le4\\ 0,&\text{其它} \end{cases} f(x)={0.25,0,0≤x≤4其它

  • f(1)=0.25f(1)=0.25 f(1)=0.25 → 不是P(X=1)=0.25
  • P(1≤X≤2)=∫120.25dx=0.25P(1\le X\le2)=\int_1^2 0.25 dx=0.25 P(1≤X≤2)=∫120.25dx=0.25 ✅ 这个才是概率

33.8. 高频易错总结

  1. f(x)f(x) f(x) 可以大于1 !比如 U(0,0.5)U(0,0.5) U(0,0.5), f(x)=2f(x)=2 f(x)=2,完全合法,因为它只是密度,不是概率;
  2. 只有积分之后 的结果一定落在 0,10,1 0,1
  3. 只有离散分布的概率质量函数PMF,自变量取对应值时输出直接是概率。

33.9. 最简口诀

PDF本身是浓度,积分之后才是概率;单点连续概率恒为0。

34. GMM + EM 例子

34.1. 先用一句话讲清楚

  • EM 用来解决有隐变量的概率模型参数估计;
  • 在 GMM 里:隐变量 = 每个样本属于哪个高斯成分(我们不知道,要猜)
  • K-Means:硬分配 → 点直接归给某一簇
  • GMM+EM:软分配 → 点以概率属于各个高斯簇

EM 永远循环两步:

  1. E步(Expectation 期望步) :用当前参数,估算隐变量的后验概率(GMM里叫责任度γ:这个点有多大概率来自第k个高斯)
  2. M步(Maximization 最大化步) :用刚才算出的责任度,更新高斯的均值、协方差、混合系数,最大化似然 反复迭代直到参数变化很小。

34.2. 极简手工例子

设定: 数据:3个一维样本 x1=1,  x2=2,  x3=6 x_1=1,\;x_2=2,\;x_3=6 x1=1,x2=2,x3=6 GMM 设置 K=2 个高斯成分( G1,G2 G_1,G_2 G1,G2) 一维高斯: N(μ,σ2)\mathcal{N}(\mu,\sigma^2) N(μ,σ2) 隐变量:每个点来自 G1 G_1 G1 还是 G2 G_2 G2(未知)

34.2.1. 第0轮:先随便初始化参数(EM需要初值)

  • 混合系数: π1=0.5,  π2=0.5 \pi_1=0.5,\;\pi_2=0.5 π1=0.5,π2=0.5
  • 均值: μ1=1,  μ2=5 \mu_1=1,\;\mu_2=5 μ1=1,μ2=5
  • 方差: σ12=1,  σ22=1 \sigma_1^2=1,\;\sigma_2^2=1 σ12=1,σ22=1

一维高斯概率密度: p(x)= 1 2π σ exp⁡ (− (x−μ)22σ2 ) p(x)=\frac{1}{\sqrt{2\pi}\sigma}\exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right) p(x)=2π σ1exp(−2σ2(x−μ)2)

34.2.2. ✅ E步:算责任度 γik \gamma_{ik} γik = 样本 ii i来自第 kk k个高斯的后验概率

γik = πk  N(xi∣μk,σk2) π1N(xi∣μ1,σ12)+π2N(xi∣μ2,σ22) \gamma_{ik}=\frac{\pi_k\;\mathcal{N}(x_i|\mu_k,\sigma_k^2)}{\pi_1\mathcal{N}(x_i|\mu_1,\sigma_1^2)+\pi_2\mathcal{N}(x_i|\mu_2,\sigma_2^2)} γik=π1N(xi∣μ1,σ12)+π2N(xi∣μ2,σ22)πkN(xi∣μk,σk2)

x1=1 x_1=1 x1=1 举例:

  • N(1∣μ1=1,σ12=1)≈0.3989 \mathcal{N}(1|\mu_1=1,\sigma_1^2=1)\approx0.3989 N(1∣μ1=1,σ12=1)≈0.3989
  • N(1∣μ2=5,σ22=1)≈0.000134 \mathcal{N}(1|\mu_2=5,\sigma_2^2=1)\approx0.000134 N(1∣μ2=5,σ22=1)≈0.000134

γ11= 0.5×0.39890.5×0.3989+0.5×0.000134 ≈0.9997,γ12≈0.0003 \gamma_{11}=\frac{0.5\times0.3989}{0.5\times0.3989+0.5\times0.000134}\approx0.9997,\quad \gamma_{12}\approx0.0003 γ11=0.5×0.3989+0.5×0.0001340.5×0.3989≈0.9997,γ12≈0.0003

👉 x1 x_1 x1 几乎确定来自 G1 G_1 G1

同理算出:

  • x2=2 x_2=2 x2=2: γ21≈0.841,  γ22≈0.159 \gamma_{21}\approx0.841,\;\gamma_{22}\approx0.159 γ21≈0.841,γ22≈0.159
  • x3=6 x_3=6 x3=6: γ31≈0.0003,  γ32≈0.9997 \gamma_{31}\approx0.0003,\;\gamma_{32}\approx0.9997 γ31≈0.0003,γ32≈0.9997

✅ E步本质:用当前模型,猜每个点归属各个簇的概率(软标签)

34.2.2.1. ✅ M步:用上面的γ,更新GMM全部参数

一维GMM更新公式:
Nk=∑i γik ,πk= NkN N_k=\sum_i \gamma_{ik},\quad \pi_k=\frac{N_k}{N} Nk=i∑γik,πk=NNk
μk= 1Nk ∑i γik  xi \mu_k=\frac{1}{N_k}\sum_i \gamma_{ik}\,x_i μk=Nk1i∑γikxi
σk2= 1Nk ∑i γik (xi−μk)2 \sigma_k^2=\frac{1}{N_k}\sum_i \gamma_{ik}(x_i-\mu_k)^2 σk2=Nk1i∑γik(xi−μk)2

计算:

N1=γ11+γ21+γ31≈0.9997+0.841+0.0003=1.841 N_1=\gamma_{11}+\gamma_{21}+\gamma_{31}\approx0.9997+0.841+0.0003=1.841 N1=γ11+γ21+γ31≈0.9997+0.841+0.0003=1.841

N2=γ12+γ22+γ32≈0.0003+0.159+0.9997=1.159 N_2=\gamma_{12}+\gamma_{22}+\gamma_{32}\approx0.0003+0.159+0.9997=1.159 N2=γ12+γ22+γ32≈0.0003+0.159+0.9997=1.159
π1=1.8413≈0.614,π2=1.1593≈0.386 \pi_1=\frac{1.841}{3}\approx0.614,\quad \pi_2=\frac{1.159}{3}\approx0.386 π1=31.841≈0.614,π2=31.159≈0.386
μ1= γ11⋅1+γ21⋅2+γ31⋅6 N1 ≈ 0.9997×1+0.841×2+0.0003×61.841 ≈1.46 \mu_1=\frac{\gamma_{11}\cdot1+\gamma_{21}\cdot2+\gamma_{31}\cdot6}{N_1}\approx\frac{0.9997\times1+0.841\times2+0.0003\times6}{1.841}\approx1.46 μ1=N1γ11⋅1+γ21⋅2+γ31⋅6≈1.8410.9997×1+0.841×2+0.0003×6≈1.46
μ2= γ12⋅1+γ22⋅2+γ32⋅6 N2 ≈ 0.0003×1+0.159×2+0.9997×61.159 ≈5.45 \mu_2=\frac{\gamma_{12}\cdot1+\gamma_{22}\cdot2+\gamma_{32}\cdot6}{N_2}\approx\frac{0.0003\times1+0.159\times2+0.9997\times6}{1.159}\approx5.45 μ2=N2γ12⋅1+γ22⋅2+γ32⋅6≈1.1590.0003×1+0.159×2+0.9997×6≈5.45
σ12= γ11(1−μ1)2+γ21(2−μ1)2+γ31(6−μ1)2 N1 \sigma_1^2=\frac{\gamma_{11}(1-\mu_1)^2+\gamma_{21}(2-\mu_1)^2+\gamma_{31}(6-\mu_1)^2}{N_1} σ12=N1γ11(1−μ1)2+γ21(2−μ1)2+γ31(6−μ1)2

代入:
σ12≈ 0.9997×(1−1.46)2+0.841×(2−1.46)2+0.0003×(6−1.46)21.841 \sigma_1^2\approx\frac{0.9997\times(1-1.46)^2+0.841\times(2-1.46)^2+0.0003\times(6-1.46)^2}{1.841} σ12≈1.8410.9997×(1−1.46)2+0.841×(2−1.46)2+0.0003×(6−1.46)2
= 0.9997×0.2116+0.841×0.2916+0.0003×20.61161.841 =\frac{0.9997\times0.2116+0.841\times0.2916+0.0003\times20.6116}{1.841} =1.8410.9997×0.2116+0.841×0.2916+0.0003×20.6116
= 0.2115+0.2452+0.00621.841 ≈0.46291.841≈0.251 =\frac{0.2115+0.2452+0.0062}{1.841}\approx\frac{0.4629}{1.841}\approx0.251 =1.8410.2115+0.2452+0.0062≈1.8410.4629≈0.251
σ22= γ12(1−μ2)2+γ22(2−μ2)2+γ32(6−μ2)2 N2 \sigma_2^2=\frac{\gamma_{12}(1-\mu_2)^2+\gamma_{22}(2-\mu_2)^2+\gamma_{32}(6-\mu_2)^2}{N_2} σ22=N2γ12(1−μ2)2+γ22(2−μ2)2+γ32(6−μ2)2

代入:
σ22≈ 0.0003×(1−5.45)2+0.159×(2−5.45)2+0.9997×(6−5.45)21.159 \sigma_2^2\approx\frac{0.0003\times(1-5.45)^2+0.159\times(2-5.45)^2+0.9997\times(6-5.45)^2}{1.159} σ22≈1.1590.0003×(1−5.45)2+0.159×(2−5.45)2+0.9997×(6−5.45)2
= 0.0003×19.8025+0.159×11.9025+0.9997×0.30251.159 =\frac{0.0003\times19.8025+0.159\times11.9025+0.9997\times0.3025}{1.159} =1.1590.0003×19.8025+0.159×11.9025+0.9997×0.3025
= 0.0059+1.8925+0.30241.159 ≈2.20081.159≈1.899 =\frac{0.0059+1.8925+0.3024}{1.159}\approx\frac{2.2008}{1.159}\approx1.899 =1.1590.0059+1.8925+0.3024≈1.1592.2008≈1.899

注意: σk2 \sigma_k^2 σk2 用的是更新后的 μk \mu_k μk(M步里先算均值、再拿新均值算方差),这是标准顺序。
✅ M步本质:相信刚才E步算出的软标签,重新拟合最优高斯参数

34.2.3. 🔁 循环

拿着新的 π1,π2,μ1,μ2,σ12,σ22 \pi_1,\pi_2,\mu_1,\mu_2,\sigma_1^2,\sigma_2^2 π1,π2,μ1,μ2,σ12,σ22,再跑一轮E步 → M步......

直到 μ,σ,π\mu,\sigma,\pi μ,σ,π 变化很小,收敛停止。


34.3. 🆚 和K-Means对比

  • K-Means:E步等价硬分配 (γ只能是0或1),M步求簇中心;可以理解成EM的特例
  • GMM+EM:软分配,γ是0~1之间概率,还能学协方差,簇可以椭圆、重叠

34.4. ⚠️ EM核心

  • EM用于含隐变量的极大似然估计;
  • E步固定参数、求隐变量后验期望;
  • M步固定隐变量分布、更新参数最大化似然;
  • GMM里隐变量就是样本所属高斯成分。

34.5. Python小Demo(可直接运行看GMM+EM)

完整代码:16.gmm_em.py

python 复制代码
from sklearn.mixture import GaussianMixture
import numpy as np

X = np.array([[1],[2],[6]])
gmm = GaussianMixture(n_components=2, random_state=1)
gmm.fit(X)
# 输出每个样本属于两个高斯的概率(就是E步的γ)
print(gmm.predict_proba(X))
print("均值:", gmm.means_)
print("混合系数:", gmm.weights_)

35. 几种常见的分布

分布 类型 核心含义 典型例子
伯努利 离散 1 次试验,0 或 1 一次投篮是否命中
二项 离散 n 次伯努利,成功 k 次 投 10 球,进球总数
几何 离散 直到第一次成功所需试验次数 反复投篮,直到投进,一共投多少次
泊松 离散 单位时间/空间内事件发生次数 1 小时来电数量
指数 连续 相邻两次事件的间隔(泊松过程间隔) 等到下一通电话的时间

35.1. 补充一句区分几何 vs 指数

  • 几何:离散,按「试验次数」计数(第几次才成功)
  • 指数:连续,按「时间/距离」计数(要等多久才来下一个事件)

几何 = 指数的离散版本;几何同样自带无记忆性,所以它也是k=1(第一次就成功)概率最大,和指数x→0密度最高是同源直觉。
几何有两种常见定义,注意区分: ① 包含首次成功那次: X=1,2,3...X=1,2,3\dots X=1,2,3... ② 只算失败次数: X=0,1,2...X=0,1,2\dots X=0,1,2...

35.2. 公式汇总(PDF / PMF + 均值 + 方差)

35.2.1. 离散分布(用概率质量函数 PMF)

分布 概率质量函数 (PMF) 均值 方差
Bernoulli(p)Bernoulli(p) Bernoulli(p) 伯努利分布 P(X=1)=p,  P(X=0)=1−pP(X=1)=p,\;P(X=0)=1-p P(X=1)=p,P(X=0)=1−p pp p p(1−p)p(1-p) p(1−p)
Binomial(n,p)Binomial(n,p) Binomial(n,p) 二项分布 (nk) pk(1−p)n−k,  k=0,1,...,n \displaystyle\binom{n}{k}p^k(1-p)^{n-k},\;k=0,1,\dots,n (kn)pk(1−p)n−k,k=0,1,...,n npnp np np(1−p)np(1-p) np(1−p)
Geometric(p)Geometric(p) Geometric(p) 几何分布 p(1−p)k−1,  k=1,2,...p(1-p)^{k-1},\;k=1,2,\dots p(1−p)k−1,k=1,2,... 1p \dfrac{1}{p} p1 1−pp2 \dfrac{1-p}{p^2} p21−p
Poisson(λ)Poisson(\lambda) Poisson(λ) 泊松分布 λke−λk! ,  k=0,1,2,... \dfrac{\lambda^k e^{-\lambda}}{k!},\;k=0,1,2,\dots k!λke−λ,k=0,1,2,... λ\lambda λ λ\lambda λ

35.2.2. 连续分布(用概率密度函数 PDF)

分布 概率密度函数 (PDF) 均值 方差
Uniform(a,b)Uniform(a,b) Uniform(a,b) 均匀分布 1b−a ,  x∈a,b \dfrac{1}{b-a},\;x\ina,b b−a1,x∈a,b a+b2 \dfrac{a+b}{2} 2a+b (b−a)212 \dfrac{(b-a)^2}{12} 12(b−a)2
Gaussian(μ,σ2)Gaussian(\mu,\sigma^2) Gaussian(μ,σ2) 高斯分布 1 2πσ2 exp⁡ ⁣ (− (x−μ)22σ2 ) \dfrac{1}{\sqrt{2\pi\sigma^2}}\exp\!\left(-\dfrac{(x-\mu)^2}{2\sigma^2}\right) 2πσ2 1exp(−2σ2(x−μ)2) μ\mu μ σ2\sigma^2 σ2
Exponential(λ)Exponential(\lambda) Exponential(λ) 指数分布 λe−λx,  x≥0,  λ>0\lambda e^{-\lambda x},\;x\ge 0,\;\lambda>0 λe−λx,x≥0,λ>0 1λ \dfrac{1}{\lambda} λ1 1λ2 \dfrac{1}{\lambda^2} λ21

⚠️ 离散 vs 连续关键区别:PMF 直接算出来就是单点概率( P(X=k)∈0,1P(X=k)\in0,1 P(X=k)∈0,1);PDF 只是浓度,单点概率为 0,必须积分才是真概率。

36. 贝叶斯定理(Bayes' Theorem)

36.1. 一句话讲清楚

贝叶斯定理回答的核心问题是:「已知某个结果 B 发生了,反推原因 A 的概率是多少」------即由果推因。
P(A∣B)= P(B∣A)  P(A)P(B) P(A|B) = \frac{P(B|A)\;P(A)}{P(B)} P(A∣B)=P(B)P(B∣A)P(A)

其中 P(B)P(B) P(B) 由全概率公式展开:
P(B)=P(B∣A)P(A)+P(B∣Aˉ)P(Aˉ)P(B) = P(B|A)P(A) + P(B|\bar{A})P(\bar{A}) P(B)=P(B∣A)P(A)+P(B∣Aˉ)P(Aˉ)

36.2. 公式各部分含义

符号 名称 含义 通俗理解
P(A)P(A) P(A) 先验概率 事件 A 本身发生的概率 没看到证据前,对 A 的「初始判断」
P(B∥A)P(B\|A) P(B∥A) 似然 A 发生时 B 发生的概率 A 是真相时,产生 B 这个证据的概率
P(B)P(B) P(B) 证据概率 B 发生的总概率 无论哪种原因,B 发生的整体概率
P(A∥B)P(A\|B) P(A∥B) 后验概率 看到 B 后,A 发生的概率 拿到证据 B 后,对 A 的「修正判断」

核心思想:后验 ∝ 先验 × 似然 。用新证据 BB B,把对 AA A 的信念从先验 P(A)P(A) P(A) 更新到后验 P(A∣B)P(A|B) P(A∣B)。

36.3. 经典示例:疾病检测(反直觉的 50%)

题目: 某种疾病患病率为 1%( P(患病)=0.01P(患病)=0.01 P(患病)=0.01)。 检测试剂:患病者测出阳性概率 99%(灵敏度),未患病者误测为阳性概率 1%(假阳性率)。 问:某人检测呈阳性,他真正患病的概率是多少?

直觉答案往往是"99%",实际算出来却是约 50%

AA A = 患病, BB B = 检测阳性,则 Aˉ \bar{A} Aˉ = 未患病。

已知:

  • P(A)=0.01P(A)=0.01 P(A)=0.01, P(Aˉ)=0.99 P(\bar{A})=0.99 P(Aˉ)=0.99
  • P(B∣A)=0.99P(B|A)=0.99 P(B∣A)=0.99(灵敏度)
  • P(B∣Aˉ)=0.01 P(B|\bar{A})=0.01 P(B∣Aˉ)=0.01(假阳性率)

第一步,先算证据概率 P(B)P(B) P(B)(全概率公式):
P(B)=P(B∣A)P(A)+P(B∣Aˉ)P(Aˉ)P(B)=P(B|A)P(A)+P(B|\bar{A})P(\bar{A}) P(B)=P(B∣A)P(A)+P(B∣Aˉ)P(Aˉ)
=0.99×0.01+0.01×0.99=0.0099+0.0099=0.0198=0.99\times0.01+0.01\times0.99=0.0099+0.0099=0.0198 =0.99×0.01+0.01×0.99=0.0099+0.0099=0.0198

第二步,套贝叶斯公式:
P(A∣B)= P(B∣A)P(A)P(B) = 0.99×0.010.0198 =0.00990.0198=0.5P(A|B)=\frac{P(B|A)P(A)}{P(B)}=\frac{0.99\times0.01}{0.0198}=\frac{0.0099}{0.0198}=0.5 P(A∣B)=P(B)P(B∣A)P(A)=0.01980.99×0.01=0.01980.0099=0.5

结论:检测阳性后,真正患病概率只有约 50%。

为什么反直觉?因为患病率(先验)极低,只有 1%。即便检测 99% 准,在 10000 人里:

  • 真患病者约 100 人,其中 99 人测出阳性;
  • 未患病者约 9900 人,其中 99 人(1%)被误测为阳性。
  • 阳性总数 99 + 99 = 198 人,真正患病的只有 99 人 → 99/198=50%99/198=50\% 99/198=50%。

这就是基础比率(base rate)对后验概率的巨大影响------脱离先验谈后验,是直觉陷阱。

36.4. 练习题

36.4.1. 练习题 1:吸烟与疾病

某城市 30% 的人是吸烟者。吸烟者患某病的概率是 10%,不吸烟者患该病的概率是 3%。

(1) 随机抽查一人,他患该病的概率是多少?

(2) 已知某人患该病,他是吸烟者的概率是多少?

解:

AA A = 吸烟, BB B = 患病。

已知: P(A)=0.3P(A)=0.3 P(A)=0.3, P(Aˉ)=0.7 P(\bar{A})=0.7 P(Aˉ)=0.7, P(B∣A)=0.10P(B|A)=0.10 P(B∣A)=0.10, P(B∣Aˉ)=0.03 P(B|\bar{A})=0.03 P(B∣Aˉ)=0.03

(1) 全概率公式:
P(B)=0.10×0.3+0.03×0.7=0.03+0.021=0.051P(B)=0.10\times0.3+0.03\times0.7=0.03+0.021=0.051 P(B)=0.10×0.3+0.03×0.7=0.03+0.021=0.051

✅ 随机一人患病概率为 5.1%

(2) 贝叶斯公式:
P(A∣B)= P(B∣A)P(A)P(B) = 0.10×0.30.051 =0.030.051≈0.588P(A|B)=\frac{P(B|A)P(A)}{P(B)}=\frac{0.10\times0.3}{0.051}=\frac{0.03}{0.051}\approx0.588 P(A∣B)=P(B)P(B∣A)P(A)=0.0510.10×0.3=0.0510.03≈0.588

✅ 已知患病,是吸烟者的概率约为 58.8%


36.4.2. 练习题 2:真假硬币

盒子里有两枚外观相同的硬币:A 是正常硬币(正面概率 50%),B 是双正面硬币(正面概率 100%)。

随机摸出一枚,投掷一次得到「正面」。问:摸到的是 B(双正面)的概率?

解:

BB B = 摸到双正面硬币, AA A = 摸到正常硬币, HH H = 投出正面。

已知: P(A)=P(B)=0.5P(A)=P(B)=0.5 P(A)=P(B)=0.5, P(H∣A)=0.5P(H|A)=0.5 P(H∣A)=0.5, P(H∣B)=1P(H|B)=1 P(H∣B)=1
P(H)=P(H∣A)P(A)+P(H∣B)P(B)=0.5×0.5+1×0.5=0.25+0.5=0.75P(H)=P(H|A)P(A)+P(H|B)P(B)=0.5\times0.5+1\times0.5=0.25+0.5=0.75 P(H)=P(H∣A)P(A)+P(H∣B)P(B)=0.5×0.5+1×0.5=0.25+0.5=0.75
P(B∣H)= P(H∣B)P(B)P(H) = 1×0.50.75 =0.50.75=23≈0.667P(B|H)=\frac{P(H|B)P(B)}{P(H)}=\frac{1\times0.5}{0.75}=\frac{0.5}{0.75}=\frac{2}{3}\approx0.667 P(B∣H)=P(H)P(H∣B)P(B)=0.751×0.5=0.750.5=32≈0.667

✅ 投出一次正面后,是双正面硬币的概率为 2/3


36.4.3. 练习题 3(进阶):三门问题(蒙提霍尔)

有三扇门,其中一扇后面有汽车(奖品),另外两扇后面是山羊。你先选一扇门(不打开)。

主持人知道汽车在哪,他会从你没选 的两扇门里,打开一扇一定是山羊 的门,然后问你:要不要换成剩下那扇未开的门?

结论:应该换,换门中奖概率 2/3,不换只有 1/3。

贝叶斯角度理解:

  • 你最初选的那扇门有汽车的概率 P(A)=1/3P(A)=1/3 P(A)=1/3(先验,一直不变,因为主持人不会动你这扇门)。
  • 剩下两扇门加起来有汽车的概率是 2/32/3 2/3。
  • 主持人打开一扇山羊门后,那 2/32/3 2/3 的概率全部集中到剩下那扇未开的门上。
  • 所以换门 = 拿 2/32/3 2/3 的概率,不换 = 保持 1/31/3 1/3。

反直觉根源:主持人「必须打开一扇山羊门」这个动作泄露了信息------他不是随机开门,而是有选择地开,所以会改变剩下那扇门的后验概率。

37. 描述支持向量机(svm)的基本思想和应用场景

支持向量机(Support Vector Machine, SVM)是一种用于分类和回归的监督学习算法,它在寻找最佳超平面使得类别间的间隔最大化。基本思想是通过在高维空间中找到一个线性决策边界(超平面)来分类数据,而对于非线性可分情况,通过核函数将数据映射到更高维空间,使其在该空间中变得线性可分。

37.1. 扩展知识

  1. 基本概念:
  • 超平面:在特征空间(即数据所在的高维空间)中,一个超平面就是一个维度比空间的维度低一维的平面。
  • 支持向量:距离超平面最近的那些数据点,这些点对定义超平面的位置起着重要作用。
  • 间隔:指的是支持向量到超平面的距离,SVM的目标是最大化这个间隔。
  • 核函数:对于非线性数据,SVM使用核函数(如多项式核、高斯核等)将数据映射到高维空间,这样数据在高维空间中就可能变得线性可分。
  1. 优化问题: SVM实际上是在解决一个优化问题,寻找能够使间隔最大的超平面。这可以通过求解拉格朗日乘子和用支持向量的方法来实现。

  2. 应用场景:

  • 文本分类:SVM在文本分类和垃圾邮件检测中广泛使用,因为它在处理高维数据(如词向量)时非常有效。
  • 图像分类:SVM也常用于图像分类任务,尤其是当数据量不是非常大时。
  • 生物信息学:用于基因分类和蛋白质结构预测等。
  • 人脸识别:SVM可以有效地应用于人脸识别系统,通过提取高维特征并分类。
  1. 优缺点:
  • 优点:SVM在高维空间中的有效性、能够处理非线性数据的能力、使用不同的核函数实现灵活的分类。
  • 缺点:SVM在大规模数据集上的性能可能不理想,尤其是当数据不能拟合到模型中时,训练时间可能会很长。
  1. 算法流程:
  2. 选择合适的核函数,将数据映射到高维空间。
  3. 通过训练数据找寻能够最大化间隔的决策超平面。
  4. 使用找到的超平面对新数据进行分类。

37.2. Python 代码示例(SVM 线性核 vs RBF 核)

完整代码:7.svm.py

python 复制代码
from sklearn.datasets import load_iris, make_moons
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC, SVC
from sklearn.metrics import accuracy_score

# ============ 案例一:线性 SVM(鸢尾花二分类) ============
X, y = load_iris(return_X_y=True)
x, y = X[y < 2], y[y < 2]            # 只取前两类,做二分类
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=42)

scaler = StandardScaler()             # SVM 对尺度敏感,必须标准化
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)

model = LinearSVC(C=10, dual='auto')  # C 越大,越不允许误分类(软间隔越硬)
model.fit(x_train, y_train)
print('LinearSVC 准确率:', accuracy_score(y_test, model.predict(x_test)))

# ============ 案例二:RBF 核(月牙形非线性数据) ============
x, y = make_moons(noise=0.15, random_state=42)   # 非线性可分数据
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=42)

# gamma 越大,决策边界越复杂(越容易过拟合)
svc = SVC(kernel='rbf', gamma=1.0)   # 试试 gamma=100 会明显过拟合
svc.fit(x_train, y_train)
print('RBF SVC 准确率:', accuracy_score(y_test, svc.predict(x_test)))

38. svm可以处理多分类吗?

SVM(支持向量机)可以处理多分类问题。尽管SVM本质上是一个二分类模型,但我们可以通过一些策略将其转变为多分类器,最常用的方法有"一对多"(One-vs-Rest)和"一对一"(One-vs-One)策略。

38.1. 扩展知识

  1. 一对多方法(One-vs-Rest, OvR) : 这种方法是将多分类问题划分为多个二分类问题。具体来说,假设我们有N类,那么我们会训练 N 个 SVM 模型。每个模型的任务是将某一个类与所有其他类区分开来。预测阶段,我们对一个样本进行 N 次预测,选择得分最高的那个类作为最终结果。
  • 优点:简单且容易实现
  • 缺点:如果数据集类间不均衡,会导致模型对某类的偏好。
  1. 一对一方法(One-vs-One, OvO) : 这种方法是将多分类问题划分为多个两两分类问题。具体来说,假设我们有 N 类,那么我们会训练 N*(N-1)/2 个 SVM 模型。每个模型的任务是将两类区分开来。预测阶段,我们对一个样本进行 N*(N-1)/2 次预测,进行投票,选择票数最多的那个类作为最终结果。
  • 优点:在处理类间不平衡时效果较好
  • 缺点:训练阶段计算量大,需要训练大量模型。
  1. 核方法(Kernel Method): SVM 的另一个重要特性是它可以使用核方法将数据映射到高维空间,使其在该空间中可分。这在处理复杂分类问题时非常有用。
  • 常用核函数:线性核、RBF(径向基函数)核、sigmoid核等。
  1. 实际应用: SVM 被广泛应用于图像分类、文本分类和生物信息学等领域。特别是在小样本、高维数据的情境下,SVM 的表现尤为突出。

  2. Python 实现: 在实际操作中,我们可以使用 Python 的 scikit-learn 库来实现 SVM 多分类。例如,使用 SVC 中的 decision_function_shape 参数来选择 OvR 还是 OvO 方法。

完整代码:7b.svm_multiclass.py

python 复制代码
from sklearn import svm
from sklearn import datasets
from sklearn.model_selection import train_test_split

# 加载数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 创建 SVM 模型,使用一对一策略
model = svm.SVC(decision_function_shape='ovo')
model.fit(X_train, y_train)

# 进行预测
y_pred = model.predict(X_test)

# 评价模型
from sklearn.metrics import accuracy_score
print("Accuracy:", accuracy_score(y_test, y_pred))

39. 软间隔和硬间隔有什么区别?

软间隔和硬间隔是支持向量机(SVM)中的两个重要概念,它们主要区别在于处理数据点的方式。具体来说:

  1. 硬间隔:要求所有数据点严格在线性可分的情况下,完全被正确分类,并且没有任何数据点落在间隔边界上或堆积到错误一侧。这意味着硬间隔对数据的要求很高,只有当数据完全线性可分时才能使用。
  2. 软间隔:允许部分数据点落在间隔边界内或者被错误分类。软间隔通过引入松弛变量,对不满足严格分类条件的数据点进行惩罚,从而在非线性可分的数据中也可以使用。这种方法可以兼顾模型的容量,避免过拟合。

39.1. 扩展知识

硬间隔和软间隔之间的区别不仅仅在于是否严格分类,还涉及到模型的泛化能力和适用场景。以下是一些相关的知识点:

  1. 适用场景
  • 硬间隔适用于那些数据确实是完全线性可分的情况,但在实际生活中,这种数据分布非常少见。
  • 软间隔更为常用,因为它允许处理那些包含噪声或误差的数据集,通过引入惩罚系数C来平衡优化目标和模型的复杂度。
  1. 松弛变量(Slack Variables)
  • 对于软间隔,我们引入松弛变量 ( ξi \xi_i ξi (xi, 即 slack variables),用于度量每个数据点 i 的违反间隔条件的程度。目标函数中会添加这部分的惩罚项,松弛变量越大,惩罚系数也越大。
  1. 优化问题
  • 硬间隔的优化问题是一个约束条件下的二次规划问题,目标是最大化间隔(保持分类器对输入感觉敏锐)。
  • 软间隔的优化问题则更多涉及惩罚项的加权,目标是同时最小化误分类错误和间隔大小
  1. 核函数(Kernel Function)
  • 在实际应用中,很多数据并不是线性可分的,硬间隔完全不能应对。因此,通过使用核函数,SVM 可以在高维空间中实现非线性分类。这使得软间隔与核技巧结合,更为实用。
  1. 泛化能力
  • 使用硬间隔可能导致过拟合,因为它严格追求在训练数据上的完全准确分类。
  • 软间隔通过允许一定的错误分类,可以让模型更好地适应未知的数据,提高泛化能力。

40. svm 与感知机有什么区别?

SVM(Support Vector Machine)和感知机都是用于分类问题的线性模型,但它们在优化目标和处理方法上有显著区别。

  1. 优化目标:感知机的目标是找到一个可以正确分类所有训练样本的超平面,而SVM的目标则不仅仅是正确分类,还要最大化分类超平面的间隔(即在其间的"安全区")。
  2. 处理方法:感知机使用的是梯度下降法来不断调整权重直到分类正确,而SVM使用的是二次规划(Quadratic Programming)来优化目标函数,寻找最优解。
  3. 收敛性:感知机只在训练数据线性可分的情况下收敛,且可能在噪声较大的数据上表现不稳定;SVM则不但能处理线性不可分的问题(通过引入软间隔和核函数来转换更高维空间),还在理论上具有更好的泛化性能。

40.1. 扩展知识

这两种算法的具体细节和它们在实际应用中的表现:

  1. 感知机(Perceptron)
  • 历史背景:感知机是神经网络的最早模型之一,由Rosenblatt在1958年提出。
  • 算法步骤 :感知机通过逐样本调整权重来最小化分类错误。其核心是一个线性分类器: f(x)=sign(w⋅x+b)f(x) = \text{sign}(w \cdot x + b) f(x)=sign(w⋅x+b)。
  • 局限性:在数据线性不可分时,感知机会陷入无穷循环,无法收敛。另外对噪声较敏感。
  1. 支持向量机(SVM)
  • 发展背景:SVM由Vladimir Vapnik和他的同事在1992年提出,是一种基于统计学习理论的强大分类器。
  • 最大化间隔:SVM通过找到"支持向量"从而最大化分类间隔,以提升模型的鲁棒性和泛化能力。
  • 核函数:SVM通过核函数将数据映射到更高维度,以处理线性不可分问题。常用核函数有线性核、多项式核、RBF核等。
  • 软间隔:引入松弛变量,允许一定程度的误分类来平衡对噪声的敏感度。
  1. 实际应用中的选择
  • 感知机的使用:感知机常用在小规模、线性可分的问题上,而且通常作为基础算法用于教学和理论展示。
  • SVM的使用:由于其强大的泛化能力和对复杂决策边界的处理能力,SVM广泛应用于文本分类、人脸识别和生物信息等领域。特别是在高维空间下表现尤为突出。
  1. 实现代码方面
  • 感知机:实现相对简单,只需编写调整权重的循环和条件判断。
  • SVM:实现较为复杂,通常借助外部库如Scikit-Learn,它们内部实现了高效的二次规划算法和核技巧,方便调用。

41. 简单说说核函数的原理

核函数的原理在于将数据从低维空间映射到高维空间,使得在高维空间中,数据分布更容易被直线或超平面分开。主要应用于支持向量机(SVM)及一些其他的机器学习算法中。

41.1. 扩展知识

  1. 高维映射 在很多现实问题中,数据在原始的低维空间中并不是线性可分的。核函数通过一种非线性映射,将数据从低维空间映射到高维空间。在高维空间中,数据可能变得线性可分,从而利于分类器的构建。

  2. 计算优化 直接计算高维映射后的点的内积是非常耗时且不实际的。核函数可以在不显式计算映射后点坐标的情况下,计算这些点在高维空间的内积。这种技巧使得核函数的运用既高效又实用。

  3. 常用核函数

  • 线性核: K(xi,xj)=xi⋅xj K(x_i,x_j) = x_i \cdot x_j K(xi,xj)=xi⋅xj
  • 多项式核: K(xi,xj)=(xi⋅xj+c)d K(x_i,x_j) = (x_i \cdot x_j + c)^d K(xi,xj)=(xi⋅xj+c)d
  • 高斯核(RBF核): K(xi,xj)=exp(−γ∣∣xi−xj∣∣2) K(x_i,x_j) = exp(-\gamma||x_i - x_j||^2) K(xi,xj)=exp(−γ∣∣xi−xj∣∣2)
  • Sigmoid核: K(xi,xj)=tanh(αxi⋅xj+c) K(x_i,x_j) = tanh(\alpha x_i \cdot x_j + c) K(xi,xj)=tanh(αxi⋅xj+c)
  1. 应用场景 不仅支持向量机使用核函数,在很多其他机器学习算法中,核技巧也被广泛应用,比如核主成分分析(KPCA)、核岭回归等。它们通过核函数来提升算法在非线性问题上的表现能力。

  2. 技巧原则 在选择核函数时,并没有硬性规定一定要选择某种核,通常根据具体的数据分布和问题需求,先尝试几种常见的核函数,再通过实际效果(如交叉验证)的比较,选出表现最优的。

42. svm 有哪些核函数?分别应用于哪些场景中?

SVM(Support Vector Machine)是一种常用的监督学习算法,用于分类和回归。SVM 中的核函数(Kernel Function)非常重要,因为它们可以将低维空间中的数据映射到高维空间,使得在高维空间中更容易找到一个线性可分的超平面。常见的核函数包括:

  1. 线性核函数(Linear Kernel)
  2. 多项式核函数(Polynomial Kernel)
  3. 高斯核函数/径向基函数核(Gaussian Kernel/Radial Basis Function, RBF Kernel)
  4. Sigmoid核函数(Sigmoid Kernel)

不同的核函数适用于不同的数据特性和场景:

  1. 线性核函数:适用于线性可分的数据集,计算复杂度低,适合大规模的数据集。
  2. 多项式核函数:适用于数据特征之间存在多项式关系的情况。
  3. RBF核函数:适用于数据分布较复杂或者线性不可分的数据集,经常被作为默认选择。
  4. Sigmoid核函数:在某些神经网络应用中有一定使用,类比于神经元的激活函数。

42.1. 扩展知识

  1. 线性核函数:
  • 公式: K(x,y)=xTyK(x,y) = x^Ty K(x,y)=xTy
  • 应用场景:当数据本身已经是线性可分的,可以直接使用线性核函数省去了映射到高维空间的计算开销。这种情况常见于文本分类和线性回归中。
  1. 多项式核函数:
  • 公式: K(x,y)=(γxTy+r)dK(x,y) = (\gamma x^Ty + r)^d K(x,y)=(γxTy+r)d
  • 其中, γ\gamma γ、 rr r 和 dd d 是用户指定的参数。
  • 应用场景:当数据关系复杂且存在多项式关系 时,多项式核函数很有用。比如,在自然语言处理中的一些复杂分类问题。参数 d 可以决定多项式的次度,控制决策边界的复杂性。
  1. RBF核函数(高斯核函数):
  • 公式: K(x,y)=exp(−γ∣∣x−y∣∣2)K(x,y) = exp(-\gamma||x - y||^2) K(x,y)=exp(−γ∣∣x−y∣∣2)
  • 其中, γ\gamma γ 是用户指定的参数。
  • 应用场景:当数据本身并不线性可分或者分布较为复杂时,RBF核函数通常能提供优良的表现。由于这一特点,RBF 核函数经常作为默认的选择 γ\gamma γ 参数会影响到模型的复杂度, γ\gamma γ 值越大,模型越容易过拟合
  1. Sigmoid核函数:
  • 公式: K(x,y)=tanh(γxTy+r)K(x,y) = tanh(\gamma x^Ty + r) K(x,y)=tanh(γxTy+r)
  • 应用场景:Sigmoid 核函数在某些情况下类似于神经网络中的激活函数,因此在某些神经网络应用或生物信息学应用中可能会用到。不过,它在 SVM 中应用较少,因为它容易在某些情况下出现非正定而导致训练失败。

43. svm 在应用高斯核时需要对特征进行归一化吗?

在使用支持向量机(SVM)并应用高斯核(也称径向基函数(RBF)核)时,通常需要对特征进行归一化。归一化能够使得所有特征在相同的尺度下,从而避免某些特征对模型造成过大的影响。

43.1. 扩展知识

  1. 归一化的重要性:特征归一化能够使不同特征在相同量级,消除量纲的影响。高斯核中的距离计算(如欧几里得距离)特别容易受到特征量级的影响。如果不归一化,大量级的特征可能会主导距离计算,使得模型的性能下降。

  2. 归一化方法:常见的归一化方法包括最小‑最大归一化和标准化。

  • 最小‑最大归一化:将特征值缩放到一个固定范围(通常是0到1或‑1到1),公式为: (X−Xmin⁡)/(Xmax⁡−Xmin⁡) \displaystyle (X - X_{\\min})/(X_{\\max}-X_{\\min}) (X−Xmin)/(Xmax−Xmin)
  • 标准化:将特征值转换为具有0均值和单位方差的标准正态分布,公式为: (X−μ)/σ \displaystyle (X - \\mu)/\\sigma (X−μ)/σ,其中 (μ)(\mu) (μ)是均值, (σ)(\sigma) (σ) 是标准差。
  1. 特征归一化的实现 :在实际项目中,可以使用Python库如 scikit‑learn 中的 StandardScalerMinMaxScaler 来轻松实现特征归一化。这确保了代码的可读性和可维护性。

举个例子,使用scikit‑learn中的 StandardScaler 进行标准化:

python 复制代码
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_normalized = scaler.fit_transform(X)
  1. 其他核函数的适用性:虽然高斯核特别依赖于特征归一化,但对于SVM中其他核函数(如线性核、多项式核等),归一化也同样是推荐的。有助于提升模型的稳定性和性能。

44. 简单描述朴素贝叶斯的算法流程

朴素贝叶斯算法的流程其实非常简洁,主要包括以下几个步骤:

  1. 数据预处理:将数据集分为训练集和测试集。
  2. 特征选择:从训练集中提取特征,并将它们转换成特征向量。
  3. 计算先验概率:计算每个类别的先验概率,这实际上就是各个类别在训练集中出现的频率。
  4. 计算条件概率:对训练数据中的每个特征,计算其在各种类别下的条件概率。
  5. 应用贝叶斯公式:对每个待分类样本,利用贝叶斯公式计算其属于各个类别的后验概率。
  6. 分类决策 :将待分类样本归入后验概率最大的类别。

44.1. 扩展知识

朴素贝叶斯算法虽然简单,但其中蕴含了很多数学思想,值得深入理解。

  1. 首先,朴素贝叶斯之所以被称为"朴素",是因为它假设特征之间是相互独立的。虽然这个假设在实际中常常不成立,但理论和实践证明,朴素贝叶斯即使在特征相关性较高的情况下,仍然能给出令人满意的结果。

  2. 贝叶斯定理是朴素贝叶斯算法的核心。贝叶斯定理告诉我们如何利用先验概率和似然估计来更新我们的信念,即后验概率 。公式为: P(Y∣X)= P(X∣Y)⋅P(Y)P(X) P(Y|X) = \frac{P(X|Y) \cdot P(Y)}{P(X)} P(Y∣X)=P(X)P(X∣Y)⋅P(Y) 在实际应用中, P(X)P(X) P(X) 对所有类别是相同的,所以可以忽略它

  3. 在计算条件概率时,常会遇到某些特征值在训练集中未出现的情况,此时会导致条件概率变为0,使得整个乘积也为0。为了解决这个问题,通常引入拉普拉斯平滑(Laplace Smoothing),即在计算频率时加上一个小的正数,避免零概率的情况

  4. 最后,朴素贝叶斯分类器在文本分类、垃圾邮件过滤、情感分析 等任务中表现尤为出色,部分原因是频率分布往往遵循朴素贝叶斯的独立假设

45. 朴素贝叶斯常见的分类模型是什么?

常见的朴素贝叶斯分类模型有高斯朴素贝叶斯、多项式朴素贝叶斯和伯努利朴素贝叶斯。

  1. 高斯朴素贝叶斯(Gaussian Naive Bayes)

这种模型用于特征值服从高斯(正态)分布 的情况。它通常应用于连续数据 ,比如在图像处理、传感器数据处理中,如果数据满足正态分布假设,效果会很好。

  1. 多项式朴素贝叶斯(Multinomial Naive Bayes)

这种模型适用于表示出现次数的离散数据 ,特别适合文档分类任务 ,像文本分类和自然语言处理中的词频特征。比如,在垃圾邮件检测中,电子邮件中的单词出现频率可以作为特征输入到多项式朴素贝叶斯模型中。

  1. 伯努利朴素贝叶斯(Bernoulli Naive Bayes)

这种模型针对的是二分类特征,即特征只能取0或1,表示某个特征是否存在。这在文档分类中也很常见,例如判断某个单词在文档中是否出现。

45.1. 扩展知识

朴素贝叶斯模型利用贝叶斯定理和特征条件独立假设进行分类决策,非常高效。尽管假设特征之间相互独立在现实中可能不成立,但在很多实践中朴素贝叶斯模型表现良好,特别是对于高维数据和小数据样本

再扩展一下,可以谈些应用:

  1. 文本分类
  • 朴素贝叶斯在电子邮件分类(是否垃圾邮件)、情感分析(测定评论是正面还是负面)方面都有显著应用。由于它处理大规模文本数据的速度快且效果好,所以在自然语言处理领域非常受欢迎。
  1. 推荐系统
  • 在一些简单的推荐系统中,朴素贝叶斯可以用来推荐用户可能喜欢的商品或内容。
  1. 医疗诊断
  • 在一些医疗诊断中,可以通过朴素贝叶斯模型对病症进行快速分类,例如基因表达数据的癌症分类。

45.2. Python 代码示例(朴素贝叶斯三种模型)

完整代码:11.naive_bayes.py

python 复制代码
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB, MultinomialNB, BernoulliNB
from sklearn.metrics import accuracy_score

X, y = load_iris(return_X_y=True)
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=22)

# 1. 高斯朴素贝叶斯:连续特征(假设特征服从正态分布)
gnb = GaussianNB()
gnb.fit(x_train, y_train)
print('GaussianNB 准确率:', accuracy_score(y_test, gnb.predict(x_test)))

# 2. 多项式朴素贝叶斯:离散词频特征(文本分类首选)
from sklearn.feature_extraction.text import CountVectorizer
texts = ['I love this movie', 'I hate this movie', 'great film love it', 'boring film hate it']
labels = [1, 0, 1, 0]
vectorizer = CountVectorizer()
X_text = vectorizer.fit_transform(texts)     # 稀疏词频矩阵
mnb = MultinomialNB().fit(X_text, labels)
print('MultinomialNB 预测:', mnb.predict(vectorizer.transform(['I love this great movie'])))

# 3. 伯努利朴素贝叶斯:二值特征(只关心"出现/不出现")
bnb = BernoulliNB().fit(X_text, labels)
print('BernoulliNB 预测:', bnb.predict(vectorizer.transform(['I love this great movie'])))

46. 朴素贝叶斯中的零概率问题是什么?如何应对?

朴素贝叶斯中的零概率问题是指在计算后验概率时,如果某个特征值在训练数据中没有出现,则该特征值的概率会被计算为0 。由于贝叶斯公式中包含了特征值的概率乘积,只要一个特征值的概率为0,那么整体公式的结果也会为0,这会导致预测结果不准确。

为应对这个问题,通常使用拉普拉斯平滑(Laplace Smoothing),即在计算概率时人为地在所有可能的特征值上加上一个虚拟计数 。具体公式为: P(xi∣C)= count(xi,C)+1count(C)+∣V∣ P(x_i|C) = \frac{count(x_i,C)+1}{count(C)+|V|} P(xi∣C)=count(C)+∣V∣count(xi,C)+1 其中, (∣V∣)(|V|) (∣V∣) 是可能特征值的总数。

46.1. 扩展知识

进一步来看,零概率问题源于朴素贝叶斯假设特征独立,但实际数据往往并不完全独立,且训练数据有限,难以确保每种特征值都出现过。拉普拉斯平滑通过在每种可能的特征值上加1,可以避免零概率的问题。

在实际应用中,还可以使用其他平滑技术,如:

  1. 加权平滑(Weighted Smoothing):根据特征的重要性或频率分布,进行比例调整。
  2. Dirichlet平滑(Dirichlet Smoothing) :一种更为灵活的平滑方法,通过引入超参数灵活调整,但计算较复杂

同时,要强调,除了平滑处理之外,你还可以通过扩大训练集、特征选择和数据预处理等方法,从根本上减少特征值取0的情况。

47. 为什么朴素贝叶斯是高偏差低方差?

朴素贝叶斯是一种简单且强大的分类算法,其之所以被认为是高偏差低方差,主要是因为它在估计学习过程中做出了非常强的独立性假设,即假设所有特征都是独立的。这种假设过于严格,往往会导致模型不能很好地拟合训练数据 ,从而产生高偏差。但是,由于这种简单性,它在测试数据上却表现得非常稳定,不容易受训练数据的扰动影响,因此具有低方差的特性。

47.1. 扩展知识

  1. 高偏差(High Bias)的解释 : 朴素贝叶斯假设特征之间是条件独立的,这在大多数实际问题中是不成立的。比如,在文本分类中,同一个句子里多个词之间往往存在相关性,因此这种独立性假设过于强硬,导致模型难以捕捉到数据中的复杂关系。这种情况下,模型表现出高偏差,即在训练数据和测试数据上的错误率都较高。

  2. 低方差(Low Variance)的解释 : 由于朴素贝叶斯的模型简单,参数较少,即使对不同的训练集进行训练,模型的变化也不会很大。这意味着朴素贝叶斯不容易被过拟合所困扰,当我们使用不同的训练数据集进行训练,最终得到的模型之间差异不会很大。因此,朴素贝叶斯表现出低方差,即模型对训练数据的敏感度较低,能够较好地泛化到不同的测试数据集。

  3. 模型复杂度与偏差‑方差权衡 : 在机器学习中,模型复杂度与偏差‑方差权衡是一个经常被讨论的话题。朴素贝叶斯算法正处于简单模型的范畴,简单模型通常具有高偏差低方差的特点。这和复杂模型(如深度神经网络、高阶多项式回归等)的高方差低偏差形成了鲜明对比。复杂模型往往能够很好地拟合训练数据,但容易过拟合,从而表现出高方差。

  4. 实际应用中的优势 : 尽管朴素贝叶斯算法有高偏差,但在许多实际应用中,它能够快速提供一个基线模型,特别是在文本分类、垃圾邮件过滤等场景中表现突出 。其快速、简单的特点使得它成为大规模数据处理中一种非常有效的算法。

  5. 调优和改进 : 为了提高朴素贝叶斯算法的表现,可以尝试对特征进行预处理(如特征选择、降维等)或者结合其他模型(如混合模型、集成学习等)来改善性能。但需要注意的是,这样做可能会增加模型的复杂度,从而影响其低方差的优点。

48. 朴素贝叶斯如何应对高度相关的特征

使用朴素贝叶斯分类器时,假设了所有特征之间是条件独立的,这意味着朴素贝叶斯并不直接考虑特征之间的相关性。然而,当特征之间呈高度相关时,朴素贝叶斯可能会产生次优的分类效果。尽管它的独立性假设不完全符合实际情况,但在许多实际应用中,朴素贝叶斯分类器依然能够提供一个相对不错的结果。

48.1. 扩展知识

下面从以下几个角度来扩展朴素贝叶斯在处理高度相关特征时可能面对的问题以及如何改进:

  1. 特征选择与提取:我们可以通过特征选择或特征提取来减少特征的维度,去除一些冗余的或高度相关的特征。常用的方法包括PCA(主成分分析)和LDA(线性判别分析)。
  2. 使用贝叶斯网络:贝叶斯网络是一种较为复杂的模型,它用有向无环图表示变量之间的条件依赖关系,这样可以更好地捕捉特征间的相关性。
  3. 结合其他算法:在实践中,我们通常会将朴素贝叶斯与其他机器学习算法结合使用,比如集成方法(袋装和提升),或者配合使用如逻辑回归或支持向量机等算法,来弥补朴素贝叶斯处理多重共线性不足的问题。
  4. 交叉验证与模型评估:通过交叉验证来评估模型的表现,确保其能够在独立的评估数据上表现良好,即使在特征高度相关的情况下。交叉验证可以帮助我们发现模型是否过拟合或欠拟合,从而进一步进行模型调整。

49. 说说构造决策树的步骤

构建决策树的步骤主要包括以下几个步骤:

  1. 特征选择:选择一个最优特征来进行划分。常见的选择方法有信息增益、信息增益率和基尼指数。
  2. 划分数据集:根据选择的特征将数据集分成多个子集,每个子集对应一个特征的取值。
  3. 递归构建子树:对子集递归地进行特征选择和数据集划分,直到满足停止条件。
  4. 确定叶节点:当无法继续划分时,将当前节点转换为叶节点,并赋予类别标签。

49.1. 扩展知识

下面是构建决策树的每一步,以及一些相关知识点和优化方法:

  1. 特征选择
  • 信息增益(Information Gain):通过计算某一特征划分数据前后的信息熵变化 来确定特征的重要性,信息增益越大,特征越重要 。通常使用ID3算法
  • 信息增益率(Gain Ratio):是对信息增益的改进,考虑了特征取值的数量问题。通常使用C4.5算法
  • 基尼指数(Gini Index):通过计算样本的不纯度 来度量特征的重要性,基尼指数越小,特征越好 。通常使用CART算法
  1. 划分数据集
  • 数据集的划分是基于选定的特征值进行的,将数据集按照特征的不同取值划分成多个子集。
  1. 递归构建子树
  • 对每个子集,重复特征选择和数据集划分的过程,直到满足停止条件。
  1. 确定叶节点
  • 当所有数据属于同一类别,或没有更多特征可供选择,或某预设的停止条件(如树的深度、最小样本数等)达到时,停止递归,并将当前节点标记为叶节点。

此外,还有一些需要注意的问题和优化的措施:

  1. 剪枝(Pruning)
  • 在构建决策树时,可能会产生过拟合,因为树可能会过度拟合训练数据。为了防止这种情况,可以使用剪枝技术,包括预剪枝和后剪枝。预剪枝是在建树过程中提前停止树的生长,后剪枝是在树生成完成后,去掉不合适的节点。
  1. 处理缺失值
  • 可以通过一定的方法来填补缺失值,或者在计算信息增益等指标时,跳过缺失值的样本。
  1. 处理连续值
  • 连续值可以通过一定的方法离散化,比如二值化划分,将连续值转换为多个区间进行处理。

49.2. Python 代码示例(决策树分类)

完整代码:5.decision_tree.py

python 复制代码
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report

# 1. 加载数据
X, y = load_iris(return_X_y=True)
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=22)

# 2. 训练(限制深度防止过拟合)
model = DecisionTreeClassifier(max_depth=3)   # max_depth 是预剪枝的关键参数
model.fit(x_train, y_train)

# 3. 预测 + 评估
y_pred = model.predict(x_test)
print(classification_report(y_test, y_pred))

# 4. 特征重要性(信息增益 / 基尼指数的体现)
print('特征重要性:', model.feature_importances_)

50. 决策树是否可以处理非数值型特征?

决策树可以处理非数值型特征。决策树算法有一种非常重要的特性,就是它能够很好地处理分类(离散型)特征。实际上,决策树在处理分类数据时,常常通过计算基尼系数或信息增益来选择最优的特征及其对应的分割点,从而可以方便地进行分类任务。

50.1. 扩展知识

  1. 非数值型特征的处理:在实际数据中,特征常常不是数值型的,而是类别型(如颜色、地区、性别等)。决策树处理这些特征时,会将其视为离散集。例如,某个特征"颜色"可能有"红色"、"蓝色"和"绿色"三种可能,在划分数据集时,决策树会尝试判断哪个颜色的分割能够最大程度地改善分类效果。
  2. 编码方式:在许多机器学习算法中,为了将非数值型特征引入模型,我们需要进行编码。例如,像One-Hot Encoding、Label Encoding等。这些编码方法也可以用于决策树,但通常不需要对离散型特征进行这种编码,因为决策树算法本身已经能够处理离散特征。
  3. 决策树的优点: a) 直观易懂:决策树的结构类似于人类的决策过程,容易理解和解释。 b) 处理数据类型多样:除了数值型特征,它也能处理类别型、布尔型和其它形式的特征。
  4. 基尼系数和信息增益:决策树构建过程中,评价特征的重要性是通过一些特定的指标来实现的。两个常见的指标是基尼系数和信息增益。信息增益衡量的是某个特征带来的信息增量,而基尼系数则是用来测量数据集的不纯度。
  5. 决策树的局限性 :尽管决策树有很多优点,但它也存在一些局限性。比如:容易过拟合(可以通过剪枝技术缓解这个问题),对噪音数据敏感,模型的泛化能力可能不如某些其他复杂的模型(如随机森林、Gradient Boosting Trees等)。

51. 决策树算法是如何应对欠拟合和过拟合的?

决策树算法应对欠拟合和过拟合主要通过适当的控制和优化超参数来实现。

  1. 应对欠拟合:
  • 增加树的深度(max_depth)。
  • 减少最小样本分裂数(min_samples_split)。
  • 减少最小叶子节点数(min_samples_leaf)。
  1. 应对过拟合:
  • 限制树的深度(max_depth)。
  • 增加最小样本分裂数(min_samples_split)。
  • 增加最小叶子节点数(min_samples_leaf)。
  • 使用剪枝技术,如代价复杂度剪枝(Cost Complexity Pruning)。

51.1. 扩展知识

上述方法背后的原理和实现方法:

  1. 欠拟合原因及解决方法: 欠拟合发生在模型对训练数据的学习能力不足,导致无法捕捉数据的潜在模式。决策树模型在这种情况下可能是因为树的深度不够,或者分裂准则过于严格,导致模型过于简单。
  • 增加树的深度(max_depth):增加树深度可以让模型更复杂,更多的节点和分支可以捕捉到数据中的复杂模式。例如,可以将max_depth从默认值None设置为更高的数值。
  • 减少最小样本分裂数(min_samples_split):降低分裂节点所需的最小样本数可以使更多的分裂发生,从而使树增加更多的分支。
  • 减少最小叶子节点数(min_samples_leaf):减小叶子节点所需的最小样本数,可以减少树剪枝的程度,让树生长得更繁茂。
  1. 过拟合原因及解决方法: 过拟合则是模型过度学习训练数据中的噪声和细节,导致在测试数据上的表现不佳。决策树模型由于其高表达能力和易被调优的特性,特别容易过拟合。
  • 限制树的深度(max_depth):通过限制树深度,可以防止树过度生长,将模型变得更简单,从而减少过拟合的风险。
  • 增加最小样本分裂数(min_samples_split):增加分裂节点所需的最小样本数,可以避免在噪声数据上的过度分裂,这更有助于防止过拟合。
  • 增加最小叶子节点数(min_samples_leaf):通过增大叶子节点最小样本数,可以减少不必要的分裂,使模型更加泛化。
  • 剪枝技术:如代价复杂度剪枝(Cost Complexity Pruning),这是一个通过削减对模型贡献较小的分支来减少过拟合的方法。它通过引入一个参数α,根据其对结构和误差的综合影响来决定剪枝。

52. 分别说说 ID3、C4.5 和 CART 算法

ID3、C4.5 和 CART 算法都是用于构建决策树的经典算法。

  1. ID3(Iterative Dichotomiser 3)算法:ID3 是一种贪心算法,通过选择信息增益最大的属性来划分数据集。每次划分数据集时,尽量使得新的子数据集更加纯净。

  2. C4.5 算法:C4.5 是 ID3 的改进版本,它使用**信息增益比(即信息增益与属性熵之比)**来选择划分属性,从而减少了在多值属性上的偏差。此外,C4.5 还处理了缺失值的问题,支持连续属性,并能够进行剪枝

  3. CART(Classification and Regression Trees)算法:CART 可以用于分类和回归问题 。与 ID3 和 C4.5 不同,CART 使用的是基尼指数来构建分类树,使用平方误差最小化来构建回归树。CART 还原生支持二叉树形式。

52.1. 扩展知识

ID3、C4.5 和 CART 在决策树构建方法上的相同点和不同点可以进一步了解:

  1. ID3 详解
  • 信息增益:它基于熵的概念,选择信息增益最大的属性来划分数据集。公式为:信息增益 = 总熵 − 分裂后熵加权平均。
  • 优点:简单且计算量小。
  • 缺点:不能处理连续属性,容易过拟合,对多值属性有偏好,无法处理缺失值。
  1. C4.5 详解
  • 信息增益比:解决了 ID3 在多值属性上的偏好问题,公式为:信息增益比 = 信息增益 / 属性熵
  • 处理连续属性:通过选取一个最佳分割点来处理连续属性。
  • 处理缺失值:通过考虑具有缺失属性值的样本对各可能的划分点的影响。
  • 剪枝:通过剪枝来防止过拟合,具体方法包括递归剪枝和最小错误剪枝。
  1. CART 详解
  • 基尼指数:分类树使用基尼指数作为评价标准,公式为:基尼指数 = 1−∑(pi2) 1 − ∑(p_i^2) 1−∑(pi2)
  • 平方误差:回归树使用平方误差最小化来寻找最佳分裂点。
  • 二元分割:CART 生成的决策树始终是二叉树形式,即每个节点只有两个子节点。
  • 剪枝:通过代价复杂度剪枝来防止过拟合。这个过程是通过引入一个参数来平衡树的复杂度和拟合误差。

此外,决策树算法还具有以下扩展应用:

  1. 随机森林:通过集成多个 CART 决策树来提升模型的稳定性和精确度。

  2. 梯度提升树(GBDT):通过结合多棵回归树来提升模型性能,数据的预测值由一步一步地修正得到。

  3. XGBoost、LightGBM:这些是基于 GBDT 的更为高效性能优化的实现,常用于各种竞赛和实际项目中。

53. 既然ID3算法中已经选择了信息增益,为何C4.5算法中选择使用信息增益率?

ID3算法中选择依据信息增益来选择进行划分的属性,而C4.5算法则选择使用信息增益率。之所以C4.5算法选择使用信息增益率,是因为信息增益在选择属性时存在一个偏好问题------它倾向于选择具有更多取值的属性,从而可能导致过拟合 。而信息增益率通过对信息增益进行标准化,解决了这个问题,使得选择的属性更加合理。

53.1. 扩展知识

  1. 信息增益:信息增益定义了使用某个属性进行划分后,样本的不确定性(熵)减少的程度。虽然这听起来是一个合理的度量,但在实际应用中,它容易偏向选择那些具有更多取值的属性。例如,如果一个属性在数据集中独一无二,它的划分会几乎完美地将数据分开,从而获得最大的增益,但这并不一定意味着这个属性是最有用的。
  2. 信息增益率:为了克服信息增益的上述不足,C4.5算法引入了信息增益率。信息增益率是在信息增益的基础上,除以一个度量该属性取值的"固有值",从而校正了对于多值属性的偏好。这种方式使得每个属性的选择更为公平,避免了多值属性对信息增益的影响。
  3. 固有值(Intrinsic Value, IV):固有值是信息增益率的重要部分,它量化了属性取值的分布情况,它类似于熵,定义同样是基于频率的度量。固有值越大,表示属性取值非常分散,信息增益率对IV的调整可以有效避免过多取值属性在信息增益度量中占优的问题。
  4. 平衡选择 :信息增益率可以平衡信息增益的增大,但要注意的是,固有值过小的属性也会获得较高的信息增益率,所以在C4.5算法中,通常我们会先按照信息增益进行筛选,去掉那些信息增益过低的属性,再基于信息增益率进行最终选择。
  5. 算法进化 :ID3是决策树算法的初期版本,简单但有一定局限性;C4.5是ID3的改进版,除了引入了信息增益率外,它还支持连续属性的处理,能够处理缺失值,更加实用。因此,C4.5在机器学习领域获得了更多的应用。

54. 分别描述C4.5算法中预剪枝和后剪枝的策略,并说说和CART算法中的剪枝策略有何不同?

在决策树算法中,剪枝是用来防止过拟合的一种技术。主要有两种剪枝策略:预剪枝和后剪枝。具体到C4.5算法中:

1)预剪枝 :在构建决策树的过程中,预剪枝策略会在每一步分裂节点之前进行评估 。如果拆分后的增益(例如信息增益或增益比)不达到某个阈值,就停止分裂,保留当前节点为叶节点。这种方法的优点是计算量小,树的构建时间相对较短,但可能导致欠拟合,因为树的结构没有充分展开

2)后剪枝 :后剪枝策略是在决策树完全生成以后,使用验证集通过逐节点评估来剪枝。它通过自下而上的方式尝试去除一些非叶子节点 ,然后重新计算树的性能,仅当移除节点后决策树的泛化性能(通常是验证集上的表现)更加优良时,才执行剪枝操作。后剪枝的优点是通常能生成更优的树结构,但计算开销较大

CART算法中的剪枝策略:

CART(Classification and Regression Trees)算法主要采用后剪枝 策略。具体步骤和C4.5中后剪枝类似,也是在生成整棵树之后,通过对叶节点的成本复杂度剪枝递归合并来减少过拟合。CART中采用的剪枝标准是基尼指数(分类)或者平方误差(回归),剪枝时根据这种标准来选择是否剪枝。

54.1. 扩展知识

1)树的复杂度与泛化能力:剪枝的核心思想是通过控制树的复杂度来提升模型的泛化能力。过度复杂的树会过拟合训练数据,表现为在训练集上准确率很高,但在测试集上效果不佳。而过度简化的树又可能忽略重要信息,导致欠拟合。

2)不同的剪枝标准:C4.5使用的信息增益或增益比,CART使用的基尼指数或平方误差,不同的标准反映了不同的优化目标。理解这些标准对于选择合适的算法和解释模型表现非常重要。

3)剪枝在其他算法中的应用:除了决策树,剪枝策略在随机森林、梯度提升树等集成学习算法中也有应用。例如,随机森林通过构建多棵决策树然后平均化来降低方差,但每棵树如果过于复杂,整体模型仍可能过拟合。因此,剪枝策略在减少单棵树的复杂性上依然有意义。

4)实战中的剪枝策略选择:在实际项目中如何选择合适的剪枝策略?这通常取决于数据集的大小、特征的复杂性以及计算资源的限制。对于相对简单的数据集,预剪枝可能已经足够,而在复杂度较高的数据集与较为充裕的计算资源下,后剪枝可能提供更优的性能。

55. 为什么CART算法特征选择方式是基尼系数,而不是信息熵?

CART(Classification and Regression Trees)算法选择特征时,采用的是基尼系数而不是信息熵,主要因为基尼系数计算更为高效且直观。在实际应用中,基尼系数和信息熵的选择并不会显著改变决策树的效果,但基尼系数的计算更简单,能够提升算法的速度和性能

55.1. 扩展知识

  1. 计算效率 :基尼系数的计算公式为 (1− ∑i=1c pi2) \left(1-\sum_{i=1}^{c} p_i^2\right) (1−∑i=1cpi2),相对于信息熵的公式 (− ∑i=1c pilog⁡(pi)) \left(-\sum_{i=1}^{c} p_i \log(p_i)\right) (−∑i=1cpilog(pi)),计算更为简单,不涉及对数运算。因此,在大数据集或高维度数据的情况下,基尼系数可以节省计算资源,提高效率。
  2. 直观性 :基尼系数反映的是数据集的不纯度,基尼系数越小,数据集越纯。当基尼系数为0时,表示节点是纯的,只包含一个类别的样本。这个性质使得基尼系数在解释和理解上更加直观和容易。
  3. 相似性 :虽然信息熵和基尼系数有不同的计算方式,但在实际应用中,这两者的结果和效果是相似的。换句话说,无论选用哪种方法,最终生成的决策树可能并不会有显著不同,因此选择计算更简单的基尼系数就显得更为合理了。
  4. 历史原因:CART算法最早由Breiman等人提出,他们发现基于基尼系数的分裂准则在实践中表现良好。这一经验和历史习惯也使得后来人们更倾向于继续使用基尼系数而不是信息熵。
  5. 扩展应用 :除了基尼系数,CART算法在回归任务中使用的是最小二乘法(Least Squares),也体现了该算法在不同任务中的灵活性和对效率的追求。

56. 简要描述随机森林算法的过程。

随机森林算法是一种集成学习方法,它通过结合多棵决策树来改善模型的准确性和鲁棒性。其具体过程可以简要概括为:

1)样本抽样 :从原始训练集中通过有放回的抽样(即Bootstrap抽样)获得多个子训练集。

2)特征选择 :在每个节点进行分裂时,从所有特征中随机选择一个特征子集,然后选择最优特征进行分裂。

3)树的生成:使用每个子训练集来训练不同的决策树(不剪枝)。

4)投票机制:在预测阶段,综合所有决策树的预测结果(分类任务采用多数投票,回归任务取平均值)。

56.1. 扩展知识

随机森林的优点和特点:

1)泛化能力强:随机森林通过随机抽样和随机特征选择,构建了多样化的决策树,减少了过拟合的风险,提高了模型的泛化能力。

2)处理高维数据:由于在每个节点进行分裂时只考虑一个随机特征子集,随机森林可以有效地处理高维数据集以及数据中存在的噪声。

3)重要性评估:随机森林可以计算出各个特征的重要性,帮助我们理解和解释模型。例如,在进行特征选择时,可以通过特征重要性排序来筛选出更有用的特征。

4)容错性高:即使有较多的决策树预测错误,整体预测结果仍然可以较为准确,具有较好的容错能力。

5)并行化计算 :由于各棵决策树的生成和训练过程相互独立,随机森林算法可以很容易并行化处理,能充分利用多核处理器进行加速。

56.2. Python 代码示例(随机森林 vs 决策树 + 网格搜索)

完整代码:6.random_forest.py

python 复制代码
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier

X, y = load_breast_cancer(return_X_y=True)
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=22)

# 1. 单棵决策树(易过拟合)
tree = DecisionTreeClassifier()
tree.fit(x_train, y_train)
print('决策树得分:', tree.score(x_test, y_test))

# 2. 随机森林(多棵树投票,抗过拟合)
rf = RandomForestClassifier()
rf.fit(x_train, y_train)
print('随机森林得分:', rf.score(x_test, y_test))

# 3. 网格搜索 + 交叉验证(找最优 n_estimators / max_depth)
params = {'n_estimators': [10, 20], 'max_depth': [2, 3, 4, 5]}
gs = GridSearchCV(estimator=rf, param_grid=params, cv=3)
gs.fit(x_train, y_train)
print('最优参数:', gs.best_params_)
print('最优模型得分:', gs.best_estimator_.score(x_test, y_test))

# 4. 特征重要性
print('特征重要性:', gs.best_estimator_.feature_importances_)

57. 随机森林算法为什么不使用全样本训练 m 棵决策树?

随机森林算法不使用全样本训练 m 棵决策树,因为它采用了一种称为"袋装法"(Bagging)的技术,来增加模型的泛化能力和减少过拟合风险。每棵决策树是在从原始数据集中随机抽取若干样本(放回抽样,也称为Bootstrap抽样)的子集上训练的,这使得每棵树都具有一定的随机性和独立性,从而提高了整个森林的稳健性和准确性。

57.1. 扩展知识

1)袋装法(Bagging)解释 :袋装法是一种集成学习技术,通过从原始样本数据集中随机有放回地抽取多个子样本,并在每个子样本上训练模型(例如决策树)。这种方法有两个主要优点:一是通过训练多个模型并对其预测结果进行平均或投票,可以减少模型的方差,提高预测稳定性 ;二是由于每个模型看到的数据集不同,能够有效避免模型的过拟合情况

2)决策树与过拟合:单棵决策树在深度很深时容易过拟合,即在训练数据上表现很好,但在测试数据上表现较差。通过随机森林中的袋装法,不同的树在不同的数据子集中学习,可以在一定程度上减少每棵树的过拟合风险,整个随机森林也因此表现得更为稳定和准确。

3)特征随机性 :在随机森林中,不仅仅是样本随机选择,还有特征随机选择。在构造每棵树的过程中,随机选择一部分特征来进行分裂,这进一步引入了随机性,增强了模型的多样性。这种随机性使得即使在特征相关性很强的情况下,每棵树也能得到不同的分裂,从而整体上减少过拟合。

4)性能和计算复杂度:另一个不使用全样本训练 m 棵决策树的重要原因是计算复杂度和时间效率的问题。如果每棵决策树都用全样本训练,在大数据集上会消耗大量计算资源和时间。而通过随机抽样,每棵树只用部分样本进行训练,可以大大减少计算量,提高模型训练的效率。

Bootstrap 抽样的描述

每个子样本集的样本数与原始数据集相同, ✅

每个子样本集都是原始数据的严格子集,❌ 可能包含重复样本

58. 如何理解随机森林的随机性?

随机森林的随机性主要体现在两个方面:一是样本的随机性,二是特征的随机性。具体来说,在构建随机森林时,我们会通过以下两种方式引入随机性: 1)样本随机性 :随机森林采用了Bootstrap抽样法(也叫袋装法),在构建每棵决策树时,会随机选择训练数据中的子集。每次构建一棵决策树时,都是从原始数据集中有放回地随机抽取一个子集,以构建新的训练集。 2)特征随机性:在每个决策树节点的分裂过程中,随机森林算法不会使用所有特征,而是从所有特征中随机抽取一个特征子集,然后在这个子集中选择最佳特征进行分裂。这种机制减少了树与树之间的相关性,使得最终模型更加稳健。

58.1. 扩展知识

其工作原理和优缺点: 1)工作原理:

  • 过程:随机森林是一种集成学习方法,通过构建多个决策树并将其组合(通常是投票或平均)来提高模型性能。每棵树都是独立构建的,最终模型的预测结果是这些树的结果的组合。
  • 目标:利用多个决策树降低单个树带来的过拟合风险,提高模型的泛化能力。

2)优点:

  • 抗过拟合:由于采用了样本和特征的随机性,这使得单棵树的过拟合问题在最终模型中被稀释,从而提高了模型的泛化能力。
  • 鲁棒性:能够处理高维数据、处理缺失值和不平衡数据集的鲁棒性表现。
  • 可解释性:相对容易解释,尤其是通过特征重要性(feature importance)可以理解哪些特征在模型中起了重要作用。

3)缺点:

  • 计算资源:由于需要构建大量的决策树,随机森林的训练和预测时间比单个决策树要长,计算和存储需求也更高。
  • 模型大小:随机森林模型通常比单个决策树模型要大得多,这对于存储和实时应用提出了更高要求。

4)应用场景:

  • 分类问题:广泛应用于分类问题中,例如文本分类、图像分类等。
  • 回归问题:也可以用于回归任务,通过预测平均值或加权平均来获得更精确的回归结果。
  • 特征选择:利用随机森林的特征重要性,可以进行特征选择,删除不重要的特征以简化模型。

59. 随机森林算法是否容易过拟合?

通常情况下,随机森林算法不容易过拟合。这是因为它通过集成多个决策树并进行投票表决来提高模型的健壮性和抗噪性。决策树模型单独使用容易过拟合数据集,而随机森林通过引入随机性(在特征选择和数据选择两个方面的随机性),降低了模型过拟合的风险。

59.1. 扩展知识

1)集成学习的优势

  • 投票表决:随机森林通过对多个决策树的投票表决,降低了单个决策树可能产生的偏差,从整体上提升了预测的准确性和稳定性。
  • 多样性:通过在训练不同决策树时抽样不同的训练数据和特征集合,增强了模型对数据集偏差的适应性,避免了单一决策树带来的过拟合问题。

2)随机抽样机制

  • 袋外样本(OOB samples):在训练每棵决策树时,从原始数据集中随机抽样生成不同的训练集(通常是有放回抽样),未被采样的一部分数据称为袋外样本。袋外样本的误差可以用来作为模型的一种内置交叉验证,帮助评估模型的泛化能力。
  • 特征随机性:在每个决策点(节点)上,随机选择特征的一个子集进行最佳分裂,这样可以减少因特征相互依赖可能带来的模型偏差。

3)参数调整

  • 树的数量(n_estimators):增加决策树的数量可以提高模型的稳定性,但也会增加计算开销。通常,随着树的数量增加,模型稳定性会逐渐提升,但当达到一定数量后,继续增加树的数量对模型性能提升有限。
  • 树的深度(max_depth):限制树的最大深度可以防止单一决策树过拟合训练数据。不过,随机森林的基于集成的特点,使得其即使在个别树较深的情况下也能较好地避免过拟合。

4)实际应用中的考量

  • 虽然随机森林在理论上和实践中通常表现为不容易过拟合,但在处理极其复杂的数据集、特征间关系非常复杂或数据集存在噪声的情况下,仍然有可能出现一定程度的过拟合。
  • 了解数据集的特性及合理调整参数是进一步防止过拟合的有效手段。

5)其他防范过拟合的技巧

  • 交叉验证:通过交叉验证,您可以评估模型在不同数据集上的泛化能力,从而进一步检测和减轻过拟合现象。
  • 正则化:对于输入特征特别多(高维空间)或含有噪声的数据集,可以考虑正则化技术来简化模型,进而减少过拟合风险。

59.2. 解释 Boosting 算法和 Bagging 算法的区别

Boosting 和 Bagging 是两种常见的集成学习方法,它们的主要区别在于样本和模型的权重更新策略。

  1. Boosting 强调通过不断调整样本权重 来提升模型的准确性:每一轮训练时,上一轮中被错分的样本将被赋予更高的权重,以便下一轮能更好地学习这些样本。Boosting 步步为营,每一步都在修正前一步的错误。

  2. Bagging 则注重通过样本重采样 形成多个子数据集,然后并行训练多个相同的基模型,最后进行投票或者平均来决策。Bagging 强调的是降低模型的方差,通过引入样本的随机性来提升模型的稳定性

59.3. 扩展知识

Boosting 和 Bagging 各自的优势、应用场景和常见的算法:

59.3.1. Boosting

  1. 优点:Boosting 能有效提升弱分类器的性能,通过集成这些弱分类器可以形成一个强分类器。同时,Boosting 可以降低偏差,因此在解决高偏差问题时非常有效。
  2. 缺点:Boosting 可能对噪声和异常值比较敏感,因为样本权重会让模型格外关注困难样本,在存在噪声时可能导致过拟合。此外,Boosting 通常比 Bagging 更加复杂和耗时。
  3. 常见算法:AdaBoost(Adaptive Boosting)、Gradient Boosting(梯度提升)以及 XGBoost(Extreme Gradient Boosting)等。
  4. 应用场景:Boosting 通常被用于处理小样本量、偏差大的问题。它在各种现实场景中有广泛应用,比如广告点击率预估、图像分类等。

59.3.2. Bagging

  1. 优点:Bagging 可以有效减少模型的方差,从而避免过拟合,提高模型的稳定性。由于多个模型是并行训练的,Bagging 在多核处理器上具有较好的可扩展性。
  2. 缺点:Bagging 对于高偏差的模型效果不明显。因为它无法通过集成多个高偏差的模型来减小偏差,只能进一步降低方差
  3. 常见算法:最著名的 Bagging 算法是随机森林(Random Forests),它通过随机选择特征组合和样本,在决策树基础上形成一个强大的集成模型。
  4. 应用场景:Bagging非常适用于高方差问题,例如噪声较多的数据集以及特征多样性高的数据。随机森林在特征选择、分类和回归任务中表现优异,常用于金融风险预测、医学诊断等领域。

60. 简述 Adaboost 算法的原理

Adaboost 算法是一种迭代的机器学习算法,其全称是"Adaptive Boosting"。它主要通过结合多个弱分类器(通常是决策树桩)来形成一个强分类器 。该算法的基本思路是先训练一个初始分类器,然后根据分类器的表现对样本分配权重,使得后续的分类器更多关注到被前一轮分类器错分的样本。最终,所有弱分类器的加权结果共同决定最终的分类结果。

60.1. 扩展知识

  1. 工作流程:Adaboost 算法的步骤如下:
  • 初始化样本权重:给每个训练样本分配一个初始权重,通常是均匀分布的。
  • 训练弱分类器:根据当前样本权重,训练一个弱分类器。
  • 计算分类误差:根据弱分类器的预测结果,计算分类误差。
  • 更新样本权重:根据分类误差调整样本权重,使得分类错误的样本权重增加,分类正确的样本权重减少。
  • 更新分类器权重:根据分类误差计算弱分类器的权重,使得分类表现好的分类器权重更高。
  • 迭代上述步骤,直到达到预定的弱分类器数量或错误率达到某个阈值。
  1. 优点:
  • 自动学习:Adaboost 能够自动关注那些难以分类的样本,并逐渐提高它们在分类器中的重要性。
  • 简单且有效:该算法结构简单,易于实现,但在很多实际应用中非常有效。
  1. 缺点:
  • 敏感于噪声和异常值:Adaboost 对于噪声数据和异常值较为敏感,因为错误分类的样本权重在后续过程中会被放大,可能导致整体结果受到不良影响。
  1. 应用场景:
  • 图像识别:例如对象检测中的人脸识别。
  • 文本分类:例如垃圾邮件过滤。
  • 医疗数据分类:例如用于诊断疾病。

60.2. 如何使用 Adaboost 算法进行特征选择?

我们通常使用 Adaboost 算法进行特征选择,通过构建多个弱分类器并在学习过程中不断调整样本的权重,最终选出对分类结果贡献较大的特征。具体步骤如下:

  1. 初始化样本权重:为每个样本赋予相同的初始权重。
  2. 训练弱分类器:在当前权重下,训练一个弱分类器。
  3. 更新权重:根据弱分类器的错误率,调整样本权重,增加被误分类样本的权重。
  4. 迭代过程:重复训练和更新权重的步骤,结合多个弱分类器。
  5. 特征重要性评估:依据弱分类器的错误率和权重,评估每个特征的重要性。

这个过程的关键在于,通过多次迭代和权重调整,Adaboost算法能够在弱分类器的基础上有效提高预测精度,并且由于每个迭代过程都需要选择能最大程度减少误差的特征,因此在特征选择方面也表现出色。

60.3. 扩展知识

说到 Adaboost 算法,它是一种常用的集成学习算法,主要用于提升分类模型的性能。Adaboost 这个名字其实是 "Adaptive Boosting" 的缩写,意思是通过调整样本权重,自适应地组合多个弱分类器来构建一个强分类器。

60.3.1. 详细步骤解析

  1. 初始化样本权重:假设我们有 N 个样本,那么初始化每个样本的权重都为 1/N。这个步骤确保了每个样本初始时都具有相同的影响力。
  2. 训练弱分类器:基于当前的权重分布,训练一个弱分类器。通常情况下,这个弱分类器可以是决策树的简单版本,比如单层决策树(决策树桩)。
  3. 更新权重:在训练完弱分类器后,需要检测哪些样本被错误分类了。对于被错误分类的样本,其权重会在下一轮迭代中被放大。具体计算方法是: wi,t+1 = wi,t ⋅e αt⋅I(yi≠ht(xi)) w_{i,t+1}=w_{i,t}\cdot e^{\alpha_t\cdot I(y_i\neq h_t(x_i))} wi,t+1=wi,t⋅eαt⋅I(yi=ht(xi)) 其中 (αt) (\alpha_t) (αt) 是分类器的权重,取决于本轮分类器的错误率。错误率越低,分类器权重越大。
  4. 迭代过程:上述步骤会被重复多次,通常是直到达到预定的弱分类器数量或者总误差低于某一阈值为止。
  5. 特征重要性评估:合并弱分类器并进行特征选择时,通常通过计算每个弱分类器与其特征的关联度来评估特征的重要性。使用例如 Gini 指数、信息增益等指标,以确定对分类贡献最大的特征。

60.3.2. Adaboost 与其他特征选择方法的对比

除了 Adaboost,其他常用的特征选择方法还包括过滤法(如基于统计指标选择特征)、包装法(如递归特征消除,RFE)和嵌入法(如 LASSO 回归) 。与这些方法相比,Adaboost 在结合特征选择和模型训练方面表现得更为高效,因为它同时考虑了模型的误分类信息,并在后续迭代中不断调整特征的重要性

60.4. 应用场景

Adaboost 算法常用于以下场景:

  • 人脸识别:Adaboost 可以有效用于在人脸数据中挑选出重要的特征,从而提高识别精度。
  • 金融风控:客户信用评估等需要从冗杂的特征数据中筛选出关键影响因素进行预测。
  • 医学诊断:基于患者的检验数据,优选出相关性强的特征用于疾病预测。

60.5. Python 代码示例(Adaboost vs 单决策树桩)

完整代码:8.adaboost.py

python 复制代码
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

X, y = load_breast_cancer(return_X_y=True)
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=22)

# AdaBoost:默认弱分类器是深度=1 的决策树桩,迭代 50 轮
ada = AdaBoostClassifier(n_estimators=50, random_state=42)
ada.fit(x_train, y_train)
print('AdaBoost 准确率:', accuracy_score(y_test, ada.predict(x_test)))

# 对比:单个决策树桩(弱分类器)单独使用,效果明显差很多
stump = DecisionTreeClassifier(max_depth=1)
stump.fit(x_train, y_train)
print('单决策树桩准确率:', accuracy_score(y_test, stump.predict(x_test)))

61. Adaboost 算法和随机森林算法有什么区别?

Adaboost算法和随机森林算法是两种常见的集成学习方法。二者主要区别在于:

  1. 基本思想:
  • Adaboost (Adaptive Boosting): 旨在将多个弱分类器组合成一个强分类器,通过迭代地训练新分类器以处理前一轮中分错的样本。
  • 随机森林 (Random Forest): 通过组合多棵决策树来提高模型的准确性和稳定性,每棵树是在样本子集和特征子集上独立训练的。
  1. 模型构建方式:
  • Adaboost: 迭代地训练弱分类器,每一次迭代都根据前一次分类器的错误率调整样本权重,使得错误分类的样本在下一轮中有更大的权重,误差大的样本更容易被当前分类器关注。
  • 随机森林: 使用Bagging(Bootstrap Aggregating)技术,在构建每棵树时从训练集中有放回地抽样,并在每个节点选择部分特征进行分裂。
  1. 结果综合方法:
  • Adaboost: 使用加权投票机制,每个弱分类器的权重与其训练误差相关,误差小的分类器权重大。
  • 随机森林: 使用简单投票机制,所有树的投票权重相等,最终预测结果是多数树的预测结果。

61.1. 扩展知识

  1. 鲁棒性与过拟合:
  • Adaboost 对噪声数据和异常值较为敏感,因为它在迭代过程中不断增加错误分类样本的权重,容易让模型过拟合。
  • 随机森林通过随机性引入了多样性,通常在处理高维数据和防止过拟合方面表现更好。
  1. 计算复杂度与训练速度:
  • Adaboost 的训练时间相对较短,因为每个弱分类器通常是一个简单的模型(如单层决策树),但其迭代次数较多,需要仔细调参。
  • 随机森林的训练过程比较耗时,因为需要构造多棵深层决策树,但可以并行化训练,现代计算集群和GPU都可以加快这一过程。
  1. 扩展常用变种:
  • Adaboost 常见的变种包括 AdaBoost.M1、AdaBoost.M2,以及SAMME(AdaBoost 的多分类版本)。
  • 随机森林的变种和扩展应用包括 ExtraTrees(极端随机树)、RandomForest中与其他算法(如极限梯度提升 Tree‑Boosting)的混合使用。
  1. 应用场景:
  • Adaboost 适合用于不平衡数据集下的二分类问题 ,特别是当需要较高的召回率时,它可以调整分类器权重进行更敏感的分类。
  • 随机森林广泛应用于分类和回归问题,特别是当数据量大且特征复杂时,例如在金融、医疗和生物信息学等领域。

62. 什么是 Gradient Boosting

Gradient Boosting(梯度提升)是一种机器学习的集成方法,它通过构建一系列的决策树,把每棵树的结果集成来完成最终的预测。这种方法的核心思想是让新加入的树在现有模型错误部分进行调整,从而逐步提升整体的预测精度。

62.1. 扩展知识

Gradient Boosting 的具体过程可以分为以下几个步骤:

  1. 初始化模型: 一开始我们建立一个简单的模型,比如使用训练数据集的均值作为初始预测值。
  2. 计算残差: 在每一轮迭代中,我们先计算现有模型的残差,也就是模型当前预测和实际值之间的差距。
  3. 拟合新树 : 然后,我们训练一棵新的决策树来拟合这些残差,这棵树的目标是减少这些残差
  4. 更新模型: 新的树被加入到模型中,模型更新为现有模型加上新树的预测结果。
  5. 重复训练: 上述步骤重复多次,直到达到预设的迭代次数或预设的停止条件,比如残差减少到某个水平。

在这个过程中,Gradient Boosting 使用类似梯度下降的方法来优化模型:它通过一棵棵新树逐步"纠正"前一轮预测的错误。具体来说,模型对每一个样本的预测值会逐步"向下"调整,使得最终的预测值尽量逼近真实值。

此外,还有几个关键点和变种值得一提:

  1. Loss Function: 核心是通过**最小化指定的损失函数(如均方差、对数损失等)**来指导训练过程。
  2. Learning Rate: **学习率(Learning Rate)控制每棵新树对整体模型的影响,**常用的小于1的值来避免过度拟合。
  3. Regularization: 防止过拟合的一些方法,比如通过控制树的深度、叶节点的最小样本数等,来增加模型的泛化能力。
  4. XGBoost : 提升算法的一个著名实现,它不仅对基于节点和特征的贪心算法进行了优化,还引入了正则化术语,使模型更加鲁棒。

63. Gradient Boosting 为什么不使用决策树桩?

Gradient Boosting不常使用决策树桩(即只有一个决策节点的树)作为基学习器,主要是因为决策树桩的表达能力有限,导致模型可能在复杂问题上欠拟合 。即使是多个弱学习器的组合,决策树桩提供的信息通常不够丰富,无法准确捕捉数据中的复杂模式。因此,在实际应用中,Gradient Boosting常使用深度适中的决策树(例如深度为3到8的决策树)作为基学习器 ,以更好地平衡复杂性和泛化能力

63.1. 扩展知识

  1. Gradient Boosting简介: Gradient Boosting是一种机器学习集成算法,通过联合多个弱学习器,逐步提高模型的预测性能。每个新的学习器尝试纠正前面所有学习器的错误,通过给错误较大的样本赋予更高的权重来进行训练。这种逐步逼近的方法可以有效提升模型表现。
  2. 决策树桩的缺点: 决策树桩仅包含一个分裂节点,不能捕捉到复杂数据模式。其单一分裂严重限制了模型的表达能力。大多数实际问题中,数据的分布和关系比单一分裂点表示的要复杂很多,因此使用决策树桩往往会导致欠拟合问题。
  3. 较深的决策树: 在Gradient Boosting中,使用深度适中的决策树作为基学习器是一种常见的方法。深度为3到8的决策树可以更好地捕捉数据中的模式和关系,同时避免过度复杂导致的过拟合风险。它们能够在训练和推理中有效地利用数据中的信息,提高最终模型的精度和稳定性。
  4. 欠拟合与过拟合的平衡: 选择恰当深度的决策树作为基学习器,可以在欠拟合(模型过于简单无法捕捉数据的模式)和过拟合(模型过于复杂,过度拟合训练数据而失去泛化能力)之间找到平衡。这一方法可以使Gradient Boosting在复杂的数据集和多变的业务场景中表现出色。

总结起来,Gradient Boosting不使用决策树桩而选择较深的决策树,是为了更好地捕捉数据中的复杂模式,避免欠拟合,从而提升整体模型的性能和泛化能力。

64. Gradient Boosting 与 XGBoost 有什么区别?

Gradient Boosting(梯度提升)是一种通用的提升方法,它通过逐步构建一系列的弱学习器(通常是决策树),并结合它们的预测来提高总体模型的性能。而XGBoost(Extreme Gradient Boosting)是Gradient Boosting的一种实现方式,但它在很多方面进行了优化,使其在速度和性能上有显著的提升。

具体来说:

  1. XGBoost增加了一些正则化项来防止过拟合,提高模型的泛化能力。
  2. XGBoost采用了**二阶导数(Hessian矩阵)**来优化损失函数,使得模型更准确。
  3. XGBoost支持并行处理,加快了训练速度。
  4. XGBoost在处理缺失值方面更加高效。

64.1. 扩展知识

Gradient Boosting是一种比较通用的集成学习方法,可以与不同的基本学习算法结合。而XGBoost是Gradient Boosting的具体实现,并且其设计初衷就是为了提升计算效率和预测精度。在机器学习比赛和实际应用中,XGBoost因为其高效、强大的特性而被广泛使用。下面详细说下这几个方面:

  1. 损失函数:Gradient Boosting允许使用各种可微的损失函数(如平方误差、逻辑回归等),而XGBoost不仅支持这些传统的损失函数,还允许用户自定义损失函数。
  2. 并行和分布式计算由于Gradient Boosting本质上是一个依次训练的过程,所以很难并行化 。然而,XGBoost采用了巧妙的算法设计,可以在特定步骤如树构建中进行并行处理。(并行计算特征分裂点)
  3. 正则化:XGBoost在目标函数中引入了正则化项,可以更好地控制模型复杂度,防止过拟合。这使得XGBoost在处理高维数据时表现尤为突出。
  4. 早停(Early Stopping):XGBoost进一步提升了梯度提升的训练效率,允许在训练过程中根据验证集的表现动态地决定训练轮数,从而避免了过拟合。
  5. 工作流兼容性:XGBoost库提供了与Scikit-Learn无缝集成的接口,方便用户在现有的Python机器学习工作流中采用XGBoost。

64.2. Python 代码示例(XGBoost)

完整代码:10.xgboost.py

python 复制代码
# 需要先安装:pip install xgboost
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score

X, y = load_iris(return_X_y=True)
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=22)

# XGBoost:GBDT 的高效实现(二阶导数 + 正则化 + 并行特征分裂)
model = XGBClassifier(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)
model.fit(x_train, y_train)
print('XGBoost 准确率:', accuracy_score(y_test, model.predict(x_test)))

65. 解释 GBDT(Gradient Boosted Decision Trees) 原理

GBDT,全称Gradient Boosted Decision Trees(梯度提升决策树),是一个强大的机器学习算法,用于回归和分类任务。它通过构建一系列的决策树来预测最终结果,其中每棵树都是在前一棵树的基础上进行改进的。这些树逐步减小残差(预测误差),从而不断提升模型的性能。

简单来说,GBDT的主要原理包括以下几个方面:

  1. 初始化模型:用一个初始值(通常是训练数据目标值的平均值)作为模型的初始预测值。
  2. 计算残差:计算当前模型的预测值和实际目标值之间的残差。
  3. 拟合残差:构建一棵新的决策树来拟合当前的残差。
  4. 更新模型:用新树的预测结果更新整体模型,即将当前树的预测结果加权加入到模型中。
  5. 迭代优化:重复步骤2--4,直到满足预设的迭代次数或误差收敛条件。

65.1. 扩展知识

  1. 损失函数:GBDT的核心目标是在每步迭代中最大限度地减少损失函数(如均方误差或交叉熵)。残差是通过对损失函数求导获得的,因此GBDT可以用于不同类型的任务(回归或者分类),只需要改变损失函数形式。
  2. 学习率:为了避免每棵树对模型带来的改动过大,GBDT引入了学习率概念。学习参数会缩小每棵树对模型的改动幅度,从而实现一种平衡。较低的学习率通常能带来更好的模型,但需要更多的树来达到同样的效果。
  3. 决策树(基学习器):一般情况下,GBDT使用浅层的决策树(即限制树的最大深度)作为基学习器。浅层树虽然个体性能不强,但在Boosting框架下,通过逐步纠正误差可以达到很好的效果。
  4. 正则化:为了防止模型过拟合,可以在GBDT中加入正则化项目,如缩减树的复杂度、采用早停机机制等。
  5. 并行化和优化:在实际应用中,为了提高计算效率和处理大规模数据,GBDT算法可以通过多线程并行处理以及集成不同的优化技术,如XGBoost、LightGBM等。

65.2. Python 代码示例(GBDT 梯度提升树)

完整代码:9.gbdt.py

python 复制代码
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import accuracy_score

X, y = load_breast_cancer(return_X_y=True)
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=22)

# GBDT:每棵树拟合前一轮的残差;learning_rate 控制每棵树的影响幅度
gbdt = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)
gbdt.fit(x_train, y_train)
print('GBDT 准确率:', accuracy_score(y_test, gbdt.predict(x_test)))

66. GBDT 适合使用高维稀疏特征吗?

GBDT(梯度提升决策树)并不适合直接使用高维稀疏特征。原因主要在于决策树算法本身对稀疏高维特征的处理能力有限。如果特征的维度很高而且稀疏,决策树的分裂效果可能会大幅减弱,导致模型性能下降。

66.1. 扩展知识

  1. GBDT 简介:GBDT 是一种集成学习算法,通过构建多个弱学习器(通常是决策树)来增强模型的预测能力。每一棵树都是在前面所有树的残差上进行建模的,最终将所有树的预测结果结合起来形成更强的预测。
  2. 高维稀疏特征的挑战:高维稀疏特征意味着大多数特征的取值都是零。这种特征在决策树中会导致树的分裂效果不佳,因为决策树在分裂节点时依赖于特征的值来进行分裂。而稀疏特征的多数取值为零,导致树难以找到有意义的分裂点,从而影响模型的准确度和性能。
  3. 常用解决方法:
  • 特征降维:可以采用特征选择、主成分分析(PCA)等方法来减少特征维度,缓解高维稀疏特征带来的问题。
  • 特征工程:通过特征交互、特征组合等方法生成更有意义的特征,使得特征值更加丰富而不再那么稀疏。
  • 使用合适的模型 :对于高维稀疏特征,可以考虑使用线性模型如逻辑回归,或者基于稀疏矩阵操作的模型,如线性支持向量机(SVM)
  1. 模型选择:并不是所有算法都不适合处理高维稀疏特征。例如,线性模型和矩阵分解类算法由于其对特征维度高度敏感且能处理稀疏数据,往往在这种情况下表现出色。
  2. 数据预处理:对于高维稀疏特征的数据,可以进行归一化或标准化,帮助模型更好地处理数据。此外,还需清洗数据,确保数据质量不影响模型性能。

67. GBDT 可以用于分类任务吗

GBDT(Gradient Boosting Decision Trees)不仅可以用于回归任务,还可以用于分类任务。为了适应分类任务,GBDT 的损失函数需要相应改变。例如,二类问题中常用的是对数损失函数,多分类问题中采用的是多类对数损失函数。GBDT 通过训练一系列基模型(决策树),逐步提高模型的精度,可以有效地处理分类任务。

67.1. 扩展知识

  1. GBDT 的基本概念:GBDT 是一种梯度提升算法,它的基本思想是将决策树与梯度下降结合,通过每一轮迭代训练一个新的决策树来修正上一轮的错误。

  2. 损失函数的选择:

  • 回归任务:常用的损失函数为均方误差(MSE)。
  • 二分类任务:常用对数损失函数(也称为逻辑损失),对应逻辑回归的损失函数。
  • 多分类任务:使用多类对数损失函数(softmax 损失)。
  1. GBDT 的优点和缺点:
  • 优点
    • 可以处理连续特征和离散特征。
    • 不需要特别复杂的数据预处理。
    • 对非线性和异质数据具有较好的处理能力。
  • 缺点
    • 计算复杂度较高,训练时间较长。
    • 对于高维数据,需要较大的存储空间。
    • 容易过拟合,需要进行参数调优。
  1. 常用的 GBDT 实现:
  • XGBoost:是一个高效和灵活的 GBDT 实现。
  • LightGBM:针对大数据和高维数据进行了优化。
  • CatBoost:特别适合具有类别特征的数据集。
  1. 应用领域:
  • 分类任务:如垃圾邮件检测、图像分类、客户细分。
  • 回归任务:如房价预测、销售预测。
  • 排序任务:如搜索引擎的排序。

68. 什么是降维,为什么要降维

降维是指在数据分析和机器学习中,减少特征数量的过程。具体来说,就是将高维数据转换为低维数据,同时尽量保留原始数据中的信息。降维的主要目的是减少计算复杂度,提高模型的性能,减轻过拟合的风险,有时也能帮助可视化数据。

降维有很多方法,最常见的包括主成分分析(PCA),线性判别分析(LDA)和奇异值分解(SVD)。通过这些方法,我们可以提取出数据中的主要特征,滤除噪声和冗余信息,从而更容易进行后续的分析和建模。

68.1. 扩展知识

几个相关的方法和应用场景:

  1. 主成分分析(PCA): PCA 是一种线性降维技术,它通过将数据投影到新的坐标系中,使得投影后的数据方差最大。这些新的坐标轴称为主成分,前几个主成分通常可以保留大部分信息。PCA 常用于数据预处理和可视化。一个实际应用是图像处理,PCA 可以用来减少噪声并压缩图像数据。

  2. 线性判别分析(LDA): LDA 是一种专注于分类任务的降维技术。它通过将数据投影到一个可以最大化类间方差和最小化类内方差的子空间中,用以提升分类器的性能。LDA 适用于有标签数据的分类问题,比如面部识别中的特征提取。

  3. 奇异值分解(SVD): SVD 是一种矩阵分解技术,可以理解为一种更通用的 PCA。SVD 提取的奇异值和奇异向量可以帮助我们理解数据的结构。SVD 在推荐系统和文本挖掘中有很多应用,比如用来分解大型用户评分矩阵以做协同过滤推荐。

  4. 为什么要降维: a. 计算效率 :高维数据包含大量特征,计算过程非常耗时,降维可以显著提高计算效率。 b. 避免过拟合 :高维数据容易导致模型过于复杂,从而适应训练数据中的噪声,而降维可以减少过拟合。 c. 可视化 :人脑很难理解高维空间,通过降维将数据压缩到 2D 或 3D 空间,可以直观地观察数据的分布和结构。 d. 数据处理和存储:降维可以减少需要处理和存储的数据量,特别适用于大数据场景。

69. 降维有哪些优缺点

降维在机器学习中有不少优缺点。它的主要优点包括:

  1. 减小计算复杂度:通过减少特征数量,模型的训练和预测时间大大减少。
  2. 降低过拟合风险:降维可以消除噪声特征,减少模型的复杂程度,从而降低过拟合风险。
  3. 提高模型性能:在有些情况下,降维可以提高模型的性能,尤其当数据集中的某些特征是冗余或无关的。
  4. 提升数据可视化:降低数据的维度可以方便我们将高维数据在二维或三维空间中进行可视化,更直观地观察数据的分布和关系。

然而,降维也有一些缺点:

  1. 信息损失:降维过程可能会丢失一些重要信息,影响模型的预测准确性。
  2. 选择难度:选择合适的降维方法有时会很棘手,需要针对具体问题进行尝试和对比。
  3. 解释性差:降维后的特征往往难以解释,特别是在使用像PCA(主成分分析)这种方法时,特征之间的实际意义变得模糊。

69.1. 扩展知识

几种常用的降维方法及其应用场景和注意事项:

  1. 主成分分析(PCA):PCA是一种常用的线性降维方法,通过寻找数据中的主成分来减少维度,常用于图像处理和金融数据分析。虽然PCA能够去除冗余特征,但在处理非线性数据时效果不佳。
  2. 线性判别分析(LDA):LDA不仅考虑数据的方差,还考虑类别信息,通过最大化类间方差和最小化类内方差来降维,常用于分类任务。然而,LDA要求数据满足正态分布,对于复杂分布的数据效果不佳。
  3. t-SNE:t-SNE是一种流行的非线性降维方法,可以有效地可视化高维数据。它在保持局部结构的同时,在低维空间上表现出良好的聚类效果。不过,t-SNE的计算复杂度较高,适合用于小规模数据集。
  4. 自编码器:这是基于神经网络的降维方法,通过构建紧凑的表示来实现降维,具有较高的灵活性和适应性,适合处理复杂的非线性数据。然而,自编码器需要大量计算资源,训练过程也较为复杂。

70. 什么是奇异值分解

奇异值分解(SVD,全称 Singular Value Decomposition)是一种矩阵分解技术,它将一个矩阵分解为三个特殊矩阵的乘积。给定一个 m × n 的矩阵 A,奇异值分解表示为: A=UΣVTA = U\Sigma V^T A=UΣVT 其中:

  1. UU U 是一个 m × m 的正交矩阵 ,称为左奇异向量矩阵
  2. Σ\Sigma Σ 是一个 m × n 的对角矩阵 ,称为奇异值矩阵 ,其对角元素是 A 的奇异值,非负且按降序排列
  3. VV V 是一个 n × n 的正交矩阵 ,称为右奇异向量矩阵 。( VTV^T VT 表示 V 的转置矩阵。)

这种分解有许多应用,例如求解矩阵的伪逆、维度缩减、数据压缩和联立线性方程组的求解等。

70.1. 扩展知识

奇异值分解在矩阵处理和数据分析中有广泛应用,下面我详细阐述一下几个关键的应用和概念:

  1. 维度缩减:在机器学习和数据挖掘领域中,SVD 经常用于维度缩减,特别是处理高维数据时。例如在文本分析中,SVD 可以用于潜在语义分析(LSA),通过将词-文档矩阵分解,从中挖掘出潜在的主题关系。这样可以大幅降低数据的维度,同时保留重要的信息。

  2. 数据压缩:SVD 还可以用于数据压缩。通过选择最大的奇异值及其对应的奇异向量,可以构建一个较低秩的近似矩阵,保留大部分的原始数据的信息而减少存储和计算的开销。这在图像压缩中也有应用。

  3. 协同过滤:在推荐系统中,SVD 被用来处理用户--物品评分矩阵,通过分解这个矩阵来发现潜在的用户偏好模式,从而提高推荐的准确性。

  4. 解决过拟合问题:在机器学习模型中,尤其是线性回归模型,SVD 可以帮助解决多重共线性(特征之间高度相关)问题,这有助于减少模型的过拟合,提高泛化能力。

  5. 矩阵的伪逆:在一些情况下,我们需要求解一个矩阵的逆矩阵,但不是所有矩阵都可逆。SVD 让我们能够计算矩阵的伪逆,对于处理秩低的系统非常有用。

71. 特征值和奇异值的区别是什么

特征值和奇异值虽然都用于矩阵的分解,但是它们有一些关键的区别:

  1. 定义和计算方法
  • 特征值 :对于一个方阵A,如果存在一个非零向量 v\boldsymbol{\boldsymbol{v}} v和一个标量 λ\lambda λ,使得 Av=λvA\boldsymbol{\boldsymbol{v}}=\lambda \boldsymbol{\boldsymbol{v}} Av=λv,那么 λ\lambda λ就是A的特征值 v\boldsymbol{\boldsymbol{v}} v是对应的特征向量。特征值通常通过解特征方程 det(A−λI)=0det(A-\lambda I)=0 det(A−λI)=0来获得。
  • 奇异值 :对于任意矩阵A,不要求是方阵 ,存在正交矩阵U和V,以及对角矩阵 Σ\Sigma Σ,使得 A=UΣVTA=U\Sigma V^T A=UΣVT,其中 Σ\Sigma Σ的对角线元素称为A的奇异值。奇异值是通过奇异值分解(SVD)来获得的。
  1. 应用场景
  • 特征值:常用于方阵的对角化、稳定性分析和动力系统等。
  • 奇异值:广泛应用于数据降维、噪声滤除、图像压缩等领域,尤其是在非方阵的场合更加灵活。

71.1. 扩展知识

  1. 特征值的额外知识
  • 实对称矩阵:对于实对称矩阵,它的特征值是实数,并且特征向量可以正交化。
  • 正定矩阵:对于正定矩阵,它的所有特征值都是正数。
  • 应用举例:数据科学中,PCA(主成分分析)就是利用数据协方差矩阵的特征值和特征向量进行降维。
  1. 奇异值的额外知识
  • 矩阵秩:奇异值的数量等于矩阵的秩。
  • 奇异值分解(SVD):SVD不仅能处理非方阵,对于高度病态或噪声严重的矩阵也很有用。例如,图像压缩中,可以只保留最大的几个奇异值和对应的奇异向量进行近似重建,显著减少数据量。
  • 应用举例:降维技术之一的LSA(潜在语义分析)就是利用文本数据矩阵的奇异值进行降维。
  1. 进一步比较及联系
  • 矩阵的谱分解:特征值分解是一种谱分解,适用于方阵;奇异值分解是更普遍的分解方法,可以应用于任何矩阵。
  • 能量与信息:对于奇异值来说,前几个奇异值往往包含了矩阵的主要能量和信息。而特征值在某些特定情形下也有类似的解释。

72. PCA 算法的原理和步骤

PCA,全称 Principal Component Analysis(主成分分析),是一种常用的降维技术,主要用于数据压缩和数据可视化。其基本原理是通过线性代数将数据转换到一个新的坐标系中,使得新的坐标轴(即主成分)尽可能地保留原始数据的方差。换句话说,PCA试图找到使得数据投影后方差最大的方向。

步骤如下:

  1. 标准化数据:将数据转换为零均值和单位方差,以确保不同特征具有相同的度量标准。
  2. 计算协方差矩阵:协方差矩阵反映了数据中各特征之间的线性关系。
  3. 计算特征值和特征向量:获取协方差矩阵的特征值和特征向量,特征向量对应了新的坐标轴方向,特征值代表了这些方向上的方差大小。
  4. 选择主成分:选择最大的几个特征值对应的特征向量,以此作为降维后的新特征。
  5. 生成新的数据集:将原始数据投影到选定的特征向量上,得到降维后的数据集。

72.1. 扩展知识

PCA不仅在理论上有趣,而且在实践中非常有用。具体来说,PCA的应用场景非常广泛,如图像处理、降噪、数据可视化等。

  1. 图像处理:在图像处理中,通过PCA可以压缩图像尺寸,同时尽可能保留图像的主要信息,这对于减少计算和存储成本非常有用。
  2. 降噪:PCA可以帮助过滤噪音。因为噪音一般分布在数据的低方差部分,通过选择高方差的主成分进行还原,可以有效去除部分噪音。
  3. 数据可视化:高维数据往往难以可视化,通过PCA可以将其降维到2D或3D,更容易进行探索和展示。

但需要注意的是,PCA属于线性降维方法,对于非线性关系的数据,其效果可能不理想。在这种情况下,可以考虑使用非线性降维方法,如t--SNE或UMAP。

72.2. Python 代码示例(PCA 降维)

完整代码:13.pca.py

python 复制代码
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris

X, y = load_iris(return_X_y=True)
print('原始维度:', X.shape)     # (150, 4)

# 1. 指定保留 95% 方差,自动确定主成分个数
pca1 = PCA(n_components=0.95)
X1 = pca1.fit_transform(X)
print('保留95%方差后的维度:', X1.shape)
print('各主成分解释方差比:', pca1.explained_variance_ratio_)

# 2. 指定降到 3 维
pca2 = PCA(n_components=3)
X2 = pca2.fit_transform(X)
print('降到3维:', X2.shape)

# 3. 降到 2 维(便于可视化)
pca3 = PCA(n_components=2)
X3 = pca3.fit_transform(X)
print('累计解释方差比:', pca3.explained_variance_ratio_.sum())

73. 如何确定 PCA 降维之后的维度

PCA(主成分分析)是一种常用的数据降维方法,在进行 PCA 降维时,确定降维后的维度一般是通过**解释方差(explained variance)**来决定的。具体来说,我们通常通过累计解释方差比选择合适的主成分数。具体步骤如下:

  1. 计算每个主成分对应的解释方差比(variance explained ratio)。
  2. 计算累计解释方差比(cumulative variance explained ratio)。
  3. 设定一个阈值,例如 95% 或 99%,以确保减少的维度仍能解释大部分的数据变异性。
  4. 选择能够达到设定阈值的最小维度数,即为降维后的维度。

73.1. 扩展知识

  1. 计算解释方差比: 在进行 PCA 时,我们首先需要进行特征值分解或奇异值分解,得到数据的特征向量和特征值。每个特征值对应一个主成分,解释方差比则表示每个主成分对数据总方差的解释能力。解释方差比由特征值相对于所有特征值之和的比例来表示。

  2. 累计解释方差比: 我们将每个主成分的解释方差比累加起来,得到累计解释方差比,从而知道前 k 个主成分可以解释数据中多少百分比的变异性。

  3. 设定阈值: 阈值的设定主要是为了在降维后仍保持数据的主要结构信息。常用的阈值是 95% 或 99%。例如,当设定阈值为 95% 时,即选择累计解释方差比达到或超过 95% 的最少的前 k 个主成分。

  4. 选择最小维度数: 根据设定的阈值,我们可以找到满足此阈值条件的最小维度数。这个维度数即为降维后的维度数。

此外,还有几方面的扩展知识对理解 PCA 降维非常有帮助:

  1. 标准化数据: 在进行 PCA 之前,经常需要对数据进行标准化处理,即将每个特征缩放到相同的尺度。这是因为 PCA 是基于特征之间的方差进行计算,未标准化的数据可能导致某些具有较大尺度的特征对结果产生过大的影响。

  2. PCA 的应用场景: PCA 被广泛应用于图像处理、基因数据分析、金融数据分析等领域。它不仅能够减少计算复杂度,还能帮助我们从高维数据中提取出重要的特征,从而方便下游任务的进行。

  3. PCA 的局限性: PCA 假设数据是线性可分的,对于非线性数据,PCA 的效果会受到限制。这时候可以考虑使用非线性降维方法,比如 Kernel PCA 或 t-SNE。

74. 介绍 LDA 算法

LDA(Linear Discriminant Analysis,线性判别分析)是一种经典的降维技术,主要用于分类和模式识别任务。它通过在投影空间上最大化类间距离和最小化类内距离 ,从而提升分类器的性能。与 PCA(主成分分析)不同,LDA不仅关注数据的方差,还考虑了类别标签的信息

74.1. 扩展知识

74.1.1. 工作原理

  • LDA的目标是找到一个投影矩阵,使得原始数据在投影后的低维空间中能够更好地分开不同类别的数据。
  • 具体来说,它通过最大化类间散度矩阵(between-class scatter matrix)和最小化类内散度矩阵(within-class scatter matrix)的比值,来求取这个投影矩阵。

74.1.2. 数学基础

  • 类间散度矩阵 (SB) (S_B) (SB) 和类内散度矩阵 (SW) (S_W) (SW) 的定义和计算是 LDA 的核心
  • 通过解广义特征值问题,我们可以找到投影矩阵。

74.1.3. 与 PCA 的比较

  • PCA主要关注的是降维过程中保留最多的方差信息,而不考虑类别标签,因此它是一种无监督的降维方法。
  • LDA则是有监督学习,充分利用了类别信息,以提升分类效果。

74.1.4. 实际应用中注意事项

  • 在数据集小、特征多的情况下,LDA可能表现不佳,因为它依赖于类别之间的统计信息
  • 预处理很重要,数据的归一化、标准化通常是必需的,否则可能会影响 LDA 的效果。

74.1.5. 优缺点总结

  • 优点:通过投影方式增强分类器性能,考虑了类别标签,更具解释性。
  • 缺点:对计算资源要求较高,尤其是在高维数据中;对噪声敏感。

74.2. Python 代码示例(LDA 降维)

完整代码:14.lda.py

python 复制代码
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.datasets import load_iris

X, y = load_iris(return_X_y=True)
print('原始维度:', X.shape)     # (150, 4)

# LDA 是监督降维:n_components 最大为 (类别数 - 1)
lda = LinearDiscriminantAnalysis(n_components=2)
X_new = lda.fit_transform(X, y)   # 注意:fit 需要标签 y(与 PCA 不同)
print('LDA 降维后维度:', X_new.shape)   # (150, 2)

# 降维后的数据可直接用于分类
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

x_train, x_test, y_train, y_test = train_test_split(X_new, y, test_size=0.2, random_state=22)
clf = LogisticRegression().fit(x_train, y_train)
print('LDA 降维后分类准确率:', accuracy_score(y_test, clf.predict(x_test)))

75. PCA 和 LDA 算法有哪些区别

PCA(主成分分析)和 LDA(线性判别分析)是两种常用的数据降维技术,它们的主要区别如下: 1)目的不同 :PCA 主要用于无监督的降维 ,目标是最大化数据的方差,使得降维后的数据保留尽可能多的信息。而 LDA 是一种有监督的降维方法,目标是最大化类间距离同时最小化类内距离,用于提高模型的分类性能 。 2)适用场景不同 :PCA 适用于没有类别标签的数据,常用于数据预处理、噪声过滤和特征提取等。LDA 则适用于带有类别标签的数据,常用于分类问题的特征选择和降维。 3)技术细节不同 :PCA 是通过特征值分解寻找主成分,而 LDA 是通过特征值分解寻找能够最大化类间和类内散布矩阵比例的方向。 4)结果的特性不同:PCA 是在整体数据集中进行降维,不考虑类别标签。LDA 降维后的数据保留类别信息,更利于分类任务。

75.1. 扩展知识

1)PCA 的原理和应用: PCA 通过计算数据协方差矩阵的特征值和特征向量,找到数据分布方向上的主要成分(主成分),然后通过这些主成分对数据进行投影,从而达到降维的目的。 PCA 的优势在于无需标签信息,能够有效地降低数据维度、去除噪声、增强模型的泛化能力。PCA 常用于图像处理、信号处理中的特征提取和去噪。

2)LDA 的原理和应用: LDA 是通过最大化类间散布矩阵到类内散布矩阵的比率,找到能够区分不同类别之间的最佳投影方向。与 PCA 不同,LDA 需要类别标签信息,能够将数据投影到一个低维空间,并在该空间中最大程度地区分不同类别的数据。LDA 在分类任务中效果显著,常用于模式识别、图像分类等领域。

3)数理基础 : PCA 和 LDA 都依赖于线性代数中的特征值分解或奇异值分解(SVD),但它们所构建的矩阵不同。PCA 使用的是协方差矩阵,而 LDA 使用的是类间散布矩阵和类内散布矩阵的比率矩阵

4)局限性 : PCA 和 LDA 都有各自的局限性。PCA 在高维数据下可能表现不佳,因为它忽略了类别信息;LDA 当样本数量少于类别数时无法有效工作。此外,当数据分布不是线性可分时,传统的线性降维方法可能不够有效,此时可以考虑非线性的降维方法如 Kernel PCA 或非线性判别分析(NDA)。

76. 特征值和特征向量

Ax=λx\boldsymbol{A} \boldsymbol{x} = \lambda \boldsymbol{x} Ax=λx

其中 A\boldsymbol{A} A 是一个 n×n 矩阵, x\boldsymbol{x} x 是一个n维向量,则 λ\lambda λ 是矩阵 A\boldsymbol{A} A 的一个特征值,而 x\boldsymbol{x} x 是矩阵 A\boldsymbol{A} A 的特征值 λ\lambda λ 所对应的特征向量。

求出特征值和特征向量有什么好处呢? 就是我们可以将矩阵A特征分解。如果我们求出了矩阵 A 的 n 个特征值 λ1≤λ2≤⋯≤λn \lambda_1\le\lambda_2\le\dots\le\lambda_n λ1≤λ2≤⋯≤λn,以及这 nn n 个特征值所对应的特征向量 w1,w2,...,wn w_1, w_2, \dots, w_n w1,w2,...,wn,

那么矩阵 A 就可以用下式的特征分解表示:

A=WΣW−1A=W \Sigma W^{-1} A=WΣW−1

其中 W 是这 n 个特征向量所张成的 n×n 维矩阵,而 Σ 为这 n 个特征值为主对角线的 n×n 维矩阵。

一般我们会把 WW W 的这 nn n 个特征向量标准化,即满足 ∥wi∥2=1 \|w_i\|_2 = 1 ∥wi∥2=1,或者 wiTwi=1 w_i^T w_i = 1 wiTwi=1,此时 WW W的

nn n 个特征向量为标准正交基 ,满足 WTW=IW^T W = I WTW=I,即 WT=W−1W^T = W^{-1} WT=W−1,也就是说 WW W 为酉矩阵

酉矩阵(又译作幺正矩阵,英语:unitary matrix)指其共轭转置恰为其逆矩阵的复数方阵

酉矩阵是正交矩阵(元素均为实数)在复数的推广

这样我们的特征分解表达式可以写成
A=WΣWTA = W\Sigma W^T A=WΣWT

注意到要进行特征分解 ,矩阵 AA A 必须为方阵。

那么如果 AA A 不是方阵,即行和列不相同时,我们还可以对矩阵进行分解吗?答案是可以,此时我们的SVD登场了。

相关推荐
硅谷秋水3 小时前
通过技能-驾驭进化实现自我演化的具身智能体
人工智能·深度学习·安全·机器学习·语言模型·机器人
tachibana23 小时前
RAGAS 指标解读
数据库·人工智能·算法·机器学习·架构·大模型·llm
FL16238631293 小时前
电力场景变电站火灾检测数据集VOC+YOLO格式564张2类别
人工智能·yolo·机器学习
网络工程小王4 小时前
【LLM开发实验】 QLoRA实现原理及实战
人工智能·深度学习·机器学习·llm·qlora
苏子寒4 小时前
Nano-VLLM全代码解析笔记(6)-embed_head和linear
pytorch·笔记·python·机器学习·ai·nlp·vllm
晴天165 小时前
LLM 与世界模型:从“会说话“到“会理解世界“-Day27
人工智能·机器学习
这张生成的图像能检测吗6 小时前
即插即用模块 + 改进思路汇总目录
图像处理·人工智能·深度学习·目标检测·机器学习
hhzz7 小时前
智慧校园13类视频异常检测:数据集与预训练模型全攻略
人工智能·pytorch·python·深度学习·目标检测·机器学习
SomeB1oody7 小时前
【RustyML入门】7.4. 按需裁剪与模块化集成
开发语言·后端·机器学习·rust·教程