學習進度筆記12
阿新 • • 發佈:2021-01-09
TensorFlow K近鄰演算法
knn的基本原理:
KNN是通過計算不同特徵值之間的距離進行分類。
整體的思路是:如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。K通常是不大於20的整數。KNN演算法中,所選擇的鄰居都是已經正確分類的物件。該方法在分類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分類樣本所屬的類別。
KNN演算法要解決的核心問題是K值選擇,它會直接影響分類結果。如果選擇較大的K值,就相當於用較大領域中的訓練例項進行預測,其優點是可以減少學習的估計誤差,但缺點是學習的近似誤差會增大。如果選擇較小的K值,就相當於用較小的領域中的訓練例項進行預測,“學習”近似誤差會減小,只有與輸入例項較近或相似的訓練例項才會對預測結果起作用,與此同時帶來的問題是“學習”的估計誤差會增大,換句話說,K值的減小就意味著整體模型變得複雜,容易發生過擬合;
使用tensorflow進行KNN演算法的整體過程是先設計計算圖,然後執行會話,執行計算圖的過程,整個過程的資料可見性比較差。以上精確度的計算以及真實標籤和預測標籤的比較結果其實使用numpy和python的變數。
原始碼:
import numpy as np import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data import os os.environ["CUDA_VISIBLE_DEVICES"]="0" mnist =input_data.read_data_sets("/home/yxcx/tf_data/MNIST_data",one_hot=True) Xtr,Ytr=mnist.train.next_batch(5000) Xte,Yte=mnist.test.next_batch(200) #tf Graph Input xtr=tf.placeholder("float",[None,784]) xte=tf.placeholder("float",[784]) distance =tf.reduce_sum(tf.abs(tf.add(xtr,tf.negative(xte))),reduction_indices=1) pred=tf.argmin(distance,0) accuracy=0 init=tf.global_variables_initializer() #Start training with tf.Session() as sess: sess.run(init) for i in range(len(Xte)): #Get nearest nerighbor nn_index=sess.run(pred,feed_dict={xtr:Xtr,xte:Xte[i,:]}) 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("accuacy:" ,accuracy)
結果截圖: