knn演算法的具體實現
參考部落格
knn演算法,又叫k-近鄰演算法。屬於乙個分類演算法,主要思想如下:
乙個樣本在特徵空間中的k個最近鄰的樣本中的大多數都屬於某乙個類別,則該樣本也屬於這個類別。其中k表示最近鄰居的個數。(通俗理解:和最近的幾個是一類)
二維圖示:
iris 鳶尾花資料集內包含 3 類分別為山鳶尾(iris-setosa)、變色鳶尾(iris-versicolor)和維吉尼亞鳶尾(iris-virginica),共 150 條記錄,每類各 50 個資料,每條記錄都有 4 項特徵:花萼長度、花萼寬度、花瓣長度、花瓣寬度,可以通過這4個特徵**鳶尾花卉屬於哪一品種。
iris資料集包含在sklearn庫當中,具體在sklearn\datasets\data資料夾下,檔名為iris.csv。以本機為例。其路徑如下:
d:\python\lib\site-packages\sklearn\datasets\data\iris.csv
其中資料如下格式:
第一行資料意義如下:
150:資料集中資料的總條數
4:特徵值的類別數,即花萼長度、花萼寬度、花瓣長度、花瓣寬度。
setosa、versicolor、virginica:三種鳶尾花名
// 完整**
import csv
import random
import operator
#讀取資料
with
open
('iris.csv'
,'r'
)as file: ##開啟檔案'iris.csv',並命名為 file
reader = csv.
dictreader
(file) ##dictreader 以字典的形式讀取這個檔案,reader可迭代
#for row in reader:
#print
(row) #可以打出每一行的值
datas =
[row for row in reader] ##推導; 把每行都存到datas內。datas就是乙個大的list
##分組
random.
shuffle
(datas) ##因給定的資料是按類別分好的,要打亂。 shuffle洗牌的意思
n =len
(datas)
//3 #// 表示整除 ##將資料分成三份
test_set = datas[
0:n] ##測試組
train_set = datas[n:
] ##訓練組
##knn
##求距離
def distance
(d1, d2)
: res =
0 feature =
("150"
,"4"
,"setosa"
,"versicolor"
) ##官方的**很是奇怪,這裡根據csv檔案直接進行字典匹配的特性,沒有對第一行的資料進行修改
##這四個分別對應四個特徵:花萼長度值,花萼寬度值,花瓣長度值,花瓣寬度值
for key in
(feature)
: ##迴圈對每個特徵進行相見平方
res +=
(float
(d1[key])-
float
(d2[key]))
**2##csv讀過來的資料都是字串,所以要float轉換成浮點型,進行運算
return res**
0.5##對加和求導,就得到距離。
#開始我對距離理解v不是很好,距離不只是狹義的空間上的距離,可以理解為n維空間的距離
k=5 ##k取5
##knn演算法
def knn
(data)
: #1 求距離
#2 排序——公升序
#3 取前k個
#4 加權平均
#1 求距離
res =
[for train in train_set
]##再用推導,將花的種類賦值給result,將距離賦值給distance
#2 排序——公升序
#以 distance 為依據公升序,距離近的排前面
res =
sorted
(res, key = lambda item:item[
'distance'
])#item:將結果以列表的形式展示
#print
(res) ##每一步輸出防止整個程式寫完出錯
#3取前k個
res2 = res[0:
k] ##取前k個
#print
(res2)
#4 加權平均
result =
# ##總距離
sum =
0for r in res2: ##將k個值的總距離加起來
sum+= r[
'distance'
]for r in res2: ##距離近的加權就越大,(距離近distance小,用1減就大了)
result[r[
'result']]
+=1- r[
'distance'
]/sum ##距離近權重的就會不斷累加
resulutcount1=
sorted
(result.
items()
, key=operator.
itemgetter(1
), reverse=true)
## 依據加權結果的大小進行排序,reverse = true 為降序
return
(resulutcount1[0]
[0])#返回最大值
##測試階段
correct =
0 ##定義正確的個數
for test in test_set: ##測試集進行測試對比
result = test[
'virginica'
] result2 =
knn(test)
if result == result2:
correct+=
1print
("正確率:%"
.format
(100
*correct/
len(test_set)
))
knn實現鳶尾花分類
依照歐氏距離計算公式計算測試資料與訓練集的距離 按照距離公升序排序,選取距離最小的k個點 確定前k個點所在類別的出現頻率 返回前k個點出現頻率最高的類作為測試資料的 分類 import operator import numpy as np from sklearn.datasets import ...
KNN實現鳶尾花分類
將其按照7 3的比例劃分為訓練集和測試集。前4列為特徵,第5列為類別,setosa 視為1,versicolor 視為2,virginica 視為3 測試集順序略有調整。最簡單最初級的分類器是將全部的訓練資料所對應的類別都記錄下來,當測試物件的屬性和某個訓練物件的屬性完全匹配時,便可以對其進行分類。...
鳶尾花資料集knn演算法python實現
1.作業題目 原生python實現knn分類演算法,用鳶尾花資料集。2.演算法設計 首先需要設定資料集 以50個為例 然後在程式中匯入資料集,根據資料集畫出散點圖。另外還需要定義兩個函式,其中乙個函式來計算兩個資料點之間的歐氏距離,另乙個函式設定knn模型,即計算訓練資料與測試資料之間的歐氏距離,然...