本次案例需要大家了解關於手寫數字識別(mnist)的數據集的特點和結構:
#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 196 Prediction: 7 True Class: 9
Test 197 Prediction: 9 True Class: 9
Test 198 Prediction: 1 True Class: 9
Test 199 Prediction: 9 True Class: 9
完成!
准確率: 0.9150000000000007
公眾號:一個有趣的機器學習社區
(分享大量AI大數據資源)