日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發布時間:2023/12/29 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Python】利用高斯朴素贝叶斯模型实现光学字符识别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

光學字符識別問題:手寫數字識別。簡單點說,這個問題包括圖像中字符的定位和識別兩部分。為了演示方便,我們選擇使用 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] 的二維特征矩陣——可以將每個樣本圖像的所有像素都作為特征,也就是將每個數字的 8 像素 ×8 像素平鋪成長度為 64 的一維數組。另外,還需要一個目標數組,用來表示每個數字的真實值(標簽)。這兩份數據已經放在手寫數字數據集的 data 與 target 屬性中,直接使用即可:

>>>X = digits.data >>>X.shape (1797, 64) >>>y = digits.target >>>y.shape (1797, )

2.無監督學習:降維
雖然我們想對具有 64 維參數空間的樣本進行可視化,但是在如此高維度的空間中進行可視化十分困難。因此,我們需要借助無監督學習方法將維度降到二維。這次試試流形學習算法中的 Isomap算法對數據進行降維:

>>>from sklearn.manifold import Isomap >>>iso = Isomap(n_components=2) >>>iso.fit(digits.data) >>>data_projected = iso.transform(digits.data) >>>data_projected.shape (1797, 2)

現在數據已經投影到二維。把數據畫出來,看看從結構中能發現什么:

>>>plt.scatter(data_projected[:, 0], data_projected[:, 1], c=digits.target,edgecolor='none', alpha=0.5,cmap=plt.cm.get_cmap('Spectral',10)) >>>plt.colorbar(label='digit label', ticks=range(10)) >>>plt.clim(-0.5, 9.5)


這幅圖呈現出了非常直觀的效果,讓我們知道數字在 64 維空間中的分離(可識別)程度。雖然有些瑕疵,但從總體上看,各個數字在參數空間中的分離程度還是令人滿意的。這其實告訴我們:用一個非常簡單的有監督分類算法就可以完成任務。下面來演示一下。

3. 數字分類
我們需要找到一個分類算法,對手寫數字進行分類。和前面學習鳶尾花數據一樣,先將數據分成訓練集和測試集,然后用高斯樸素貝葉斯模型來擬合:

>>>from sklearn.model_selection import train_test_split >>>Xtrain,Xtest,ytrain,ytest = train_test_split(X,y,random_state=0) >>>from sklearn.naive_bayes import GaussianNB >>>model = GaussianNB() >>>model.fit(Xtrain,ytrain) >>>y_model = model.predict(Xtest)

模型預測已經完成,現在用模型在訓練集中的正確識別樣本量與總訓練樣本量進行對比,獲得模型的準確率:

>>>from sklearn.metrics import accuracy_score >>>accuracy_score(ytest,y_model) 0.8333333333333334

可以看出,通過一個非常簡單的模型,數字識別率就可以達到 80% 以上!但僅依靠這個指標,我們無法知道模型哪里做得不夠好,解決這個問題的辦法就是用混淆矩陣(confusion matrix)。可以用 Scikit-Learn 計算混淆矩陣,然后用 Seaborn 畫出來:

>>>from sklearn.metrics import confusion_matrix >>>mat = confusion_matrix(ytest,y_model) >>>import seaborn as sns >>>sns.heatmap(mat, square=True, annot=True, cbar=False) >>>plt.xlabel('predicted value') >>>plt.ylabel('true value')


從圖中可以看出,誤判的主要原因在于許多數字 2 被誤判成了數字 1 或數字 8。另一種顯示模型特征的直觀方式是將樣本畫出來,然后把預測標簽放在左下角,用綠色表示預測正確,用紅色表示預測錯誤:

>>>fig, axes = plt.subplots(10, 10, figsize=(8, 8),subplot_kw={'xticks':[], 'yticks':[]},gridspec_kw=dict(hspace=0.1, wspace=0.1)) >>>test_images=Xtest.reshape(-1,8,8) >>>for i, ax in enumerate(axes.flat):ax.imshow(test_images[i], cmap='binary', interpolation='nearest')ax.text(0.05, 0.05, str(y_model[i]),transform=ax.transAxes,color='green' if (ytest[i] == y_model[i]) else 'red')


我們下次再見,如果還有下次的話!!!
歡迎關注微信公眾號:516數據工作室

總結

以上是生活随笔為你收集整理的【Python】利用高斯朴素贝叶斯模型实现光学字符识别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。