176 lines
8.3 KiB
Markdown
176 lines
8.3 KiB
Markdown
# 第十三章
|
||
|
||
在统计学习和机器学习中,**原型方法(Prototype Methods)** 是一类基于“代表性样本”进行分类或回归的算法。
|
||
|
||
简单来说,它的核心思想是:**与其记住所有的训练数据,不如选出(或计算出)一组具有代表性的“原型”来概括数据的特征。** 当新样本出现时,通过比较它与这些原型的相似度来进行决策。
|
||
|
||
---
|
||
|
||
### 1. 原型方法的核心逻辑
|
||
|
||
在传统的 $k$-最近邻($k$-NN)算法中,我们需要存储所有训练样本,这被称为“基于记忆的学习”。而原型方法是对其的优化,它试图找到一组数量更少的点(原型),并满足:
|
||
|
||
- **压缩性:** 原型的数量远小于原始数据集的大小。
|
||
|
||
- **代表性:** 原型能够刻画数据在空间中的分布和边界。
|
||
|
||
|
||
当判定一个新样本 $x$ 的类别时,系统会计算 $x$ 到各个原型的距离(通常是欧氏距离),将其归类为距离最近的原型所属的类别。
|
||
|
||
---
|
||
|
||
### 2. 常见的具体算法
|
||
|
||
原型方法并不是一个单一的算法,而是一类方法的统称:
|
||
|
||
#### K-均值聚类 (K-Means Clustering)
|
||
|
||
- **原理:** 虽然通常被视为无监督学习,但 K-Means 是典型的原型方法。每个簇的质心(Centroid)就是该簇的原型。
|
||
|
||
- **作用:** 用 $K$ 个点来代表成千上万个数据点。
|
||
|
||
|
||
#### 学习向量量化 (Learning Vector Quantization, LVQ)
|
||
|
||
- **原理:** 这是一种有监督的原型方法。它在空间中初始化一组原型点,并根据分类标签不断调整这些点的位置。
|
||
|
||
- **逻辑:** 如果一个原型正确预测了样本,就让它向样本靠近;如果预测错误,就让它远离样本。最终,原型点会停留在各类别最理想的中心位置。
|
||
|
||
|
||
#### 质心分类器 (Nearest Centroid Classifier)
|
||
|
||
- **原理:** 计算每个类别的平均值作为该类的唯一原型。
|
||
|
||
- **应用:** 常用于文本分类或基因表达谱分析,虽然简单,但在高维稀疏数据中表现出奇地好。
|
||
|
||
|
||
#### 原型聚类 (Prototype-based Clustering)
|
||
|
||
- 如 **K-Medoids**,它要求原型必须是原始数据集中的某一个真实样本点,而不是像 K-Means 那样计算出的虚拟平均值。
|
||
|
||
|
||
---
|
||
|
||
### 3. 原型方法是干什么的?(主要用途)
|
||
|
||
1. **数据压缩:** 减少存储需求。对于嵌入式设备或实时系统,存储几百万个点不现实,但存储 100 个原型非常轻松。
|
||
|
||
2. **降噪:** 原始数据可能包含异常值。通过计算原型(如取平均),可以抵消掉个别噪声点的干扰。
|
||
|
||
3. **提高预测速度:** 相比 $k$-NN 需要扫描整个数据库,原型方法只需对比极少数的原型,推理延迟极低。
|
||
|
||
4. **可解释性:** 我们可以直接观察原型。例如,“这个病人被诊断为感冒,是因为他的症状原型与典型的感冒病例最接近。”
|
||
|
||
|
||
---
|
||
|
||
### 4. 具体应用场景
|
||
|
||
- **计算机视觉(OCR):** 在手写数字识别中,可以为数字 "0-9" 每一个数字提取出几个“标准字体”作为原型。
|
||
|
||
- **异常检测:** 在工业监控中,建立“正常运行状态”的原型。如果新数据与这些原型的距离超过阈值,则触发报警。
|
||
|
||
- **生物信息学:** 用于蛋白质序列分类或基因功能预测,通过寻找同一家族序列的“共性原型”来简化计算。
|
||
|
||
- **自然语言处理:** 在词向量(Word Embeddings)空间中,通过原型来表示某种语义中心(如“水果”类的中心)。
|
||
|
||
|
||
---
|
||
|
||
### 总结
|
||
|
||
**原型方法**就像是给数据找“典型代表”。它在**计算效率**和**模型复杂性**之间做了一个很好的平衡。如果你追求极致的预测速度,或者设备内存受限,原型方法(尤其是 LVQ)通常是比全量 $k$-NN 更好的选择。
|
||
|
||
|
||
在原型方法(Prototype Methods)的框架下,这些算法的核心差异在于**原型是如何生成的**以及**如何利用这些原型进行决策**。
|
||
|
||
以下是针对这几种方法的详细解析:
|
||
|
||
---
|
||
|
||
### 1. K-最邻近分类器 (k-Nearest Neighbors, k-NN)
|
||
|
||
虽然 k-NN 常被视为原型方法的对立面(它是“基于记忆”的),但从广义上讲,它将**每一个训练样本都视为一个原型**。
|
||
|
||
- **使用方式:**
|
||
|
||
- **存储阶段:** 几乎不做任何计算,直接将所有训练样本(特征向量和标签)存入内存。
|
||
|
||
- **预测阶段:** 计算待测样本与库中所有样本的距离。选取距离最近的 $k$ 个点,通过“投票法”(分类)或“平均值法”(回归)得出结果。
|
||
|
||
- **优缺点:** 逻辑极简,不需要假设数据分布;但当数据量巨大时,查询速度极慢(即“维度灾难”),且对噪声非常敏感。
|
||
|
||
|
||
### 2. K-均值聚类 (K-Means Clustering)
|
||
|
||
这是无监督学习中最著名的原型方法,它的原型是**质心(Centroids)**。
|
||
|
||
- **使用方式:**
|
||
|
||
1. **初始化:** 随机选择 $K$ 个点作为初始质心。
|
||
|
||
2. **分配:** 将每个数据点分配给距离其最近的质心,形成 $K$ 个簇。
|
||
|
||
3. **更新:** 重新计算每个簇内所有点的平均值,将该平均值设为新的质心(即新的原型)。
|
||
|
||
4. **迭代:** 重复上述步骤直到质心不再变化。
|
||
|
||
- **原型意义:** 最终的 $K$ 个质心就是该数据集的“压缩版”。在很多工程应用中,我们会用这 $K$ 个质心来代替原始的成千上万个点进行后续处理。
|
||
|
||
|
||
### 3. 学习向量量化 (Learning Vector Quantization, LVQ)
|
||
|
||
这是一种**自适应**的有监督原型方法,通常被认为是在有标签数据下改进 K-Means 的手段。
|
||
|
||
- **使用方式:**
|
||
|
||
1. **预设原型:** 在每一类数据中预设若干个原型点(位置可以是随机的或用 K-Means 初始化的)。
|
||
|
||
2. **在线学习(自适应):** 每次输入一个带标签的样本 $x$。
|
||
|
||
3. **竞争:** 找到离 $x$ 最近的原型 $W$。
|
||
|
||
4. **调整:**
|
||
|
||
- 如果 $W$ 的标签与 $x$ 一致:$W$ 向 $x$ 方向移动(学习特征)。
|
||
|
||
- 如果 $W$ 的标签与 $x$ 不一致:$W$ 向远离 $x$ 的方向推开(强化边界)。
|
||
|
||
- **特点:** 它通过不断“微调”原型的位置,使得原型能够精准地捕捉类别的判定边界。
|
||
|
||
|
||
### 4. 其他常见的原型方法
|
||
|
||
#### A. K-中心点 (K-Medoids)
|
||
|
||
- **差异:** K-Means 的原型是计算出来的“平均值”(可能在现实中不存在),而 K-Medoids 要求原型**必须是原始数据中的某个真实样本**。
|
||
|
||
- **使用方式:** 寻找一个样本点,使得簇内其他点到它的总距离最小。这在处理非数值型数据(如地理位置、社交关系)时非常有效,且对异常点(Outliers)的鲁棒性比 K-Means 强。
|
||
|
||
|
||
#### B. 缩减最近邻法 (Reduced Nearest Neighbor, RNN)
|
||
|
||
- **使用方式:** 这是一种对 k-NN 的“瘦身”方案。它从原始训练集中不断删除那些“删掉也不影响分类准确率”的样本。
|
||
|
||
- **目的:** 最终留下的样本就是支撑分类边界的关键原型。这大大降低了 k-NN 的存储和计算开销。
|
||
|
||
|
||
#### C. 高斯混合模型 (Gaussian Mixture Models, GMM)
|
||
|
||
- **使用方式:** 它可以看作是 K-Means 的概率版。它的原型不再是一个孤立的点,而是一个**概率分布(均值和方差)**。
|
||
|
||
- **逻辑:** 它假设数据是由多个高斯分布组合而成的,通过 EM 算法学习每个分布的参数。
|
||
|
||
|
||
---
|
||
|
||
### 总结对比
|
||
|
||
|**方法**|**原型性质**|**是否有监督**|**核心用途**|
|
||
|---|---|---|---|
|
||
|**k-NN**|每一个原始样本点|有监督|基准分类、回归|
|
||
|**K-Means**|簇的质心(虚拟点)|无监督|数据压缩、聚类分析|
|
||
|**LVQ**|调整后的分类代表点|有监督|高效分类、边界学习|
|
||
|**K-Medoids**|簇中最具代表的真实样本|无监督|鲁棒聚类、非欧几里得空间|
|
||
|
||
在你的 C++ 或 Rust 开发实践中,如果你需要处理高性能的实时判别(比如你提到的 HIS 系统或健康监测),**LVQ** 或 **经过压缩的 k-NN** 通常比纯 k-NN 更有优势,因为它们能极大地减少 CPU 在推理时的计算负担。 |