【Python】利用高斯朴素贝叶斯模型实现光学字符识别
光學字符識別問題:手寫數字識別。簡單點說,這個問題包括圖像中字符的定位和識別兩部分。為了演示方便,我們選擇使用 Scikit-Learn 中自帶的手寫數字數據集。
1.加載并可視化手寫數字
首先用 Scikit-Learn 的數據獲取接口加載數據,并簡單統計一下:
這份圖像數據是一個三維矩陣:共有 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 屬性中,直接使用即可:
2.無監督學習:降維
雖然我們想對具有 64 維參數空間的樣本進行可視化,但是在如此高維度的空間中進行可視化十分困難。因此,我們需要借助無監督學習方法將維度降到二維。這次試試流形學習算法中的 Isomap算法對數據進行降維:
現在數據已經投影到二維。把數據畫出來,看看從結構中能發現什么:
>>>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.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。另一種顯示模型特征的直觀方式是將樣本畫出來,然后把預測標簽放在左下角,用綠色表示預測正確,用紅色表示預測錯誤:
我們下次再見,如果還有下次的話!!!
歡迎關注微信公眾號:516數據工作室
總結
以上是生活随笔為你收集整理的【Python】利用高斯朴素贝叶斯模型实现光学字符识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TensorFlow 警告Cause:
- 下一篇: java抢答器代码_分享一下我的51单片