TensorFlow K近邻算法

knn的基本原理:

KNN是通过计算不同特征值之间的距离进行分类。

整体的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。K通常是不大于20的整数。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在分类决策上只依据最邻近的一个或者几个样本的类别来决定待分类样本所属的类别。

KNN算法要解决的核心问题是K值选择,它会直接影响分类结果。如果选择较大的K值,就相当于用较大领域中的训练实例进行预测,其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。如果选择较小的K值,就相当于用较小的领域中的训练实例进行预测,“学习”近似误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是“学习”的估计误差会增大,换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合;

使用tensorflow进行KNN算法的整体过程是先设计计算图,然后运行会话,执行计算图的过程,整个过程的数据可见性比较差。以上精确度的计算以及真实标签和预测标签的比较结果其实使用numpy和python的变量。

源代码:

import numpy as np
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import os
os.environ["CUDA_VISIBLE_DEVICES"]="0"

mnist =input_data.read_data_sets("/home/yxcx/tf_data/MNIST_data",one_hot=True)

Xtr,Ytr=mnist.train.next_batch(5000)
Xte,Yte=mnist.test.next_batch(200)

#tf Graph Input
xtr=tf.placeholder("float",[None,784])
xte=tf.placeholder("float",[784])

distance =tf.reduce_sum(tf.abs(tf.add(xtr,tf.negative(xte))),reduction_indices=1)
pred=tf.argmin(distance,0)

accuracy=0
init=tf.global_variables_initializer()

#Start training
with tf.Session() as sess:
    sess.run(init)
    for i in range(len(Xte)):
        #Get nearest nerighbor
        nn_index=sess.run(pred,feed_dict={xtr:Xtr,xte:Xte[i,:]})
        print("Test",i ,"Prediction:",np.argmax(Ytr[nn_index]),"True Class:",np.argmax(Yte[i]))
        if np.argmax(Ytr[nn_index])==np.argmax(Yte[i]):
            accuracy+=1./len(Xte)
    print("Done!")
    print("accuacy:" ,accuracy)

结果截图:

posted on 2021-01-09 11:18  嘻嘻_嘻  阅读(84)  评论(0编辑  收藏  举报