1. 程式人生 > >Tensorflow--實現KNN

Tensorflow--實現KNN

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

可見,候選樣本對精確度影響還是比較大的。