【模式识别与机器学习(2)】主要算法与技术教程(上篇:基础分类算法)

文章目录

    • 一、考试范围知识框架
      • [1. 决策树](#1. 决策树)
      • [2. 惰性学习](#2. 惰性学习)
      • [3. 可能考查的问题](#3. 可能考查的问题)
    • 二、正文内容
      • [第一部分:决策树(Decision Trees)](#第一部分:决策树(Decision Trees))
        • [1.1 决策树的起源与发展](#1.1 决策树的起源与发展)
        • [1.2 决策树基本算法](#1.2 决策树基本算法)
        • [1.3 熵与信息论基础](#1.3 熵与信息论基础)
        • [1.4 ID3算法:信息增益最大来进行属性分割](#1.4 ID3算法:信息增益最大来进行属性分割)
        • [1.5 CART算法与基尼系数:数据集纯度](#1.5 CART算法与基尼系数:数据集纯度)
        • [1.6 决策树剪枝](#1.6 决策树剪枝)
        • [1.7 决策树特点与应用](#1.7 决策树特点与应用)
      • [第二部分:惰性学习(Lazy Learner)](#第二部分:惰性学习(Lazy Learner))
        • [2.1 急切学习与惰性学习](#2.1 急切学习与惰性学习)
        • [2.2 k-最近邻分类法(kNN)](#2.2 k-最近邻分类法(kNN))
        • [2.3 距离度量方法](#2.3 距离度量方法)
        • [2.4 k值选择与分类决策](#2.4 k值选择与分类决策)
        • [2.5 kD树索引结构](#2.5 kD树索引结构)
        • [2.6 kNN算法特点](#2.6 kNN算法特点)

一、考试范围知识框架

1. 决策树

  • 决策树的起源与发展
  • 决策树基本算法
  • 熵与信息论基础
  • ID3算法
  • CART算法与基尼系数
  • 决策树剪枝
  • 决策树特点与应用

2. 惰性学习

  • 急切学习与惰性学习
  • k-最近邻分类法(kNN)
  • 距离度量方法
  • kD树索引结构
  • kNN算法特点

3. 可能考查的问题

  1. 决策树相关问题

    • 信息增益、增益率、基尼系数的计算与选择
    • ID3、C4.5、CART算法的区别
    • 预剪枝与后剪枝的区别与应用场景
    • 决策树如何处理过拟合问题
  2. kNN相关问题

    • 不同距离度量方法的特点与应用
    • k值选择对分类性能的影响
    • kD树的构建与搜索过程
    • kNN算法的优缺点

二、正文内容

第一部分:决策树(Decision Trees)

可参考,我之前的文章:【机器学习】非线性分类算法详解(下):决策树(最佳分裂特征选择的艺术)与支持向量机(最大间隔和核技巧)

1.1 决策树的起源与发展

关键词:决策树算法、ID3、CART、自顶向下递归分治

决策树算法起源于20世纪70-80年代。机器学习研究者J. Ross Quinlan在70年代后期和80年代初期开发了ID3算法(Iterative Dichotomiser,迭代的二分器),后来发展为C4.5和C5.0算法。1984年,统计学家L. Breiman、J. Friedman、R. Olshen和C. Stone开发了CART算法,用于构造二叉决策树和随机森林。

ID3和CART都采用贪心(非回溯)算法,使用自顶向下递归的分治方法构造决策树。这两个基础算法推动了决策树归纳研究的发展。

1.2 决策树基本算法

关键词

  • 决策树算法过程:递归划分
  • 属性选择算法:
  • 停止划分方法:剪枝、后剪枝

决策树的基本算法采用递归形式:

  1. 选择一个属性放置在根节点,为每个可能的属性值产生一个分支;
  2. 将样本集划分成多个子集,一个子集对应于一个分支;
  3. 在每个分支上递归地重复这个过程,仅使用真正到达这个分支的样本;
  4. 如果在一个节点上的所有样本拥有相同的类别,即停止该部分树的扩展。

决策树基本算法流程图:

shell 复制代码
开始
  │
  ├─→ [判断] 当前节点所有样本属于同一类?
  │         │
  │         ├─→ 是 → [停止扩展] 标记为叶节点 → 结束
  │         │
  │         └─→ 否 → [步骤1] 选择最优属性A
  │                    │
  │                    ├─→ [步骤2] 为属性A的每个可能值ai创建分支
  │                    │         │
  │                    │         └─→ [步骤3] 将样本集按属性值划分成子集Di
  │                    │                   │
  │                    │                   ├─→ [循环] 对每个属性值ai的分支:
  │                    │                   │         │
  │                    │                   │         ├─→ 子集Di为空?
  │                    │                   │         │     │
  │                    │                   │         │     ├─→ 是 → 创建叶节点(父节点多数类)
  │                    │                   │         │     │
  │                    │                   │         │     └─→ 否 → [步骤4] 递归调用算法
  │                    │                   │         │                   │
  │                    │                   │         │                   └─→ 以Di为新样本集,创建子节点
  │                    │                   │         │
  │                    │                   │         └─→ 继续处理下一个属性值
  │                    │                   │
  │                    │                   └─→ 所有属性值处理完毕 → 返回当前节点 → 结束

构造决策树需要解决两个核心问题:如何选择属性进行划分,以及何时停止划分。

  1. 属性选择方法包括ID3的信息增益、C4.5的增益率、CART的基尼系数。
  2. 停止划分的方法包括预剪枝(定义停止条件)和后剪枝(生成完全树后再剪枝)。
1.3 熵与信息论基础

关键词:熵、信息量、信息增益

  1. 熵的概念:从热力学到信息论
  2. 根据比例算自信息:概率越大自信息越少
  3. 信息增益:增益越大,分类准确性越大

熵的概念最初来自热力学。1865年克劳修斯引入熵定量阐明热力学第二定律,指出在孤立系统内,熵只增不减。1872年玻耳兹曼推导了玻耳兹曼关系式,赋予熵统计解释:熵代表系统的混乱程度,熵增加的过程正是系统无序度增加的过程。

1929年西拉德发现了熵与信息的关系。信息与负熵相当,若不做功而使系统熵减少,就意味着必须获得信息。自信息是信息的度量单位,用来衡量单一事件发生时所包含的信息量。概率越大的事件发生后所产生的自信息越少,概率越小的事件发生后所包含的自信息越多。

自信息、熵、信息增益

自信息(self-information)是信息的度量单位,用来衡量单一事件发生时所包含的信息量多寡,所接收到的自信息的量与具体发生的事件有关,自信息的大小与随机事件的概率有关,具体来说:

在决策树中,如果待分类的数据集D中第i类样本所占的比例为P(xi)则第i类的自信息为 − l o g P ( x i ) -log P(xi) −logP(xi)。所有类别的信息期望值(熵)为: e n t r o p y ( D ) = − Σ P ( x i ) l o g P ( x i ) entropy(D) = -Σ P(xi) log P(xi) entropy(D)=−ΣP(xi)logP(xi)。信息增益是指以某特征划分数据集前后的熵的差值,信息增益越大,表示所使用的特征划分得到的分类准确性提升越大。

1.4 ID3算法:信息增益最大来进行属性分割

关键词

  1. 分裂节点:信息增益最大的属性;
  2. 多叉树、递归分裂

ID3算法使用信息增益作为属性选择标准。算法从根节点开始,计算所有属性的信息增益,选择信息增益最大的属性作为分裂节点。在产生的子节点上继续递归地应用相同过程,直到满足停止条件。

详细示例:天气数据分类问题

假设我们有一个天气数据集,用于预测是否适合进行户外活动。数据集包含14个样本,每个样本有4个属性:天气(晴天、雨天、阴天)、温度(高温、中温、低温)、湿度(高、低)、风力(强、弱)。

数据分布:

14个样本中,9个样本标记为"yes"(适合户外活动),5个样本标记为"no"(不适合户外活动)

最终要将所有样本的标记归为一类。

ID3算法构建决策树示意图(以天气数据为例):

shell 复制代码
第1步:初始数据
┌─────────────────────────┐
│  全部样本: 9个yes, 5个no  │
│  计算各属性信息增益:       │
│  • 天气: 增益最大 ✓       │
│  • 温度: 增益较小         │
│  • 湿度: 增益较小         │
│  • 风力: 增益较小         │
└─────────────────────────┘
           │
           │ 选择"天气"作为根节点
           ▼
第2步:按天气属性值划分
        ┌─────天气─────┐
        │               │               │
     [晴天]          [雨天]          [阴天]
        │               │               │
    (样本子集1)    (样本子集2)    (样本子集3)
        │               │               │
        ▼               ▼               ▼
第3步:对每个分支递归处理(详细过程)

【分支1:晴天子集】
┌─────────────────────────┐
│ 晴天样本: 假设5个yes, 2个no │
│ 剩余属性: 温度、湿度、风力   │
│ 计算信息增益:              │
│ • 温度: 增益最大 ✓        │
│ • 湿度: 增益较小          │
│ • 风力: 增益较小          │
└─────────────────────────┘
           │
           │ 选择"温度"作为分裂属性
           ▼
        ┌─────温度─────┐
        │               │
     [高温]          [低温]
        │               │
    (3yes,0no)    (2yes,2no)
        │               │
        ▼               ▼
     [叶节点yes]    [继续分裂]
                      │
                      │ 选择"湿度"分裂
                      ▼
                   ┌─────湿度─────┐
                   │               │
                [高]            [低]
                   │               │
              (1yes,1no)      (1yes,1no)
                   │               │
                   ▼               ▼
              [叶节点:多数类]  [叶节点:多数类]

【分支2:雨天子集】
┌─────────────────────────┐
│ 雨天样本: 假设1个yes, 3个no │
│ 剩余属性: 温度、湿度、风力   │
│ 计算信息增益:              │
│ • 湿度: 增益最大 ✓        │
│ • 温度: 增益较小          │
│ • 风力: 增益较小          │
└─────────────────────────┘
           │
           │ 选择"湿度"作为分裂属性
           ▼
        ┌─────湿度─────┐
        │               │
     [高]            [低]
        │               │
    (0yes,2no)    (1yes,1no)
        │               │
        ▼               ▼
     [叶节点no]    [继续分裂]
                      │
                      │ 选择"风力"分裂
                      ▼
                   ┌─────风力─────┐
                   │               │
                [强]            [弱]
                   │               │
              (0yes,1no)      (1yes,0no)
                   │               │
                   ▼               ▼
              [叶节点no]      [叶节点yes]

【分支3:阴天子集】
┌─────────────────────────┐
│ 阴天样本: 假设3个yes, 0个no │
│ 所有样本属于同一类(yes)    │
│ → 停止分裂,直接返回叶节点  │
└─────────────────────────┘
           │
           ▼
      [叶节点yes]

最终决策树结构:
                   天气
                 /  |  \
            [晴天] [雨天] [阴天]
             /      |      \
          温度    湿度     yes
          /  \    /  \
      高温  低温 高   低
        |    |   |    |
       yes  湿度 no  风力
            /  \      /  \
          高   低   强   弱
          |    |    |    |
        yes  yes  no  yes
1.5 CART算法与基尼系数:数据集纯度

关键词

  1. 基尼系数代表数据集纯度(越小越纯)
  2. 基于基尼系数划分特征,构造二叉树

基尼系数(Gini index)也称为基尼不纯度(Gini impurity),是指从数据集D中随机抽取两次样本,其类别标记不一致的概率。基尼系数的值越小,则数据集D的纯度越高。

  1. 基尼系数的计算公式为:

如果数据集 D 根据特征 A 的某个值 a,把 D 分成 m 个部分,则在特征 A的条件下,D 的基尼系数表达式为

  1. CART算法是分类与回归树算法,构造二叉树,选取使得划分后基尼系数最小的特征作为最优划分特征。
1.6 决策树剪枝

关键词

  1. 异常点(噪声数据与孤立点)与过拟合
  2. 预剪枝、后剪枝、

训练数据中存在大量的噪声或孤立点时,许多分枝反映的是训练数据中的异常,导致过拟合。

剪枝

  1. 剪枝是指从已经生成的树上裁掉一些子树或叶结点,并将其根结点或父结点作为新的叶子结点,从而简化分类树模型。

  2. 预剪枝(pre-pruning)是定义一个停止树进一步生长的条件,可以是

    • 指定的树的深度
    • 指定的结点中样本的个数
    • 不纯度指标下降到某个指定的幅度
  3. 后剪枝(post-pruning)是在生成完全的树后再进行剪枝,将原样本集合或新数据集合作为测试数据,如果剪掉某个子树后的决策树对测试数据的预测精度或其他测度不降低,那么剪掉该子树。

1.7 决策树特点与应用

关键词

  1. 原理:超平面划分
  2. 探测式知识发现
  3. 以过拟合,特征之间关联性差

特点:

  1. 决策树方法的原理是使用单个属性的超平面对输入的空间进行反复递归划分,从而将各个类别的实例区分开。
  2. 决策树的构造不需要任何领域知识或参数设置,适合于探测式知识发现。
  3. 决策树可以处理数值型和名词型等高维数据,处理速度相对较快。
  4. 获取的知识以树的形式表示比较直观,容易被人理解。

决策树的缺点包括:

  1. 难以处理数据缺失的情况,容易过拟合
  2. 树形结构难以突出特征之间的相关性

第二部分:惰性学习(Lazy Learner)

2.1 急切学习与惰性学习

关键词:急切学习、惰性学习、基于实例的学习、延迟泛化

急切学习法(eager learner)在接收新测试元组之前就已经构造泛化模型(即预测模型)。惰性学习法(lazy learner)只简单存储(或是稍加处理)训练元组,仅当接收到检验元组时,才泛化模型,以便根据存储的训练元组的相似性对该元组进行预测。

惰性学习法也称为基于实例的学习,包括:

  1. Rote分类器(仅当未知样本与训练样本完全匹配时才进行分类,死记硬背)、
  2. 基于案例的推理分类(使用一个问题解的数据库来求解新问题,存储解决方案而非存储元组)、
  3. k-最近邻分类法(样本被识别为到它的k个最近邻中的多数类,多者为王)。
2.2 k-最近邻分类法(kNN)

关键词

  1. 近朱者赤近墨者黑:k个最接近对象的训练对象+主导类别
  2. Voronoi图

k-最近邻分类法(k-nearest-neighbor classifier,kNN)从训练集中找出k个最接近测试对象的训练对象,再从这k个训练对象中找出居于主导的类别,将其赋给测试对象。这个思想可以用"近朱者赤,近墨者黑"来理解。

在20世纪50年代,Fix和Hodges首次提出最近邻分类思想。在20世纪60年代计算能力大大增强之后得到广泛应用。在二维情况下,最近邻规则算法使得二维空间被分割成了许多Voronoi网格,每个网格代表的类别就是它所包含的训练样本所属的类别。

输入: 测试样本x, 训练集D, k值 计算x与D中所有训练样本的距离 按距离从小到大排序 选择前k个最近邻样本 统计k个最近邻中各类别的出现次数 返回出现次数最多的类别

2.3 距离度量方法

关键词:欧几里德距离、曼哈顿距离、闵可夫斯基距离、数据规范化

"最近邻"的定义需要计算距离。常用的距离度量方法包括:

  • 欧几里德距离(向量的2范数):$dist(X1,X2) = √(Σ(x1i-x2i)²)
  • 曼哈顿距离(向量的1范数):dist(X1,X2) = Σ|x1i-x2i|
  • 切比雪夫距离(向量的∞范数):dist(X1,X2) = max|x1i-x2i|
  • 闵可夫斯基距离 (向量的p范数):dist(X1,X2) = (Σ|x1i-x2i|p)(1/p)

闵可夫斯基距离的缺点是将各个分量的量纲视为相同,没有考虑各个分量的分布(均值、方差等)存在差异的情况。例如,身高相差20cm与体重相差20kg往往并不等价。因此需要进行数据规范化(归一化),常用的方法包括最小-最大规范化、Z-score标准化等。

标准化欧氏距离将各个分量都"标准化"到均值、方差相等。通常欧几里德距离是一个很好的折中方法,但在某些特殊场合,其他的距离度量法也许更为适合。

2.4 k值选择与分类决策

关键词

  1. k值选择的艺术:
  2. 分类决策:多数表决,经验分险最小化规则

k值的选择影响分类性能。从k=1开始,使用检验集估计分类器的错误率,选取产生最小错误率的k。

  1. k太小容易受到噪声影响形成过拟合;
  2. . k太大会包含远离其近邻的数据点,模型变得过于简单,造成误分类。

对于小数据集k=1常常会得到比其他值好的结果,但在样本非常充足的情况下,选择较大的k值则能提高抗噪能力。

分类决策规则一般采用多数表决的方式,即由k个近邻训练数据中多数类决定输入数据所属的类。

多数表决规则等价于经验风险最小化规则。随着元组数趋向于无穷并且k=1,错误率不会超过贝叶斯错误率的2倍。如果k也趋向于无穷,则错误率趋向于贝叶斯错误率。

2.5 kD树索引结构

关键词

  1. kD树:数据库索引、平衡二叉树(提高搜索效率)
  2. 构建kD树:分割特征、分割点、超平面划分区域、继续切分

kD树是k-Dimension树的简称,是一种查询索引结构,广泛应用于数据库索引中。它是对数据点在k维空间中进行划分的一种数据结构,主要应用于多维空间关键数据的搜索 (如范围搜索和最近邻搜索)。kD树本质上是一种平衡二叉树,目的是提高数据查找的效率。kD树是一种空间划分树,将整个向量空间划分为特定的几个部分。

构建kD树时,

  1. 选取方差最大的特征作为分割特征,
  2. 选择分割特征的中位数作为分割点,
  3. 确定一个超平面将当前超矩形区域切分为左、右两个子空间,
  4. 接着递归地对k维空间进行切分,直到子空间内没有数据时终止。

最近邻搜索:

利用kD树可以省去对大部分数据点的搜索,从而减少搜索的计算量。

在搜索最近邻点任务中,给定一个目标点,首先找到包含目标点的叶子结点,然后从该叶子结点出发,依序回溯到父结点,不断查找与目标点最近邻的结点,当确定不可能存在更近的结点时终止。这样搜索就被限制在空间的局部区域上,效率大大提高。

2.6 kNN算法特点

关键词

  1. 局部预测、噪声敏感、
  2. 任意决策边界、增量学习

kNN算法基于局部信息进行预测,因此对噪声非常敏感。因为决策边界依赖训练样例的组合,所以可以生成任意形状的决策边界,提供更加灵活的模型表示。kNN适用于多类分类问题和多标签分类问题。

kNN算法面临的主要问题是运算速度慢。提高运算速度的方法包括:

  • 数据压缩(降维、部分距离方法、删除冗余样本、编辑)、
  • 构建高效的索引技术(kD树、ball tree、metric tree)。

kNN适用于增量学习(Incremental learning)、在线学习(On-line learning)。

相关推荐
ghie90901 小时前
ART 和SART 医学CT重建迭代重建算法
人工智能·算法·计算机视觉
熊猫_豆豆1 小时前
基于改进沙猫群优化算法的Otsu图像分割
人工智能·算法·计算机视觉
QBoson1 小时前
EP-GAT革新股票预测:能量建模 + 并行注意力精准捕捉市场动态
人工智能·深度学习·机器学习
吃着火锅x唱着歌1 小时前
LeetCode 624.数组列表中的最大距离
数据结构·算法·leetcode
nnerddboy1 小时前
美赛备战:数学建模中的微分方程问题
人工智能·机器学习
im_AMBER1 小时前
Leetcode 64 大小为 K 且平均值大于等于阈值的子数组数目
笔记·学习·算法·leetcode
AndrewHZ1 小时前
【图像处理基石】什么是图像处理中的注意力机制?
图像处理·pytorch·深度学习·算法·计算机视觉·注意力机制·通道注意力
DuHz1 小时前
通感一体化(ISAC)波形设计的实验验证研究——论文阅读
论文阅读·算法·信息与通信·毫米波雷达
CoderYanger1 小时前
递归、搜索与回溯-综合练习:22.优美的排列
java·算法·leetcode·深度优先·1024程序员节
weixin_429630261 小时前
第8章 集成学习
人工智能·机器学习·集成学习