五种机器学习方法深度比较与案例实现(以手写数字识别为例)
正如人们有各种各样的学习方法一样,机器学习也有多种学习方法。若按学习时所用的方法进行分类,则机器学习可分为机械式学习、指导式学习、示例学习、类比学习、解释学习等。这是温斯顿在1977年提出的一种分类方法。
有关机器学习的基本概念,可看我文章:机器学习的基本概念-CSDN博客
有关机械式学习,可看我文章:机器学习之一:机械式学习-CSDN博客
有关指导式学习,可看我文章:机器学习之二:指导式学习-CSDN博客
有关归纳学习,可看我文章:机器学习之三:归纳学习-CSDN博客
有关类比学习,可看我文章:机器学习之四:类比学习-CSDN博客
有关解释学习,可看我文章:机器学习之五:基于解释的学习-CSDN博客
不知不觉间,我们已经探讨完了五种机器学习方法。
本文对五种机器学习方法进行深度比较,并在同一个案例下区分它们,这里选择手写数字识别作为案例,因为它直观且适合多种方法演示,再用Python代码实现。
一、五种方法核心对比表
先回顾一下每种方法的核心特点:
(1)机械式学习:直接存储输入输出对,查询时匹配。适合小规模、固定输入的场景,如简单映射。
(2)指导式学习:监督学习,使用带标签数据训练模型,如逻辑回归、神经网络。
(3)归纳学习:从实例中归纳规则,如决策树,通过信息增益分裂节点。
(4)类比学习:通过相似性迁移,如 k-NN,计算最近邻预测。
(5)基于解释的学习:利用领域知识构造解释,生成泛化规则,需要手动定义规则。
以下从核心思想、学习方式、模型表示、泛化能力、领域知识依赖、典型算法、数据效率、可解释性等维度进行深度比较:
维度 | 机械式学习 | 指导式学习 | 归纳学习 | 类比学习 | 基于解释的学习 |
核心思想 | 记忆存储与直接检索 | 带标签数据驱动的函数拟合 | 从实例归纳普遍规则 | 相似案例迁移 | 领域知识引导的解释泛化 |
学习方式 | 无学习过程,仅存储实例 | 监督学习(数据 + 标签) | 无监督 / 弱监督的规则提取 | 基于相似度的案例推理 | 逻辑解释驱动的知识提炼 |
模型表示 | 记忆表 / 哈希表 | 参数化模型(如神经网络) | 符号规则 / 决策树 | 案例库 + 相似度度量 | 逻辑规则 / 证明树 |
泛化能力 | 仅能处理已知输入 | 统计泛化(依赖数据分布) | 规则泛化(依赖归纳偏置) | 相似性泛化(依赖相似度函数) | 逻辑泛化(依赖领域理论) |
领域知识依赖 | 无 | 低(仅需标签) | 中(特征工程) | 中(相似度定义) | 高(需完整领域理论) |
典型算法 | 查表法、最近邻(精确匹配) | 逻辑回归、CNN | ID3、决策树、关联规则 | k-NN、迁移学习 | PROLOG-EBG、规则归纳 |
数据效率 | 低(需存储所有实例) | 中(依赖样本量) | 中(少量实例可归纳) | 中(需案例库) | 高(单个实例可泛化) |
可解释性 | 高(直接查看记忆表) | 低(黑箱模型) | 高(规则透明) | 中(相似度计算可解释) | 极高(逻辑证明可追溯) |
二、统一案例:手写数字识别(MNIST数据集)
(一)案例背景
为了更好的比较五种方法的区别,统一案例为手写数字识别,预处理数据,分别实现五种方法。需要注意每种方法的适用场景和实现差异,比如机械式学习只能处理见过的样本,而指导式学习可以泛化。
案例背景:识别 28x28 像素的手写数字图像(0-9),输入为 784 维像素向量,输出为数字类别。以下通过五种方法实现并对比。
(二)数据预处理(通用步骤)
首先加载MNIST数据集,预处理数据。然后分别实现五种方法:
(1)机械式学习:建立字典存储训练数据,预测时查找最近邻(这里简化为精确匹配,实际可能需要相似度计算)。
(2)指导式学习:使用逻辑回归作为代表,训练模型并预测。
(3)归纳学习:实现决策树,基于信息增益构建模型。
(4)类比学习:k-NN 算法,计算欧氏距离找最近邻。
(5)基于解释的学习:手动定义规则,比如基于像素值的简单规则,这里简化示例。
预处理数据的python代码如下:
import numpy as npfrom sklearn.datasets import fetch_openmlfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerfrom sklearn.metrics import accuracy_score# 加载MNIST数据集mnist = fetch_openml('mnist_784', version=1, as_frame=False)X, y = mnist.data, mnist.target.astype(int)X = X / 255.0 # 归一化像素值到[0,1]X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
(三)五种方法代码实现与案例区分
1. 机械式学习(Rote Learning)
核心逻辑:存储训练实例,预测时通过精确匹配或最近邻检索(简化为精确匹配,实际需相似度计算)。
局限性:仅能识别训练中完全相同的图像,无法处理新变体。
python代码如下:
class RoteLearner:def __init__(self):self.memory = {} # 存储实例:键为图像向量,值为标签def fit(self, X, y):# 为简化,仅存储前1000个训练实例(实际需存储所有,此处防内存溢出)for x, label in zip(X[:1000], y[:1000]):self.memory[tuple(x.flatten())] = labeldef predict(self, X):y_pred = []for x in X:key = tuple(x.flatten())# 查找最接近的实例(简化为精确匹配,实际需计算距离)# 此处仅演示,实际应使用k-NN等相似度检索label = self.memory.get(key, -1) # 未匹配返回-1y_pred.append(label)return np.array(y_pred)# 实例化与测试rote_learner = RoteLearner()rote_learner.fit(X_train, y_train)y_rote_pred = rote_learner.predict(X_test)rote_accuracy = accuracy_score(y_test, y_rote_pred)print(f"机械式学习准确率: {rote_accuracy:.2%}") # 通常极低,因难有完全相同图像
案例表现:仅能识别训练中完全重复的图像,准确率接近 0%(因MNIST无重复图像),实际需结合相似度(如k-NN),但本质仍是记忆检索。
2. 指导式学习(Supervised Learning,以逻辑回归为例)
核心逻辑:使用带标签数据训练模型,最小化交叉熵损失,学习像素到类别的映射。
python代码如下:
from sklearn.linear_model import LogisticRegression# 标准化数据(逻辑回归对尺度敏感)scaler = StandardScaler()X_train_scaled = scaler.fit_transform(X_train)X_test_scaled = scaler.transform(X_test)# 训练逻辑回归模型lr = LogisticRegression(max_iter=1000, multi_class='ovr')lr.fit(X_train_scaled, y_train)y_lr_pred = lr.predict(X_test_scaled)lr_accuracy = accuracy_score(y_test, y_lr_pred)print(f"指导式学习(逻辑回归)准确率: {lr_accuracy:.2%}") # 约92%
案例表现:通过统计学习像素模式,能泛化未见过的图像,准确率随数据量和模型复杂度提升(如 CNN 可到 99%)。
3. 归纳学习(Inductive Learning,以决策树为例)
核心逻辑:通过信息增益归纳决策规则,构建树状结构,如“若像素 (10,10)>0.5 则为数字 9”。
python代码如下:
from sklearn.tree import DecisionTreeClassifierfrom sklearn.tree import export_graphvizimport graphviz# 训练决策树dt = DecisionTreeClassifier(max_depth=5, random_state=42)dt.fit(X_train, y_train)y_dt_pred = dt.predict(X_test)dt_accuracy = accuracy_score(y_test, y_dt_pred)print(f"归纳学习(决策树)准确率: {dt_accuracy:.2%}") # 约65%# 将feature_names转换为字符串列表feature_names = [str(i) for i in range(784)]# 将class_names转换为字符串列表class_names = [str(i) for i in range(10)]# 导出决策树为.dot文件dot_data = export_graphviz(dt, out_file=None, feature_names=feature_names, class_names=class_names, filled=True)# 使用graphviz库将.dot数据转换为图形graph = graphviz.Source(dot_data)# 保存为PNG图片graph.render('digit_tree', format='png', cleanup=True, view=True)
案例表现:生成可解释的规则(如“像素 (5,5)>0.3 且像素 (15,15)<0.2 则为 0”),但易过拟合,需剪枝。
graphviz官网:https://graphviz.org/download/
安装graphviz之后并同步安装graphviz包(pip install graphviz),就可以得到如下可视化决策树。
4. 类比学习(Analogical Learning,以 k-NN 为例)
核心逻辑:计算测试图像与训练图像的欧氏距离,取最近 k 个邻居的多数标签作为预测。
python代码如下:
from sklearn.neighbors import KNeighborsClassifier# 训练k-NN模型(k=5)knn = KNeighborsClassifier(n_neighbors=5, metric='euclidean')knn.fit(X_train, y_train)y_knn_pred = knn.predict(X_test)knn_accuracy = accuracy_score(y_test, y_knn_pred)print(f"类比学习(k-NN)准确率: {knn_accuracy:.2%}") # 约97%
案例表现:通过相似度迁移,对变形数字(如倾斜的 3)依赖邻居案例,计算复杂度高(需存储全部训练数据)。
5. 基于解释的学习(Explanation-Based Learning,简化规则示例)
核心逻辑:手动定义领域知识(如“数字 0 的中间像素值低,边缘像素值高”),构造解释并泛化规则。
python代码如下:
class ExplanationBasedLearner:def __init__(self):# 手动定义规则:以数字0为例,假设中心5x5区域像素均值<0.2则为0self.rules = {0: lambda x: np.mean(x[12:16, 12:16]) < 0.2, # 中心5x5区域# 其他数字规则需手动添加,此处仅演示0}def predict(self, X):y_pred = []for x in X:x_reshaped = x.reshape(28, 28)label = -1for digit, rule in self.rules.items():if rule(x_reshaped):label = digitbreak # 假设规则无冲突y_pred.append(label)return np.array(y_pred)# 实例化与测试(仅能识别0,其他返回-1)eb_learner = ExplanationBasedLearner()y_eb_pred = eb_learner.predict(X_test)# 修正预测(未匹配的样本用多数类填充,此处简化)y_eb_pred[y_eb_pred == -1] = 5 # 假设默认预测为5eb_accuracy = accuracy_score(y_test, y_eb_pred)print(f"基于解释的学习准确率: {eb_accuracy:.2%}") # 仅正确识别部分0,约16%
案例表现:依赖人工定义规则,仅能识别符合规则的特例(如清晰的 0),泛化能力差,需完善领域理论(如添加更多数字的几何规则)。
(四)案例结果对比与分析
方法 | 准确率 | 关键因素 | 失败原因 |
机械式学习 | ~0% | 依赖精确匹配,MNIST 无重复图像 | 无法处理新实例,仅适用于固定输入场景 |
指导式学习(LR) | ~92% | 统计泛化,学习像素相关性 | 线性模型无法捕捉复杂非线性模式 |
归纳学习(DT) | ~65% | 规则泛化,树结构解释性强 | 过拟合,特征选择依赖信息增益统计 |
类比学习(k-NN) | ~97% | 相似度迁移,存储所有训练案例 | 计算成本高,依赖案例库规模 |
基于解释的学习 | ~16% | 手动规则,领域知识极不完备 | 规则稀疏,无法覆盖多样实例 |
四、深度总结与适用场景
1. 机械式学习
适用:输入空间有限且固定(如简单映射表、硬件指令集)。
案例局限:手写数字变形多样,无法通过精确匹配识别。
2. 指导式学习
优势:数据驱动,适合大规模标注数据场景(如图像、语音识别)。
案例关键:依赖高质量标签,模型复杂度影响准确率(CNN远优于LR)。
3. 归纳学习
优势:生成可解释规则,适合知识提取(如医疗诊断、金融风控)。
案例局限:决策树易过拟合,需剪枝或集成学习(如随机森林)。
4. 类比学习
优势:无需显式模型,适合小样本学习(如迁移学习、元学习)。
案例关键:相似度度量(如欧氏距离)决定性能,需高效索引(如KD树)。
5. 基于解释的学习
适用:领域知识明确且完整(如专家系统、逻辑推理)。
案例挑战:手写数字的几何规则复杂,人工定义困难,需结合符号逻辑与深度学习(如神经符号系统)。
五、扩展思考:方法融合趋势
(1)指导式 + 归纳学习:决策树集成算法(如XGBoost)结合统计学习与规则归纳。
(2)类比 + 指导式学习:小样本学习(Few-Shot Learning)通过迁移学习(类比)+ 微调(指导)提升泛化。
(3)基于解释的学习 + 深度学习:可解释 AI(XAI)从神经网络提取逻辑规则,弥补黑箱缺陷。
通过同一案例的实现与对比,五种方法的核心差异与适用场景得以清晰展现。实际应用中,需根据数据规模、领域知识、可解释性需求选择合适方法,或采用融合策略突破单一范式的局限。