Python 實現 KNN 分類演算法

2021-10-03 06:16:57 字數 3530 閱讀 3215

2. python 實現

本文將詳細講述 knn 演算法及其 python 實現

knn(k-nearest neighbour)即 k最近鄰,是分類演算法中最簡單的演算法之一。knn 演算法的核心思想是如果乙個樣本在特徵空間中的 k 個最相鄰的樣本中的大多數屬於某乙個類別,則將該樣本歸為該類別

有 n 個已知分類結果的樣本點,對新紀錄r使用 knn 將其分類

優點:

缺點:已知分類如圖所示(由於是隨機產生,所以具體的樣本點可能不一樣)

其中順時針依次是第1、2、3類,即紅色是第 1 類,藍色是第 2 類, 灰色是第 3 類

# coding=utf-8

"""@author: shenke

@project: aitest

@file: knn.py

@date: 2020/2/26

@description: python 實現 knn(k-最鄰近)分類演算法

"""import numpy as np

import matplotlib.pyplot as plt

from math import sqrt

class

knn():

def__init__

(self, k)

: self.k = k

defgenerate_points

(self, x_scope, y_scope, size)

:"""

產生給定範圍內的二維座標點

"""x = np.random.randint(x_scope[0]

, x_scope[1]

, size=size)

y = np.random.randint(y_scope[0]

, y_scope[1]

, size=size)

points = np.dstack(

(x, y))[

0]return points

defgenerate_data

(self, size)

:"""

隨機產生三個範圍內的資料

"""points1 = self.generate_points([0

,8],

[12,20

], size)

labels1 =[1

]* size

points2 = self.generate_points([12

,20],

[12,20

], size)

labels2 =[2

]* size

points3 = self.generate_points([7

,13],

[0,8

], size)

labels3 =[3

]* size

plt.scatter(points1[

:size,0]

, points1[

:size,1]

, color=

'red'

) plt.scatter(points2[

:size,0]

, points2[

:size,1]

, color=

'blue'

) plt.scatter(points3[

:size,0]

, points3[

:size,1]

, color=

'gray'

) data = np.concatenate(

[points1, points2, points3]

) label = np.concatenate(

[labels1, labels2, labels3]

)return data, label

defclassify

(self, target)

:"""

實現 knn 分類

"""k = self.k

# 設定每個類別中有 10 個樣本點

data, label = self.generate_data(10)

# 計算歐氏距離

distance =

[sqrt(np.

sum(

(target - point)**2

))for point in data]

# 返回距離最近的 k 個樣本的下標

k_index = np.argsort(distance)

[:k]

# 返回 k 個樣本的標籤

k_labels =

[label[item]

for item in k_index]

# 返回 k 個樣本中最多歸屬類別的分類標籤

res =

max(k_labels, key=k_labels.count)

print

('該目標點為:第 %d 類'

%(res)

)# 展示結果

# 標出距離最近的 k 個樣本點

plt.scatter(

[data[index][0

]for index in k_index]

,[data[index][1

]for index in k_index]

, color=

'', marker=

'o',

edgecolors=

'green'

, s=

200)

# 標出目標點

plt.scatter(target[0]

, target[1]

, color=

'green'

) plt.show(

)

測試

from algorithm import knn

if __name__ ==

'__main__'

:# 設定 k 值為 4,**點座標為(10,10)

knn.knn(4)

.classify([10

,10])

**結果

上圖中標出了**點(綠色)並圈出了與**點距離最近的四個點,其中屬於第 3 類的樣本點個數最多,故**該點屬於第 3 類

但是由於 k 值對**結果影響較大,可能對**結果產生誤判。如以下情況,四個點中屬於第 1 類和第 3 類的樣本點個數一樣多,這時就無法準確判斷出該點的類別

python實現KNN分類演算法

k近鄰演算法,簡稱knn演算法,作用就是分類 三大要素 import numpy import matplotlib.pyplot as plt 已知訓練集和訓練集類別 測試集 1.測試集廣播和訓練集一樣的規格 2.計算距離 3.對距離列表排序返回最近的k個點的下標 4.有幾個類別就設幾個標籤用來統...

python實現KNN分類演算法

import sklearn import numpy as np from sklearn.neighbors import kneighborsclassifier import sklearn.datasets as data import matplotlib as mpl import m...

分類 KNN分類演算法之Python實現

knn稱為k最近鄰。對於待分類資料,它先計算出與其最相近的k個的樣本,然後判斷這k個樣本中最多的類標籤,並將待分類資料標記為這個最多的類標籤。python樣例 import numpy as np from sklearn.neighbors import kneighborsclassifier ...