2018年7月5日 星期四

機器學習-筆跡辨識原始碼分享

完整_手寫數字辨識

完整手寫數字辨識(以SVM為例):


step1 訓練、測試資料產生(特徵擷取): 參考scratch程式

step2 模型訓練階段

step3 實際測試階段

※ 讀入訓練資料( 將訓練資料都放到變數 xx 中)

In [130]:
import numpy as np
import winreg
offset = 40
scale = 20
#取得桌面路徑
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER,r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders')
deskTop=winreg.QueryValueEx(key, "Desktop")[0]

x1 = np.loadtxt(deskTop+'/1.txt',delimiter=',',dtype='float') 
print("已讀取 1 訓練資料共{}筆...".format(len(x1)))

x2 = np.loadtxt(deskTop+'/2.txt',delimiter=',',dtype='float')
print("已讀取 2 訓練資料共{}筆...".format(len(x1)))

x3 = np.loadtxt(deskTop+'/3.txt',delimiter=',',dtype='float')
print("已讀取 3 訓練資料共{}筆...".format(len(x1)))

# 將 x1,x2,x3 三個矩陣垂直合併
xx = np.vstack((x1,x2,x3))
已讀取 1 訓練資料共50筆...
已讀取 2 訓練資料共50筆...
已讀取 3 訓練資料共50筆...

※ 產生對應的答案標籤 yy

In [124]:
y1 = np.array([1]*len(x1))
y2 = np.array([2]*len(x2))
y3 = np.array([3]*len(x3))
yy = np.vstack((y1,y2,y3)).flatten()
print(yy)
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3
 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
 3 3]

※ 資料處理 (將xx 微分、平移、縮放)

In [125]:
#資料對時間微分
xx_ = xx[:,2:]
dX  =xx[:,:-2] - xx[:,2:]
xx = dX
#資料平移與縮放
xx = (xx+offset)/scale

print('samples(訓練樣本)')
print(xx)
print('labels(訓練樣本對應的答案標籤)')
print(yy)
samples(訓練樣本)
[[2.   2.   2.   ... 2.   2.   2.  ]
 [2.   2.   2.   ... 2.   2.   2.  ]
 [2.   2.   2.   ... 2.   2.   2.  ]
 ...
 [1.5  1.85 1.3  ... 2.   2.   2.  ]
 [1.45 1.85 1.35 ... 2.   2.   2.  ]
 [1.75 1.85 1.95 ... 2.35 2.3  2.05]]
labels(訓練樣本對應的答案標籤)
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3
 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
 3 3]

※ 訓練階段: 有了訓練資料 xx 及對應的標準答案 yy 就可以餵給模型學習了

In [126]:
from sklearn.svm import SVC
clf=SVC()
#clf=SVC(probability=True)
clf.fit(xx,yy)
Out[126]:
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
  max_iter=-1, probability=False, random_state=None, shrinking=True,
  tol=0.001, verbose=False)

※ 測試階段:讀入測試資料,經過資料處理後 加以辨識

In [131]:
test=np.loadtxt(deskTop+'/TEST_123.txt',delimiter=',',dtype='float')

dTest  =test[:,:-2] - test[:,2:]
test = dTest
test = (test+offset)/scale

print(clf.predict(test[0:10,:]))
print(clf.predict(test[10:20,:]))
print(clf.predict(test[20:30,:]))
[1 1 1 1 1 1 1 1 1 1]
[2 2 2 2 2 2 2 2 2 2]
[3 3 3 3 3 3 3 3 3 3]