knn算法之预测数字

训练算法并对算法的准确值准确率进行估计

#导入相应模块

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

 

#将所有准备的样本加载到列表中

x = []
for i in range(10):
     for j in range(1,501):
          x.append(plt.imread("./data/%d/%d_%d.bmp"%(i,i,j)))                      #读取数据

 

#对样本数据进行操作处理

#先将列表转化成为数组

x = np.array(x)
x.shape

 

#准备模型数据,并让模型数据与样本数据一一对应

y = [0,1,2,3,4,5,6,7,8,9]*500

y = np.array(y)
y.sort()

index = np.arange(5000)       

 

# 将索引打乱           
np.random.shuffle(index)                 

 

# 打乱数字顺序,通过索引来随机提取数据
x = x[index]
y = y[index]

 

# 采取训练数据和测试数据,此时训练数据和测试数据一一对应
x_test = x[3750:]
x_train = x[:3750]
y_train = y[:3750]
y_test = y[3750:]

 

#引入KNN算法

from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=5)

 

#想用训练数据和训练模型对算法进行训练

knn.fit(x_train,y_train)

 

#训练结果

"""

KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=None, n_neighbors=5, p=2, weights='uniform')

"""

 

#用测试数据对训练的算法进行测试算法的预测准确率

x_predict = knn.predict(x_test)                      

array = x_predict==y_test

 

#array是含有Ture和False的数组

#对于0和1的数组进行求平均值,则就是值为1的出现的概率

array.mean()

 

#算法准确率

0.9376

 

自定义验证算法

# 加载样本图片
numall = plt.imread("./timg.jpg")
# plt.imshow(numall)

#对需要识别的数字进行切片,使之符合算法样本要求(算法的训练数据的尺寸是(28,28))

#测试数据的格式必须和算法训练数据的样本格式相同
num8 = numall[280:510,380:600][:,:,0]
plt.imshow(num8)

 

#导入算法响应模块,对图片尺寸进行修正

from scipy import misc
num8 = misc.imresize(num8,(28,28))
num8.shape

 

num8 = num8.reshape(1,-1)
knn.predict(num8)

 

posted @ 2019-01-23 21:22  石桥浪子  阅读(1654)  评论(0编辑  收藏  举报