Tensorflow--實現KNN
阿新 • • 發佈:2019-01-25
KNN(k最近鄰)
K最近鄰(K-Nearest Neighbor,KNN)演算法,是著名的模式識別統計學方法,在機器學習分類演算法中佔有相當大的地位。它是一個理論上比較成熟的方法。既是最簡單的機器學習演算法之一,也是基於例項的學習方法中最基本的,也是常見的文字分類演算法之一。
基本思想
如果一個例項在特徵空間中的K個最相似(即特徵空間中最近鄰)的例項中的大多數屬於某一個類別,則該例項也屬於這個類別。所選擇的鄰居都是已經正確分類的例項。
該演算法假定所有的例項對應於N維歐式空間中的點。通過計算一個點與其他所有點之間的距離,取出與該點最近的K個點,然後統計這K個點裡面所屬分類比例最大的,則這個點屬於該分類。
該演算法涉及3個主要因素:例項集、距離或相似的衡量、k的大小。
Tensorflow實現knn:k取1
這個例子使用的資料集是MNIST,這是手寫數字識別的資料集,通過識別手寫的數字0到9,也就是一共是十個類別。輸入為圖片,圖片畫素28*28=784,表示成向量形式。
使用樣本形式為(X,label),X為784維的向量,label為0-9之中的一個類別。
import numpy as np
import tensorflow as tf
#最近鄰演算法,此程式碼實現類似1-NN
#匯入輸入資料MNIST
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read _data_sets("/tmp/data/", one_hot=True)
#這個例子限制了樣本的數目
Xtr, Ytr = mnist.train.next_batch(1000) #1000 條候選樣本,測試樣本跟候選樣本比較,得到最近的K個樣本,然後k個樣本的標籤大多數為某類,測試樣本就為某類
Xte, Yte = mnist.test.next_batch(200) #200 條測試樣本
# tf Graph Input,佔位符,用來feed資料
xtr = tf.placeholder("float", [None, 784])
xte = tf.placeholder("float", [784])
# 最近鄰計算距離使用 L1 距離
# 計算L1距離
distance = tf.reduce_sum(tf.abs(tf.add(xtr, tf.negative(xte))), reduction_indices=1)
# 預測: 獲取離測試樣本具有最小L1距離的樣本(1-NN),此樣本的類別作為test樣本的類別
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(Xte)):
# Get nearest neighbor
nn_index = sess.run(pred, feed_dict={xtr: Xtr, xte: Xte[i, :]}) #每次迴圈feed資料,候選Xtr全部,測試集Xte一次迴圈輸入一條
# 獲得與測試樣本最近樣本的類別,計算與真實類別的誤差
print("Test", i, "Prediction:", np.argmax(Ytr[nn_index]), \
"True Class:", np.argmax(Yte[i]))
# 計算誤差率
if np.argmax(Ytr[nn_index]) == np.argmax(Yte[i]):
accuracy += 1. / len(Xte)
print("Done!")
print("Accuracy:", accuracy)
當我候選樣本選1000時,結果:Accuracy: 0.8650000000000007
當我候選樣本選5000時,結果:Accuracy: 0.9250000000000007
可見,候選樣本對精確度影響還是比較大的。