1. 程式人生 > >Tensorflow實現KNN演算法

Tensorflow實現KNN演算法

tensorflow實現KNN演算法

KNN演算法應該是機器學習中比較好理解的一種演算法,它沒有訓練的過程,就是看樣本點中與測試點距離(可以是歐式距離,也可以是曼哈頓距離等等)最近的K個點的分類。採用投票的方式,即K個點中最多的分類即是該測試點的分類。

tensorflow的程式碼如下。
這裡我以MNIST數字識別作為樣本,最後的測試準確率可以達到95%以上。

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import numpy as np
mnist =
input_data.read_data_sets('MNIST_data', one_hot=False) K = 100 train_set = mnist.train.images train_labels = mnist.train.labels test_set = mnist.test.images test_labels = mnist.test.labels train_num = 10000 test_num = 100 x = tf.placeholder(tf.float32, [None, 784]) x_test = tf.placeholder(tf.float32, [784
]) #knn = tf.reduce_sum(tf.abs(tf.subtract(x, x_test)), reduction_indices=1) knn = tf.reduce_sum(tf.square(x - x_test), reduction_indices=1) with tf.Session() as sess: a = [] for i in range(test_num): result = sess.run(knn, feed_dict={x: train_set[:], x_test: test_set[i]}) min_distance_indexs =
result.argsort()[:100] knn_labels = np.array([train_labels[i] for i in min_distance_indexs]) prediction = np.argmax(np.bincount(knn_labels)) #print('prediction : ', prediction, 'fact : ', test_labels[i]) a.append(prediction == test_labels[i]) accuracy = tf.reduce_mean(tf.cast(a, dtype=tf.float32)) print('accuracy:', sess.run(accuracy))

記錄幾個有趣的用法

當我們想要求一個數組中出新頻率最多的元素時,numpy型別的陣列無法直接求出結果。我們需要先用np.bincount(array)來記錄每個元素出現的次數。

  • 注意,它返回值是一個數組,下標表示原陣列中的值。比如 x = np.bincount([2,4,4,1,1,3]),則x=[0,2,1,1,2],表示原陣列中,0出現0次,1出現2次,3出現1次……
  • 之後我們就可以用np.argmax(x)返回陣列x中最大元素的下標,在bincount的返回值中即是最初陣列中出現最多次的元素。