【Python】利用高斯朴素贝叶斯模型实现光学字符识别

本文介绍了使用Python的Scikit-Learn库实现光学字符识别(OCR),特别是手写数字识别。通过加载和可视化MNIST数据集,进行无监督学习的降维处理,然后应用高斯朴素贝叶斯模型进行分类,最终实现超过80%的识别准确率。混淆矩阵显示主要的误判集中在数字2与其他数字的区分上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

光学字符识别问题:手写数字识别。简单点说,这个问题包括图像中字符的定位和识别两部分。为了演示方便,我们选择使用 Scikit-Learn 中自带的手写数字数据集。
1.加载并可视化手写数字
首先用 Scikit-Learn 的数据获取接口加载数据,并简单统计一下:

>>>from sklearn.datasets import load_digits
>>>digits = load_digits()
>>>digits.images.shape
(1797, 8, 8)

这份图像数据是一个三维矩阵:共有 1797 个样本,每张图像都是 8 像素 ×8 像素。对前100 张图进行可视化:

>>>import matplotlib.pyplot as plt
>>>fig,axes = plt.subplots(10,10, figsize=(8, 8),subplot_kw={'xticks':[], 'yticks':[]},gridspec_kw=dict(hspace=0.1, wspace=0.1))
>>>for i, ax in enumerate(axes.flat):
    ax.imshow(digits.images[i], cmap='binary', interpolation='nearest')
    ax.text(0.05, 0.05, str(digits.target[i]),transform=ax.transAxes, color='green')

在这里插入图片描述
为了在 Scikit-Learn 中使用数据,需要一个维度为 [n_samples, n_features] 的二维特征矩阵——可以将每个样本图像的所有像素都作为特征,也

### 实现多项式朴素贝叶斯高斯朴素贝叶斯分类器 #### 数据准备 为了实现这两种分类器,首先需要加载并预处理蘑菇数据集。假设该数据集中包含了描述不同种类蘑菇的各种特征。 ```python import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder from sklearn.naive_bayes import GaussianNB, MultinomialNB from sklearn.metrics import accuracy_score # 加载蘑菇数据集 data = pd.read_csv('mushrooms.csv') # 对类别型变量进行编码转换 label_encoders = {} for column in data.columns: le = LabelEncoder() data[column] = le.fit_transform(data[column]) label_encoders[column] = le X = data.drop(columns=['class']) # 特征列 y = data['class'] # 类别标签 # 划分训练集与测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) ``` #### 使用多项式朴素贝叶斯分类器 对于离散型的数据(如经过Label Encoding后的整数值),可以采用多项式分布来建模各个属性的概率密度函数[^2]。 ```python # 创建并训练Multinomial Naive Bayes模型 mnb = MultinomialNB() # 训练模型 mnb.fit(X_train, y_train) # 预测 predictions_mnb = mnb.predict(X_test) print(f'Multinomial NB Accuracy: {accuracy_score(y_test, predictions_mnb)}') ``` #### 使用高斯朴素贝叶斯分类器 当面对连续型输入变量时,则更适合使用高斯分布作为概率估计的基础;然而,在这个例子中所有的特征都是通过`LabelEncoding`被转化为离散值的形式。因此这里仅作示范说明: ```python # 创建并训练Gaussian Naive Bayes模型 (理论上适用于连续型数据) gnb = GaussianNB() # 训练模型 gnb.fit(X_train, y_train) # 预测 predictions_gnb = gnb.predict(X_test) print(f'Gaussian NB Accuracy: {accuracy_score(y_test, predictions_gnb)}') ``` 需要注意的是,由于蘑菇数据集中的所有字段均为非连续性的字符或符号表示法,所以在实际操作过程中通常会更倾向于选择适合于此类数据结构的算法—即上述提到过的多项式朴素贝叶斯方法[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值