神经网络入门:K近邻算法识别MNIST

知识前提

        一个标准的识别架构有四个部分:输入,训练模块,预测模块,输出;

        机器学习分为两大类,一类是有监督学习,样本输入既有特征(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我们可以用进行一个错误勘测;如下图:

        到这儿本章内容就已经结束了;

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值