python實現knn演算法,並採用鳶尾花資料集驗證

2021-09-28 15:44:18 字數 2954 閱讀 3127

(1)鄰近演算法

或者說k最近鄰(knn,k-nearestneighbor)分類演算法是資料探勘

分類技術中最簡單的方法之一。所謂k最近鄰,就是k個最近的鄰居的

意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。

(2)主要思路
1. 準備資料,對資料進行預處理

2. 選用合適的資料結構儲存訓練資料和測試元組

3. 設定引數,如k

4.維護乙個大小為k的的按距離由大到小的優先順序佇列,用於儲存

最近鄰訓練元組。隨機從訓練元組中選取k個元組作為初始的最近

鄰元組,分別計算測試元組到這k個元組的距離,將訓練元組標號

和距離存入優先順序佇列

5. 遍歷訓練元組集,計算當前訓練元組與測試元組的距離,將所

得距離l 與優先順序佇列中的最大距離lmax

6. 進行比較。若l>=lmax,則捨棄該元組,遍歷下乙個元組。若

l < lmax,刪除優先順序佇列中最大距離的元組,將當前訓練元組

存入優先順序佇列。

7. 遍歷完畢,計算優先順序佇列中k 個元組的多數類,並將其作為

測試元組的類別。

8. 測試元組集測試完畢後計算誤差率,繼續設定不同的k值重新

進行訓練,最後取誤差率最小的k值。

(1)演算法流程圖

(2)演算法實現

# -*- coding: utf-8 -*-

"""@author: baohj

"""# 模仿sklearn 形式封裝

from sklearn.datasets import load_iris # 匯入資料集iris

import math

from collections import counter

import numpy as np

class

k_nn

:'''初始化'''

def__init__

(self, k)

: self.k = k

self._x_train =

none

self._y_train =

none

deffit

(self, x_train, y_train)

:'''必須是相同的'''

self._x_train = x_train

self._y_train = y_train

return self

defpredict

(self, x_pre)

:'''給定待**數劇集,給出**結果向量'''

y_pre =

[self._predict(x)

for x in x_pre]

return np.array(y_pre)

'''給定單個資料,返回**類別'''

def_predict

(self, x)

:#計算距離

d =[math.sqrt(np.

sum(

(x - self._x_train[i])**

2))for i in

range

(len

(self._x_train))]

near = np.argsort(d)

#計算k個最近鄰

top_k =

[self._y_train[i]

for i in near[0:

6]] votes = counter(top_k)

pre_y = votes.most_common(1)

[0][

0]# **結果存在pre_y中

return pre_y

# 載入資料集,有iris.data和iris.target

iris = load_iris(

)# 前149個樣本作為訓練集,最後乙個做**

test_x = iris.data[0:

149]

test_y = iris.target[

:149

]x = iris.data[

149]

print

("資料集:"

, end="")

print

(test_y)

knn = k_nn(6)

knn.fit(test_x, test_y)

print

("結果:"

, end="")

print

(knn.predict(

[x])

)

取前149個資料作為訓練集,最後乙個為測試集。由執行結果可以看出,**結果為2。執行並未出現錯誤。

(1)優點

(1)理論成熟簡單,易於理解及演算法實現;

(2) 可以用於多分類分類、回歸等;

(2)缺點
(1)需要計算待分類樣本與所有已知樣本的距離,計算量大;

(2)樣本容量小或樣本分佈不均衡時,容易分類錯誤,後者可

通過施加距離權重進行改善;

在knn演算法的實現中包含了很多種情況,和多個步驟。事先通過書籍

和網路資料總結出實現knn演算法的步驟,然後根據步驟利用python的強大

資料處理功能進行處理最終得到完整的程式。

最終發現,實現knn演算法並非很難,重點在於利用python的資料處理

能力。只要做好python的使用即可。

Python實現KNN演算法

from numpy import import operator def creatdataset group array 1.0,1.1 1.0,1.0 0,0 0,0.1 lables a a b b return group,lables def classify0 inx,dataset,...

python實現knn演算法

importnumpyasnp importoperator defcreatedataset group np.array 1.0 1.1 1.0 1.0 0.0 0.0 0.0 0.1 labels a a b b returngroup,labels 分類演算法 inx待分類的點 defcla...

python實現KNN演算法

具體 如下 import numpy as np import matplotlib.pyplot as plt class myknn def init self,k self.k k def compute self,x train,y train,x test dist i 0 計算歐式距離 ...