欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > 五种机器学习方法深度比较与案例实现(以手写数字识别为例)

五种机器学习方法深度比较与案例实现(以手写数字识别为例)

2025/4/30 12:32:43 来源:https://blog.csdn.net/lzm12278828/article/details/147621681  浏览:    关键词:五种机器学习方法深度比较与案例实现(以手写数字识别为例)

        正如人们有各种各样的学习方法一样,机器学习也有多种学习方法。若按学习时所用的方法进行分类,则机器学习可分为机械式学习指导式学习示例学习类比学习解释学习等。这是温斯顿在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)从神经网络提取逻辑规则,弥补黑箱缺陷。

通过同一案例的实现与对比,五种方法的核心差异与适用场景得以清晰展现。实际应用中,需根据数据规模、领域知识、可解释性需求选择合适方法,或采用融合策略突破单一范式的局限。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词