knn演算法實際上是利用訓練資料集對特徵向量空間進行劃分,並作為其分類的模型。其輸入是例項的特徵向量,輸出為例項的類別。尋找最近的k個資料,推測新資料的分類。
對於上面的這個散點圖,已知的點是分布在乙個二維空間的,當然,在實際生活中,情況會變得複雜,可能是多維的。這個例子表示的是腫瘤病人的相關資訊,橫軸表示腫瘤的大小,縱軸表示腫瘤發現的時間,這兩個軸均是病人腫瘤的特徵資訊。紅色的點表示良性腫瘤,藍色的表示惡性,表示的是腫瘤的分類。
有了這些初始資訊,假如這個時候來了一條新的腫瘤特徵資訊,我們就可以通過knn演算法來對其分類進行**:
首先我們會取乙個k值,假如這裡k=3(k如何取值後面會提到)。接下來要做的就是在所有的點中選擇離這個新的點最近的三個點,然後這三個點根據自己的分類進行投票,這裡的話三個點都是惡性腫瘤,所以根據惡性對良性3:0推測這個新的點也是惡性腫瘤。
knn演算法的本質其實是認為兩個樣本如果他們足夠相似的話,那麼他們就具有更高的概率屬於同一類別。這裡我們通過計算兩個樣本在樣本空間中的距離來衡量他們的相似度。
計算距離
計算待求點與其他點之間的距離(常用歐幾里得距離或馬氏距離)
公升序排列
將計算的距離按照公升序排列,即距離越近越靠前
取前k個
加權平均
import pandas as pd
import random
from collections import counter
# 讀取資料
file_data = pd.read_csv(
"./_cancer.csv"
).to_dict(orient=
"records"
)# 分組:測試集(少量)、訓練集--(確保演算法是有效的、可行的)
# 避免偶然情況,先將資料集打亂
random.shuffle(file_data)
test_set = file_data[
:len
(file_data)//3
]train_set = file_data[
len(file_data)//3
:]# 計算距離(這裡使用歐氏距離)
defdistance
(p1, p2)
: res =
0for key in
("radius"
,"texture"
,"perimeter"
,"area"
,"smoothness"
,"compactness"
,"symmetry"
,"fractal_dimension"):
res +=
(p1[key]
- p2[key])**
2return res **
0.5k =
5#這裡取k=5
# knn
defknn
(new_data)
:# 1.計算距離
res =
[for
train_data in train_set]
# 2.公升序排列
res =
sorted
(res, key=
lambda item: item[
"distance"])
# 3.取前k個
res = res[
:k]# 4.投票選舉(也可以加權平均)
res_list =
[item[
"diagnosis_result"
]for item in res]
votes = counter(res_list)
return votes.most_common(1)
[0][
0]# 測試
correct =
0for test in test_set:
if test[
"diagnosis_result"
]== knn(test)
: correct +=
1print
("正確率 = %"
.format
((correct /
len(test_set))*
100)
)
100條資料測得準確率在80%左 KNN k近鄰演算法
現在假如我們已經擁有了一些資料 稱為訓練資料集 ts,並且擁有所有資料的類別名 即每條資料應該歸於哪個類別。當我們要判斷一條不知類別的資料時,首先讓這條資料m和已經擁有的所有的資料ts中的每一條資料進行比較,然後根據比較結果選擇出和m最相似 一般是基於距離 的k條資料 k是個整數,並且通常是小於20...
kNN(k近鄰演算法)
k近鄰分析 knn 一 概述 knn演算法是一種有監督學習的分類演算法。所謂有監督學習,就是在應用演算法之前我們必須準備一組訓練集,訓練集中的每個例項都是由一些特徵和乙個分類標籤組成 通常還會存在乙個測試集,用來測試訓練出來的分類模型的準確性。其實knn演算法並沒有體現出有監督學習的所有特點,沒有模...
kNN k近鄰演算法
一 knn演算法的思想 knn演算法作為機器學習演算法中非常有效比較容易掌握的演算法,其基本思想是採用測量不同特徵值之間的距離的方法進行分類。knn屬於監督學習演算法,它的工作原理是 存在乙個樣本資料集,訓練樣本集,並且樣本集中的每個資料都存在標籤,即我們知道樣本集中每乙個資料與所屬分類的對應關係。...