python识别手写数字knn_手写数字识别以及Python sklearn KNN实现
Background: 每个手写数字的图,对应于一张高*宽为28*28像素的图片,形成一个28*28pixel的矩阵,写成一维的1*784pixel的矩阵。每个像素有与之对应的像素值,为0~255之间的整数,表示该像素的亮暗,值越大像素越暗。每个像素值对应于一个特征,Digit recognizer 通过学习这个矩阵的特征来对数字进行分类。【label 对应手写的数字,pixel0~pixel78
Background: 每个手写数字的图,对应于一张高*宽为28*28像素的图片,形成一个28*28pixel的矩阵,写成一维的1*784pixel的矩阵。每个像素有与之对应的像素值,为0~255之间的整数,表示该像素的亮暗,值越大像素越暗。每个像素值对应于一个特征,Digit recognizer 通过学习这个矩阵的特征来对数字进行分类。
【label 对应手写的数字,pixel0~pixel783为该数字的1*784pixel矩阵】文件格式csv
1.数据可视化。看看编号40的数字是什么~
2.分析原始数据。可见这是一个类别平衡的多分类问题。
3.检查数据,数据完整。
4.数据归一化处理
注意不同的算法对数据有不同的要求。
5.分类算法
这里以简单易懂的KNN为例,先选择合适的K值,以及为了避免过拟合,进行模型评估。
6.参数选择,模型评估——k折交叉验证法
Python sklearn.model_selection提供了
不同于k-fold的是,stratified采用分层采样。
def cross_validation(K,X,y):
knn=neighbors.KNeighborsClassifier(K,weights='distance')
score=cross_val_score(knn,X,y,cv=5,scoring='accuracy')
return np.array(score).mean()
接着对不同K值模型进行循环选择最优。
for K in k_range:
k_score.append(cross_validation(K,X,y))
最后得到最优k==3,再用全部数据训练模型,精度0.969。
7. PCA主成分分析进行特征降维,去除噪声。
def decomposition(n,matrice):
pca=PCA(n_components=n)
pca.fit(matrice)
matrice_pca=np.array(pca.transform(matrice))
return matrice_pca,sum(pca.explained_variance_ratio_)
n_score=[]
n_vr=[]
n_array=[5,10,15,20,25,50,100,200,500]
for n in n_array:
train_X,vr=decomposition(n,X)
n_score.append(cross_validation(3,train_X,y))
n_vr.append(vr)
plt.plot(n_array,n_score,'r',label='Accuracy')
plt.plot(n_array,n_vr,'g',label='Variance ratio')
plt.legend(loc='center',fontsize='large')
plt.xlabel('n_components',size=15)
#plt.xscale("log")
plt.show
将特征维度降至20的时候,保留大部分信息(Variance ratio),训练精度开始趋于饱和。
选n_components为60,精度提升到0.974。使用支持向量机,精度提升到0.982。
ps:CNN能达到0.99以上的精度。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)