• TensorFlow实现knn(k近邻)算法


    首先先介绍一下knn的基本原理:

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

    整体的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

    K通常是不大于20的整数。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

    KNN算法要解决的核心问题是K值选择,它会直接影响分类结果。

    如果选择较大的K值,就相当于用较大领域中的训练实例进行预测,其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。

    如果选择较小的K值,就相当于用较小的领域中的训练实例进行预测,“学习”近似误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是“学习”的估计误差会增大,换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合;

    下面是knn的TensorFlow实现过程,代码来源于GitHub,稍作修改:

    import numpy as np
    import tensorflow as tf
    
    #这里使用TensorFlow自带的数据集作为测试,以下是导入数据集代码 
    from tensorflow.examples.tutorials.mnist import input_data
    mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)
    
    Xtrain, Ytrain = mnist.train.next_batch(5000)  #从数据集中选取5000个样本作为训练集
    Xtest, Ytest = mnist.test.next_batch(200)    #从数据集中选取200个样本作为测试集
    
    
    # 输入占位符
    xtr = tf.placeholder("float", [None, 784])
    xte = tf.placeholder("float", [784])
    
    
    # 计算L1距离
    distance = tf.reduce_sum(tf.abs(tf.add(xtr, tf.negative(xte))), reduction_indices=1)
    # 获取最小距离的索引
    pred = tf.arg_min(distance, 0)
    
    #分类精确度
    accuracy = 0.
    
    # 初始化变量
    init = tf.global_variables_initializer()
    
    # 运行会话,训练模型
    with tf.Session() as sess:
    
        # 运行初始化
        sess.run(init)
    
        # 遍历测试数据
        for i in range(len(Xtest)):
            # 获取当前样本的最近邻索引
            nn_index = sess.run(pred, feed_dict={xtr: Xtrain, xte: Xtest[i, :]})   #向占位符传入训练数据
            # 最近邻分类标签与真实标签比较
            print("Test", i, "Prediction:", np.argmax(Ytr[nn_index]), 
                "True Class:", np.argmax(Ytest[i]))
            # 计算精确度
            if np.argmax(Ytrain[nn_index]) == np.argmax(Ytest[i]):
                accuracy += 1./len(Xtest)
    
        print("Done!")
        print("Accuracy:", accuracy)
    

    以上就是使用TensorFlow实现knn的过程。

    题外话:
    tensorflow的整体过程是先设计计算图,然后运行会话,执行计算图的过程,整个过程的数据可见性比较差。
    以上精确度的计算以及真实标签和预测标签的比较结果其实使用numpy和python的变量。
    结合TensorFlow的优点和Python的特性才能更好的为现实解决问题服务。

  • 相关阅读:
    vue 项目编译打包
    【Vue】基于nodejs的vue项目打包编译部署
    关于数据库设计中的状态字段
    Node.js安装及环境配置之Windows篇
    REST的本质,就是用户操作某个网络资源(具有独一无二的识别符URI),获得某种服务,也就是动词+资源(都是HTTP协议的一部分)
    微软重生:4年市值U型大逆转,超越谷歌重返巅峰!
    我在世界最热创业孵化器YC学到的58件事
    创业是否只是年轻人的专利?
    让你更值钱的方法:培养稀缺(追逐新技术,淬炼已有技能、做到出类拔萃,寻找自己所在的行业痛点,App开发者是市场动态平衡的典型)
    算法题
  • 原文地址:https://www.cnblogs.com/wkslearner/p/8206593.html
Copyright © 2020-2023  润新知