首先先介紹一下knn的基本原理:
knn是通過計算不同特徵值之間的距離進行分類。
整體的思路是:如果乙個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。
k通常是不大於20的整數。knn演算法中,所選擇的鄰居都是已經正確分類的物件。該方法在定類決策上只依據最鄰近的乙個或者幾個樣本的類別來決定待分樣本所屬的類別。
knn演算法要解決的核心問題是k值選擇,它會直接影響分類結果。
如果選擇較大的k值,就相當於用較大領域中的訓練例項進行**,其優點是可以減少學習的估計誤差,但缺點是學習的近似誤差會增大。
如果選擇較小的k值,就相當於用較小的領域中的訓練例項進行**,「學習」近似誤差會減小,只有與輸入例項較近或相似的訓練例項才會對**結果起作用,與此同時帶來的問題是「學習」的估計誤差會增大,換句話說,k值的減小就意味著整體模型變得複雜,容易發生過擬合;
import numpy as np
import tensorflow as tf
#這裡使用tensorflow自帶的資料集作為測試,以下是匯入資料集**
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=true)
xtrain, ytrain = mnist.train.next_batch(5000) #從資料集中選取5000個樣本作為訓練集
xtest, ytest = mnist.test.next_batch(200) #從資料集中選取200個樣本作為測試集
# 輸入佔位符
xtr = tf.placeholder("float", [none, 784])
xte = tf.placeholder("float", [784])
# 計算l1距離
distance = tf.reduce_sum(tf.abs(tf.add(xtr, tf.negative(xte))), reduction_indices=1)
# 獲取最小距離的索引
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(xtest)):
# 獲取當前樣本的最近鄰索引
nn_index = sess.run(pred, feed_dict=) #向佔位符傳入訓練資料
# 最近鄰分類標籤與真實標籤比較
print("test", i, "prediction:", np.argmax(ytr[nn_index]), \
"true class:", np.argmax(ytest[i]))
# 計算精確度
if np.argmax(ytrain[nn_index]) == np.argmax(ytest[i]):
accuracy += 1./len(xtest)
print("done!")
print("accuracy:", accuracy)
以上就是使用tensorflow實現knn的過程。
題外話:
tensorflow的整體過程是先設計計算圖,然後執行會話,執行計算圖的過程,整個過程的資料可見性比較差。
以上精確度的計算以及真實標籤和**標籤的比較結果其實使用numpy和python的變數。
結合tensorflow的優點和python的特性才能更好的為現實解決問題服務。
KNN 以及tensorflow實現
鄰近演算法,或者說k最近鄰 knn,k nearestneighbor 分類演算法是資料探勘分類技術中最簡單的方法之一。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。簡單來說,k nn可以看成 有那麼一堆你已經知道分類的資料,然後當乙個新資料進入的時候,就開...
KNN 手動實現
knn 的實質是根據 值 與訓練集之間的距離來進行分類。下面 使用 歐氏距離來表示點集之間的距離,具體 如下 class knn def fit self,x,y self.x train x self.y train y def predict self,x,k x train self.x tr...
KNN簡單實現
knn算是機器學習入門演算法中比較容易理解的了,要注意和k means的一些區別 knn k means 1.knn是分類演算法 2.監督學習 3.餵給它的資料集是帶label的資料,已經是完全正確的資料 1.k means是聚類演算法 2.非監督學習 3.餵給它的資料集是無label的資料,是雜亂...