不用框架,Python識別手寫數字
來自專欄 python實現機器學習演算法139 人贊了文章
有一句話說得好,要有造輪子的技術和用輪子的覺悟
近年來人工智慧火的不行,大家都爭相學習機器學習,作為學習大軍中的一員,我覺得最好的學習方法就是用python把機器學習演算法實現一遍,下面我介紹一下用邏輯回歸實現手寫數字的識別。
邏輯回歸知識點回顧
? 線性回歸簡單又易用 ,可以進行值的預測,但是不擅長分類。在此基礎上進行延伸,把預測的結果和概率結合起來就可以做分類器了,比如預測值大於0.5,則歸為1類,否則就歸為0類,這個就是邏輯回歸演算法了。邏輯回歸主要解決的就是二分類問題,比如判斷圖片上是否一隻貓,郵件是否垃圾郵件等。
? 由於邏輯回歸的結果是概率值,為0-1之間,因此需要在線性回歸的結果上增加一次運算,使得最後的預測結果在0到1之間。
? Sigmoid函數,表達式為:
? sigmoid的輸出在0和1之間,我們在二分類任務中,採用sigmoid的輸出的是事件概率,也就是當輸出滿足滿足某一概率條件我們將其劃分正類。結合了sigmoid函數,把線性回歸的結果概率化,即映射到(0,1)區間上,得到預測函數為 。當概率大於0.5時為1類,否則判定位0類。
? 接下來我們開始使用邏輯回歸進行手寫數字的識別!
讀入手寫數字數據並進行預覽
? 此次使用的是5000條手寫數字的數據。一條訓練數據是20px*20px圖片的數據,每一個像素點是代表灰度值。我們查看一下前100條手寫數據,如下圖:
數據下載地址
定義向量化的預測函數
首先我們定義預測函數 ,k是參數的個數。
寫成向量化的形式為:
,g(z)是激活函數(sigmoid function)
def h(mytheta,myX): return expit(np.dot(myX, mytheta))
預測函數中$ heta$的值是未知的,接下來的任務就是要根據訓練集,求解出θ的值。
計算代價函數(Cost Function)
在線性回歸中的最小二乘法,求解參數θ就是最小化殘差平方和,也就是代價函數J(θ)。代價函數J(θ)是度量預測錯誤的程度,邏輯回歸的代價函數為對數似然函數,
等價於:
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(θ)最小,此時我們把問題轉為最優化問題。
下面介紹一種求解最優化的演算法:梯度下降。從初始位置每次向梯度方向(就是下降速度最快的方向)邁一小步,一直走到最低點。想像你在下山,你朝著當前位置下降最快的方向走一步。
計算梯度
經過數學運算可以得出 。
def costGradient(mytheta,myX,myy): m = myX.shape[0] beta = h(mytheta,myX)-myy.T #shape: (5000,1) grad = (1./m)*np.dot(myX.T,beta) #shape: (401, 5000) return grad #shape: (401, 1)
最小化 求解
這裡我們使用的是高級演算法,scipy中的optimize,求解最小化J(θ)時θ的值。
from scipy import optimizedef optimizeTheta(mytheta,myX,myy): result = optimize.fmin_cg(computeCost, fprime=costGradient, x0=mytheta, args=(myX, myy), maxiter=50, disp=False, full_output=True) return result[0], result[1]
One-VS-All多分類
邏輯回歸擅長二分類問題,因此需要把多分類問題轉換為多個二分類問題進行解決。如下圖,首先把藍色和綠色標記看為一類,紅色記為一類,這樣子就可以用預測函數 計算出新數據為紅色類別的概率,同理也可以計算出新數據為藍色、綠色類別的概率,選擇概率最高的類別作為新數據的預測分類,這就是One-VS-All多分類演算法。
def predictOneVsAll(myTheta,myrow): classes = [10] + list(range(1,10)) hypots = [0]*len(classes) for i in range(len(classes)): hypots[i] = h(myTheta[:,i],myrow) return classes[np.argmax(np.array(hypots))]
預測並計算準確率
計算測試集得到邏輯回歸預測的準確度為 89.1%。抽看第1601個數據觀察預測情況
predictOneVsAll(Theta,X[1600])#3scipy.misc.toimage(X[1600][1:].reshape(20,20).T)
邏輯回歸的預測準確率是89.1%,那麼以邏輯回歸作為神經元的神經網路演算法,是否會更加強大呢,我們下期見!
Github地址:https://github.com/py-bin/mechine_learning_practice/tree/master/ex3
我的博客地址:https://blog.csdn.net/zheng_weibin
推薦閱讀:
※"我去圖書館"搶座助手-python實現
※Python內置函數——getattr
※2. Add Two Numbers
※這或許是對小白最友好的python入門了吧——14,遍歷字典
※【編程開發】Python隱藏屬性