機器學習與演算法(5) KNN 演算法

2021-08-16 02:19:39 字數 2952 閱讀 4782

k近鄰演算法是一種基於模擬的分類方法,主要通過給定的檢驗組與和它相似的訓練組進行比較來學習。訓練組用n個屬性來描述,每個元組代表n維空間上的點。當給定乙個未知元組時,k最近鄰分類法搜尋該模式空間,找出最接近未知元組的k個訓練組,並將未知元組指派到模式空間中它的k個最近鄰中的多數類中。

k近鄰(k-nearest neighbors)採用向量空間模型來分類,是一種常用的監督學習方法。它的工作原理為:給定測試樣本,基於某種距離度量找出訓練集中與其最靠近的k個訓練樣本,然後基於這k個「鄰居」的資訊來進行**。通常,在分類任務中可使用「投票法」,即選擇這k個樣本中出現最多的類別標記作為**結果;在回歸任務中可使用「平均法」,即將這k個樣本的實值輸出標記的平均值作為**結果;還可基於距離遠近進行加權平均或加權投票,距離越近的樣本權重越大。

k近鄰沒有顯式的訓練過程,是「懶惰學習」的代表。此類學習技術在訓練階段僅僅是把樣本儲存起來,訓練時間開銷為零,待收到測試樣本後再進行處理。

最近鄰分類器雖然簡單,但它的泛化錯誤率不超過貝葉斯最優分類器的錯誤率的兩倍。

其中「最近鄰」主要是以距離來度量的,一般使用歐幾里得距離度量兩個點或元組的距離,也可以使用曼哈頓距離或其他距離;歐幾里得距離的主要計算公式如下:

注意:為了防止具有較大初始值域的屬性比較小初始值域的屬性的權重過大,在計算距離之前,需對每個屬性值進行規範化。一般的規劃方法有最小-最大規範化,零均值規範化,小數定標規範化等。

最小-最大規範化:將原始資料值對映到[0,1]空間中,假定mina和maxa分別是屬性a的最小值和最大值,則規範化的公式為:

零均值規範化:基於屬性a的均值和標準差上的規範化方法,具體計算如下:

小數定標規範化:通過移動屬性a的小數點位置進行規範化,小數點的移動位數依賴於a的最大絕對值。具體計算如下:(其中j是使得max( v』 )<1的最小整數)

最近鄰數k的確定,主要原理是選取產生最小誤差率的k值。每次從k=1開始,使用檢驗集估計分類器的誤差率;每次都允許增加乙個近鄰,重複該過程,選擇誤差率最小的k值。

應用案例

%matplotlib inline

import time

import numpy as np

import tensorflow as tf

import matplotlib.pyplot as plt

from sklearn.datasets.samples_generator import make_circles

n=210

k=2max_iters = 1000

cut=int(n*0.7)

# 生成訓練和測試資料集

data, features = make_circles(n_samples=n, shuffle=true, noise= 0.12, factor=0.4)

tr_data, tr_features= data[:cut], features[:cut]

te_data,te_features=data[cut:], features[cut:]

fig, ax = plt.subplots()

ax.scatter(tr_data.transpose()[0], tr_data.transpose()[1], marker = 'o', s = 100, c = tr_features, cmap=plt.cm.coolwarm )

ax.set_title('train data')

plt.show()

start = time.time()

points=tf.variable(data)

cluster_assignments = tf.variable(tf.zeros([n], dtype=tf.int64))

sess = tf.session()

sess.run(tf.initialize_all_variables())

te_learned_features=

for i, j in zip(te_data, te_features):

distances = tf.reduce_sum(tf.square(tf.sub(i , tr_data)),reduction_indices=1)

neighbor = tf.arg_min(distances,0)

#print tr_features[sess.run(neighbor)]

accuracy = tf.reduce_mean(tf.cast(tf.equal(te_learned_features, te_features), "float"))

fig, ax = plt.subplots()

ax.scatter(te_data.transpose()[0], te_data.transpose()[1], marker = 'o', s = 100, c = te_learned_features, cmap=plt.cm.coolwarm )

ax.set_title('test result')

plt.show()

end = time.time()

print ("found in %.2f seconds" % (end-start))

print "cluster assignments:", test

print "accuracy:", sess.run(accuracy)

found in 6.73 seconds

cluster assignments: [0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0]

accuracy: 1.0

機器學習系列 5 KNN演算法

knn演算法全稱是k nearest neighbors knn原理就是當 乙個值屬於什麼分類,根據它最近的k個分類是什麼進行 它屬於什麼類別。重點有兩個 k 的確定和距離的計算 距離的計算 歐式距離 k值的計算 通過交叉驗證 將樣本資料按照一定的比例拆分成訓練用的資料和驗證用的資料 從中選取乙個較...

機器學習演算法 kNN演算法

knn k 鄰近演算法 1.knn是non parametric分類器,既不做分布式假設,直接從資料估計概率密度 2.knn不適用於高維資料 優點 1.無需估計引數,無需訓練 2.特別適合於多分類問題 物件具有多個標籤 缺點 1.當樣本容量不平衡是,輸入有個新樣本,該樣本的k個鄰值中大容量樣本占多數...

機器學習演算法 KNN演算法

knn演算法原理 knn k nearest neighbor 最鄰近分類演算法是資料探勘分類 classification 技術中最簡單的演算法之一,其指導思想是 近朱者赤,近墨者黑 即由你的鄰居來推斷出你的類別。knn最鄰近分類演算法的實現原理 為了判斷未知樣本的類別,以所有已知類別的樣本作為參...