python原生實現KNN演算法 使用鳶尾花資料集

2021-09-28 13:35:23 字數 3971 閱讀 5545

(一)作業題目:

原生python實現knn分類演算法(使用鳶尾花資料集)

k最近鄰(k-nearest neighbor,knn)分類演算法,是乙個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。該方法的思路是:如果乙個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。knn演算法中,所選擇的鄰居都是已經正確分類的物件。該方法在定類決策上只依據最鄰近的乙個或者幾個樣本的類別來決定待分樣本所屬的類別。 knn方法雖然從原理上也依賴於極限定理,但在類別決策時,只與極少量的相鄰樣本有關。由於knn方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,knn方法較其他方法更為適合。

(二)演算法設計

(三)原始碼及實現結果展示

import numpy as np

import matplotlib.pyplot as plt

from decimal import decimal

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split

# 計算距離的函式

# v1,v2是兩個向量,此處對應測試資料與訓練資料

defdistance

(v1, v2)

: dis = np.sqrt(np.

sum(np.square(v1 - v2)))

# 求出兩個資料(向量)之間的距離

return dis

# 選出k近鄰陣列,並選出近鄰陣列**現次數最多的資料作為選中點,記錄對應的類別標籤

defselect_knn

(testdata, traindata, labeltrain, k)

: dis =

# 放置訓練資料列表

dis=

for i in

range

(len

(traindata)):

))#將測試資料與所有的訓練資料之間的距離儲存在乙個列表中

index = np.argsort(dis)

# 按照距離排序,得到排序後的索引值返回給index

labels =

label =

[labeltrain[t]

for t in index[

:k]]

for j in

range

(len

(label)):

if label[j]

notin labels:

labels[label[j]]=

1else

: labels[label[j]]+=

1 sort_dict =

sorted

(labels.items(

), reverse=

true

, key=

lambda item: item[1]

)#對字典按照value值進行降序排序

return sort_dict[0]

[0]# 返回k近鄰**現次數最多的資料點對應的標籤值

# 計算準確率

defscore

(traindata, testdata, labeltest, labeltrain, k)

: succnum =

0#成功測試的測試資料個數

for i in

range

(len

(labeltest)):

testdata = testdata[i]

#取出乙個測試資料進行測試

knndata = select_knn(testdata, traindata, labeltrain, k)

#得到**的結果標籤值

if knndata == labeltest[i]

: succnum +=

1#**成功則計數值加一

accutacy_rate = succnum /

len(labeltest)

#成功數比上總數得到成功概率

return accutacy_rate

defmain()

: n =

int(

input

("請輸入k的取值範圍,從1到n,請輸入n的值:"))

#載入鳶尾花資料集

iris = load_iris(

)# print(iris)

data = iris

#分割資料集

traindata, testdata, labeltrain, labeltest = train_test_split(data[

'data'

], data[

'target'

], test_size=

0.3)

# accuracy = score(traindata, testdata, labeltest, labeltrain, k)

knums=

range(1

,n+1

)#k的取值範圍n

scores=

#每次得分的列表

for k in knums:

s=score(traindata, testdata, labeltest, labeltrain, k)

accuracy = decimal(s)

.quantize(decimal(

'0.000000'))

#準確率保留6位小數

print

("k=%d時的測試準確率為:%f \n"

%(k, accuracy)

) plt.plot(knums,scores)

#使用qt對k值與準確值的變化情況進行繪圖

plt.xlabel(

'k-value'

) plt.ylabel(

'accuracy of knn'

) plt.show(

)if __name__ ==

"__main__"

: main(

)

(四)測試用例設計及除錯過程截圖

測試用例,輸入k的範圍值,即k的範圍是1~你輸入的那個值之間的所有整數

執行完程式之後,程式會將k值與測試準確率之間的關係圖畫出來,便於觀察兩者之間的關係

一開始使用qt時,出現下列問題

解決辦法:

原因是anaconda中的pyqt5在windows下執行需要對應的一些dll檔案,這裡python在使用pyqt5時在當前目錄下找不到qwindows.dll等之類的檔案,在qt5的安裝目錄下找到plaforms資料夾(裡面包含上面說的必要的dll檔案)後,將其複製到python.exe(即為python執行的同級目錄下即可)的同級目錄下,既可以如下圖所示,得到相應的圖了

除錯過程截圖

(五)總結

此次的knn原生實現,使得自己對於python的基本操作更加熟悉,比如字典,列表的一些基本操作等等;除此之外,對於一些庫函式的使用也更加熟練,特別是在此次的作業中,使用了qt相關的畫圖函式。

原生python實現knn演算法

1 knn演算法的思想 就是在訓練集中資料和標籤已知的情況下,輸入測試資料,將測試資料的特徵與訓練集中對應的特徵進行相互比較,找到訓練集中與之最為相似的前k個資料,則該測試資料對應的類別就是k個資料 現次數最多的那個分類。2 演算法設計 根據knn演算法的思想可以得到knn演算法的步驟為 1 計算測...

原生Python實現KNN分類演算法

原生python實現knn分類演算法,用鳶尾花資料集。knn是一種聚類演算法,用於對新的資料點進行分類。對於乙個只知道特徵的資料點,首先計算它和已知訓練集所有點的距離,然後選擇最近的k個點進行 投票表決 來決定所屬型別。因為訓練集的標籤是已知的,所以根據 投票 結果,判定該點的型別為 票數 最多的類...

原生python實現knn分類演算法

一 題目 原生python實現knn分類演算法 二 演算法設計 k 近鄰 k nearset neighbor,簡稱 knn 學習是一種常用的監督學習方法,其工作機制非常簡單 給定測試樣本,基於某種距離度量找出訓練集中與其最靠近的 k 個訓練樣本,然後基於這 k 個 鄰居 的資訊來進行觀測。通常,在...