TensorFlow的最近邻算法

'''
A nearest neighbor learning algorithm example using TensorFlow library.
This example is using the MNIST database of handwritten digits
(http://yann.lecun.com/exdb/mnist/)

Author: Aymeric Damien
Project: https://github.com/aymericdamien/TensorFlow-Examples/
'''

from __future__ import print_function

import numpy as np
import tensorflow as tf

# Import MNIST data
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)

# In this example, we limit mnist data
Xtr, Ytr = mnist.train.next_batch(5000) #5000 for training (nn candidates)
Xte, Yte = mnist.test.next_batch(200) #200 for testing

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

# Nearest Neighbor calculation using L1 Distance
# Calculate L1 Distance
distance = tf.reduce_sum(tf.abs(tf.add(xtr, tf.negative(xte))), reduction_indices=1)
# Prediction: Get min distance index (Nearest neighbor)
pred = tf.arg_min(distance, 0)

accuracy = 0.

# Initialize the variables (i.e. assign their default value)
init = tf.global_variables_initializer()

# Start training
with tf.Session() as sess:

    # Run the initializer
    sess.run(init)

    # loop over test data
    for i in range(len(Xte)):
        # Get nearest neighbor
        nn_index = sess.run(pred, feed_dict={xtr: Xtr, xte: Xte[i, :]})
        # Get nearest neighbor class label and compare it to its true label
        print("Test", i, "Prediction:", np.argmax(Ytr[nn_index]), \
            "True Class:", np.argmax(Yte[i]))
        # Calculate accuracy
        if np.argmax(Ytr[nn_index]) == np.argmax(Yte[i]):
            accuracy += 1./len(Xte)
    print("Done!")
    print("Accuracy:", accuracy)

代码的具体注释说明 

#TensorFlow实现最近邻算法
#次案例的前提是了解mnist数据集(手写数字识别)
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
#导入mnist数据集
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)
 
#5000样本作为训练集 每一个训练和测试样本的数据都是1*784的矩阵,标签是1*10的矩阵并且采用one-hot编码
X_train , Y_train = mnist.train.next_batch(5000)
#600样本作为测试集
X_test , Y_test = mnist.test.next_batch(200)
 
#创建占位符 None代表将来可以选多个样本的,如:[60,784]代表选取60个样本,每一个样本的是784列
x_train = tf.placeholder("float",[None,784])
x_test = tf.placeholder("float",[784])#x_test代表只用一个样本
#计算距离
#tf.negative(-2)的输出的结果是2
#tf.negative(2)的输出的结果是-2
#reduce_sum的参数reduction_indices解释见下图
#计算一个测试样本和训练样本的的距离
#distance 返回的是N个训练样本的和单个测试样本的距离
distance = tf.reduce_sum(tf.abs(tf.add(x_train,tf.negative(x_test))),reduction_indices=1)
#的到距离最短的训练样本的索引
prediction = 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(X_test)):#遍历整个测试集,每次用一个的测试样本和整个训练样本的做距离运算
        #获得最近邻
        # 获得训练集中与本次参与运算的测试样本最近的样本编号
        nn_index = sess.run(prediction,feed_dict={x_train:X_train,x_test:X_test[i,:]})
        #打印样本编号的预测类别和准确类别
        print("Test",i,"Prediction:",np.argmax(Y_train[nn_index]),"True Class:",np.argmax(Y_test[i]))
        if np.argmax(Y_train[nn_index]) == np.argmax(Y_test[i]):
            #如果预测正确。更新准确率
            accuracy += 1./len(X_test)
    print("完成!")
    print("准确率:",accuracy)

结果:

Test 0 Prediction: 0 True Class: 0
Test 1 Prediction: 6 True Class: 6
Test 2 Prediction: 4 True Class: 4
Test 3 Prediction: 1 True Class: 2
Test 4 Prediction: 0 True Class: 0
Test 5 Prediction: 2 True Class: 2
Test 6 Prediction: 7 True Class: 7
Test 7 Prediction: 7 True Class: 7
Test 8 Prediction: 7 True Class: 7
Test 9 Prediction: 1 True Class: 1
Test 10 Prediction: 4 True Class: 4
Test 11 Prediction: 1 True Class: 1
Test 12 Prediction: 2 True Class: 2
Test 13 Prediction: 6 True Class: 6
Test 14 Prediction: 8 True Class: 8
Test 15 Prediction: 5 True Class: 5
Test 16 Prediction: 3 True Class: 3
Test 17 Prediction: 6 True Class: 6
Test 18 Prediction: 1 True Class: 1
Test 19 Prediction: 5 True Class: 5
Test 20 Prediction: 3 True Class: 3
Test 21 Prediction: 6 True Class: 6
Test 22 Prediction: 3 True Class: 3
Test 23 Prediction: 8 True Class: 3
Test 24 Prediction: 0 True Class: 0
Test 25 Prediction: 5 True Class: 5
Test 26 Prediction: 0 True Class: 8
Test 27 Prediction: 8 True Class: 8
Test 28 Prediction: 2 True Class: 2
Test 29 Prediction: 4 True Class: 4
Test 30 Prediction: 1 True Class: 1
Test 31 Prediction: 3 True Class: 3
Test 32 Prediction: 5 True Class: 5
Test 33 Prediction: 0 True Class: 0
Test 34 Prediction: 4 True Class: 4
Test 35 Prediction: 6 True Class: 6
Test 36 Prediction: 7 True Class: 7
Test 37 Prediction: 1 True Class: 1
Test 38 Prediction: 5 True Class: 5
Test 39 Prediction: 0 True Class: 0
Test 40 Prediction: 2 True Class: 3
Test 41 Prediction: 7 True Class: 7
Test 42 Prediction: 2 True Class: 2
Test 43 Prediction: 1 True Class: 1
Test 44 Prediction: 4 True Class: 4
Test 45 Prediction: 3 True Class: 3
Test 46 Prediction: 8 True Class: 8
Test 47 Prediction: 3 True Class: 3
Test 48 Prediction: 8 True Class: 8
Test 49 Prediction: 8 True Class: 3
Test 50 Prediction: 7 True Class: 7
Test 51 Prediction: 1 True Class: 1
Test 52 Prediction: 0 True Class: 0
Test 53 Prediction: 6 True Class: 6
Test 54 Prediction: 9 True Class: 9
Test 55 Prediction: 8 True Class: 8
Test 56 Prediction: 1 True Class: 7
Test 57 Prediction: 2 True Class: 2
Test 58 Prediction: 4 True Class: 4
Test 59 Prediction: 8 True Class: 8
Test 60 Prediction: 4 True Class: 4
Test 61 Prediction: 2 True Class: 0
Test 62 Prediction: 4 True Class: 4
Test 63 Prediction: 5 True Class: 5
Test 64 Prediction: 3 True Class: 3
Test 65 Prediction: 1 True Class: 1
Test 66 Prediction: 3 True Class: 3
Test 67 Prediction: 3 True Class: 3
Test 68 Prediction: 0 True Class: 0
Test 69 Prediction: 3 True Class: 3
Test 70 Prediction: 6 True Class: 6
Test 71 Prediction: 7 True Class: 7
Test 72 Prediction: 1 True Class: 1
Test 73 Prediction: 9 True Class: 9
Test 74 Prediction: 4 True Class: 4
Test 75 Prediction: 1 True Class: 9
Test 76 Prediction: 1 True Class: 1
Test 77 Prediction: 3 True Class: 3
Test 78 Prediction: 4 True Class: 4
Test 79 Prediction: 5 True Class: 5
Test 80 Prediction: 7 True Class: 7
Test 81 Prediction: 0 True Class: 0
Test 82 Prediction: 2 True Class: 2
Test 83 Prediction: 7 True Class: 7
Test 84 Prediction: 5 True Class: 5
Test 85 Prediction: 0 True Class: 0
Test 86 Prediction: 7 True Class: 7
Test 87 Prediction: 1 True Class: 1
Test 88 Prediction: 5 True Class: 5
Test 89 Prediction: 8 True Class: 8
Test 90 Prediction: 9 True Class: 9
Test 91 Prediction: 4 True Class: 4
Test 92 Prediction: 5 True Class: 5
Test 93 Prediction: 7 True Class: 7
Test 94 Prediction: 3 True Class: 3
Test 95 Prediction: 8 True Class: 8
Test 96 Prediction: 1 True Class: 4
Test 97 Prediction: 5 True Class: 5
Test 98 Prediction: 3 True Class: 3
Test 99 Prediction: 2 True Class: 2
Test 100 Prediction: 8 True Class: 2
Test 101 Prediction: 1 True Class: 1
Test 102 Prediction: 3 True Class: 3
Test 103 Prediction: 2 True Class: 2
Test 104 Prediction: 5 True Class: 5
Test 105 Prediction: 1 True Class: 1
Test 106 Prediction: 0 True Class: 0
Test 107 Prediction: 7 True Class: 7
Test 108 Prediction: 2 True Class: 2
Test 109 Prediction: 0 True Class: 0
Test 110 Prediction: 6 True Class: 6
Test 111 Prediction: 4 True Class: 4
Test 112 Prediction: 2 True Class: 2
Test 113 Prediction: 3 True Class: 3
Test 114 Prediction: 6 True Class: 6
Test 115 Prediction: 8 True Class: 8
Test 116 Prediction: 3 True Class: 3
Test 117 Prediction: 4 True Class: 4
Test 118 Prediction: 8 True Class: 8
Test 119 Prediction: 9 True Class: 9
Test 120 Prediction: 5 True Class: 5
Test 121 Prediction: 5 True Class: 5
Test 122 Prediction: 7 True Class: 7
Test 123 Prediction: 3 True Class: 3
Test 124 Prediction: 7 True Class: 7
Test 125 Prediction: 9 True Class: 9
Test 126 Prediction: 1 True Class: 7
Test 127 Prediction: 4 True Class: 4
Test 128 Prediction: 7 True Class: 7
Test 129 Prediction: 1 True Class: 1
Test 130 Prediction: 8 True Class: 8
Test 131 Prediction: 3 True Class: 3
Test 132 Prediction: 6 True Class: 6
Test 133 Prediction: 1 True Class: 1
Test 134 Prediction: 9 True Class: 9
Test 135 Prediction: 4 True Class: 4
Test 136 Prediction: 8 True Class: 8
Test 137 Prediction: 3 True Class: 3
Test 138 Prediction: 7 True Class: 7
Test 139 Prediction: 6 True Class: 1
Test 140 Prediction: 7 True Class: 7
Test 141 Prediction: 6 True Class: 6
Test 142 Prediction: 7 True Class: 7
Test 143 Prediction: 3 True Class: 3
Test 144 Prediction: 0 True Class: 0
Test 145 Prediction: 9 True Class: 9
Test 146 Prediction: 1 True Class: 1
Test 147 Prediction: 6 True Class: 6
Test 148 Prediction: 0 True Class: 0
Test 149 Prediction: 1 True Class: 1
Test 150 Prediction: 5 True Class: 8
Test 151 Prediction: 1 True Class: 1
Test 152 Prediction: 2 True Class: 2
Test 153 Prediction: 5 True Class: 5
Test 154 Prediction: 6 True Class: 6
Test 155 Prediction: 0 True Class: 0
Test 156 Prediction: 8 True Class: 8
Test 157 Prediction: 0 True Class: 0
Test 158 Prediction: 1 True Class: 1
Test 159 Prediction: 5 True Class: 5
Test 160 Prediction: 0 True Class: 0
Test 161 Prediction: 1 True Class: 1
Test 162 Prediction: 5 True Class: 5
Test 163 Prediction: 6 True Class: 6
Test 164 Prediction: 6 True Class: 6
Test 165 Prediction: 7 True Class: 9
Test 166 Prediction: 3 True Class: 3
Test 167 Prediction: 2 True Class: 2
Test 168 Prediction: 7 True Class: 7
Test 169 Prediction: 3 True Class: 8
Test 170 Prediction: 4 True Class: 4
Test 171 Prediction: 9 True Class: 9
Test 172 Prediction: 0 True Class: 0
Test 173 Prediction: 7 True Class: 7
Test 174 Prediction: 5 True Class: 5
Test 175 Prediction: 4 True Class: 4
Test 176 Prediction: 7 True Class: 7
Test 177 Prediction: 2 True Class: 2
Test 178 Prediction: 5 True Class: 5
Test 179 Prediction: 2 True Class: 2
Test 180 Prediction: 1 True Class: 1
Test 181 Prediction: 8 True Class: 8
Test 182 Prediction: 4 True Class: 4
Test 183 Prediction: 2 True Class: 2
Test 184 Prediction: 8 True Class: 8
Test 185 Prediction: 7 True Class: 7
Test 186 Prediction: 2 True Class: 2
Test 187 Prediction: 2 True Class: 2
Test 188 Prediction: 8 True Class: 8
Test 189 Prediction: 0 True Class: 0
Test 190 Prediction: 2 True Class: 2
Test 191 Prediction: 3 True Class: 3
Test 192 Prediction: 4 True Class: 4
Test 193 Prediction: 3 True Class: 3
Test 194 Prediction: 5 True Class: 5
Test 195 Prediction: 1 True Class: 1
Test 196 Prediction: 5 True Class: 5
Test 197 Prediction: 2 True Class: 2
Test 198 Prediction: 5 True Class: 5
Test 199 Prediction: 0 True Class: 0
Done!
Accuracy: 0.9250000000000007

猜你喜欢

转载自blog.csdn.net/cestlavieqiang/article/details/83627700