1. 程式人生 > >不用框架,Python實現手寫數字識別

不用框架,Python實現手寫數字識別

​ 有一句話說得好,要有造輪子的技術和用輪子的覺悟,今年來人工智慧火的不行,大家都爭相學習機器學習,作為學習大軍中的一員,我覺得最好的學習方法就是用python把機器學習演算法實現一遍,下面我介紹一下用邏輯迴歸實現手寫字型的識別。

邏輯迴歸知識點回顧

​ 線性迴歸簡單又易用hθ(x)=θTx,可以進行值的預測,但是不擅長分類。在此基礎上進行延伸,把預測的結果和概率結合起來就可以做分類器了,比如預測值大於0.5,則歸為1類,否則就歸為0類,這個就是邏輯迴歸演算法了。邏輯迴歸主要解決的就是二分類問題,比如判斷圖片上是否一隻貓,郵件是否垃圾郵件等。

​ 由於邏輯迴歸的結果是概率值,為0-1之間,因此需要線上性迴歸的結果上增加一次運算,使得最後的預測結果在0到1之間。

Sigmoid函式,表示式為:g(z)=11+ez

這裡寫圖片描述

​ sigmoid的輸出在0和1之間,我們在二分類任務中,採用sigmoid的輸出的是事件概率,也就是當輸出滿足滿足某一概率條件我們將其劃分正類。

結合了sigmoid函式,把線性迴歸的結果概率化,得到預測函式為hθ(x(i))=g(θTx(i))g(z)=11+ez。當概率大於0.5時為1類,否則判定位0類。


接下來我們開始使用邏輯迴歸進行手寫字型的識別!

檢視手寫字型資料

​ 此次使用的是5000條手寫數字的資料。一條訓練資料是20px*20px圖片的資料,每一個畫素點是代表灰度值。我們檢視一下前100條手寫資料,如下圖:

前100條手寫資料

資料集下載地址:

定義向量化的預測函式hθ(x)

首先我們定義預測函式hθ(x(i))=g(θ0+θ1x1(i)+θ2x2(i)+...+θkxk(i)) ,k是引數的個數。

寫成向量化的形式為:

hθ(x(i))=g(θTx(i)) , g(z)=11+ez ,g(z)是啟用函式(sigmoid function)

def h(mytheta,myX):
#expit是scipy庫中向量化sigmoid函式的計算函式
    return
expit(np.dot(myX, mytheta))

預測函式中θ的值是未知的,接下來的任務就是要根據訓練集,求解出θ的值。

計算代價函式(Cost Function)

線上性迴歸中的最小二乘法,求解引數θ就是最小化殘差平方和,也就是代價函式J(θ)。代價函式J(θ)是度量預測錯誤的程度,邏輯迴歸的代價函式為對數似然函式,

代價函式

等價於:

J(θ)=1mi=1m[y(i)log(hθ(x(i)))(1y(i))log(1hθ(x(i)))]

def computeCost(mytheta,myX,myy):
    m = len(X) #5000
    term1 = np.dot(-np.array(myy).T,np.log(h(mytheta,myX)))#shape(1,401)
    term2 = np.dot((1-np.array(myy)).T,np.log(1-h(mytheta,myX)))#shape(1,401)
    return float((1./m) * np.sum(term1 - term2) )

使得預測錯誤的程度最低,即使得J(θ)最小,此時我們把問題轉為最優化問題。

下面介紹一種求解最優化的演算法:梯度下降。從初始位置每次向梯度方向(就是下降速度最快的方向)邁一小步,一直走到最低點。想象你在下山,你朝著當前位置下降最快的方向走一步。

計算梯度

經過數學運算可以得出