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)