不用框架,Python實現手寫數字識別
有一句話說得好,要有造輪子的技術和用輪子的覺悟,今年來人工智慧火的不行,大家都爭相學習機器學習,作為學習大軍中的一員,我覺得最好的學習方法就是用python把機器學習演算法實現一遍,下面我介紹一下用邏輯迴歸實現手寫字型的識別。
邏輯迴歸知識點回顧
線性迴歸簡單又易用,可以進行值的預測,但是不擅長分類。在此基礎上進行延伸,把預測的結果和概率結合起來就可以做分類器了,比如預測值大於0.5,則歸為1類,否則就歸為0類,這個就是邏輯迴歸演算法了。邏輯迴歸主要解決的就是二分類問題,比如判斷圖片上是否一隻貓,郵件是否垃圾郵件等。
由於邏輯迴歸的結果是概率值,為0-1之間,因此需要線上性迴歸的結果上增加一次運算,使得最後的預測結果在0到1之間。
Sigmoid函式,表示式為:
sigmoid的輸出在0和1之間,我們在二分類任務中,採用sigmoid的輸出的是事件概率,也就是當輸出滿足滿足某一概率條件我們將其劃分正類。
結合了sigmoid函式,把線性迴歸的結果概率化,得到預測函式為,。當概率大於0.5時為1類,否則判定位0類。
接下來我們開始使用邏輯迴歸進行手寫字型的識別!
檢視手寫字型資料
此次使用的是5000條手寫數字的資料。一條訓練資料是20px*20px圖片的資料,每一個畫素點是代表灰度值。我們檢視一下前100條手寫資料,如下圖:
資料集下載地址:
定義向量化的預測函式
首先我們定義預測函式 ,k是引數的個數。
寫成向量化的形式為:
, ,g(z)是啟用函式(sigmoid function)
def h(mytheta,myX):
#expit是scipy庫中向量化sigmoid函式的計算函式
return expit(np.dot(myX, mytheta))
預測函式中的值是未知的,接下來的任務就是要根據訓練集,求解出的值。
計算代價函式(Cost Function)
線上性迴歸中的最小二乘法,求解引數就是最小化殘差平方和,也就是代價函式。代價函式是度量預測錯誤的程度,邏輯迴歸的代價函式為對數似然函式,
等價於:
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) )
使得預測錯誤的程度最低,即使得最小,此時我們把問題轉為最優化問題。
下面介紹一種求解最優化的演算法:梯度下降。從初始位置每次向梯度方向(就是下降速度最快的方向)邁一小步,一直走到最低點。想象你在下山,你朝著當前位置下降最快的方向走一步。
計算梯度
經過數學運算可以得出