Tensorflow實現KNN演算法
阿新 • • 發佈:2018-11-20
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的返回值中即是最初陣列中出現最多次的元素。