知识前提
一个标准的识别架构有四个部分:输入,训练模块,预测模块,输出;
机器学习分为两大类,一类是有监督学习,样本输入既有特征(feature)又有标签(label),无监督学习的输入样本只有特征;
什么是k近邻算法?
从一个训练集中找到k个与新输入最相近的样本(可以理解为预测值最高的k个样本),找出其中最多的类(可以理解为label中的众数),认为是该新输入的预测;
当k = 1的时候,该种情况为称为最邻近,此时算法也称为最邻近算法;
k邻近算法有什么用?
个人认为k邻近算法可以使用与小批量多分类任务中;是一个比较简单的,也可能经常会用到的机器学习算法;
k邻近算法在TensorFlow中的实现
对于一个机器学习架构来说,数据集是不可或缺的一部分;在本篇文章中,小编采用MNIST手写体作为数据集;我们利用TensorFlow中的Keras模块可以加载MNIST数据集:
import matplotlib.pyplot as plt
import numpy as np
from tensorflow import keras
def ds_imshow(im_data, im_label):##图像显示函数
plt.figure(figsize=(20,20))#设置大小
for i in range(len(im_data)):
plt.subplot(5,5,i+1)
plt.xticks([])
plt.yticks([])#使坐标轴没有刻度
plt.imshow(im_data[i],cmap = plt.cm.binary)
plt.xlabel(im_label[i])
plt.show()
###加载并显示MNIST数据集
(x_train,y_train),(x_test,y_test) = keras.datasets.mnist.load_data()#利用Keras加载数据级;
ds_imshow(x_train[:15],y_train[:15])
上述代码块中,我们加入了一个用来显示数据集的函数ds_imshow();确保我们的数据集确实加载进去了;
加载了MNIST数据集后,我们就可以在这个数据集中任选数据作为训练集,任选数据作为测试集;下面这个函数就是用来任意选取数据集作为训练集和数据集的;
def fenge(imdata, imlabel, trainsize, testsize):
index = np.random.choice(trainsize+testsize,size = trainsize+testsize)
index_train = index[:trainsize]
index_test = index[trainsize:]
x = imdata[index_train]
xlabel = imlabel[index_train]
y = imdata[index_test]
ylabel = imlabel[index_test]
return (x,xlabel,y,ylabel)
imdata和imlabel对应着选取的总数据集,trainsize和testsize就是训练集和测试集对应的长度,np.random.choice()是将一个数据顺序打乱的函数,通过打乱过后,我们就可以得到随机的训练集和数据集了,最后返回的就是对应的训练集和数据集了;
接下来就到了本章最核心的部分了——训练;我们利用sklearn.neighbors中的KNeighborClassifier 作为我们的算法模型;去训练我们分隔好的训练集;
def trainpre(train,trainlab,test,testlab,k):
train.reshape(len(train),28*28)
test.reshape(len(test),28*28)#训练集的维度必须是两个,一个是数量,一个转换的一维素组
from sklearn.neighbors import KNeighborsClassifier as kner
model = kner(k);
model.fit(train.reshape(len(train),28*28),trainlab)
prediction = model.predict(test.reshape(len(test),28*28))
acc = len(np.where(np.equal(testlab,prediction))[0])/len(testlab)#判断两个数组对应位置元素相同的个数
print('acc',acc)
#错误勘测
err = np.where(np.not_equal(testlab,prediction))[0]
ds_imshow(test[err],np.array([testlab[err],prediction[err]]).T)
需要注意的是model.fit()的变量是(特征二维数组,标签),这个二维数组第一个元素是表示样本的长度,第二个是将28*28的矩阵进行展开;
我们通过计算预测label与实际label的不同数量来作为该模型的一个准确性;并且通过错误index我们可以用进行一个错误勘测;如下图:
到这儿本章内容就已经结束了;