原生python實現knn演算法

2021-09-28 15:54:35 字數 4385 閱讀 7810

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

2、演算法設計

根據knn演算法的思想可以得到knn演算法的步驟為:

(1)、計算測試物件到訓練集中每個物件的距離

(2)、按照距離的遠近排序

(3)、選取與當前測試物件最近的k的訓練物件,作為該測試物件的鄰居

(4)、統計這k個鄰居的類別頻率

(5)、k個鄰居裡頻率最高的類別,即為測試物件的類別

根據以上步驟,可以對knn演算法最重要的分類功能進行實現,其餘部分可以仿照sklearn中的knn演算法的函式進行設計。

sklearn中的knn分類演算法中的主要函式包括訓練函式fit()、分類**函式predict()、測試集精度計算函式score()。

使用sklearn包中的knn演算法實現分類的過程主要為:

knn = kneighborsclassifier(n_neighbors=3)

knn.fit(x_train,y_train)

knn.predict(x_test)

knn.score(x_test,y_test)

因此,要實現knn演算法,需要實現以上3個功能,則knn演算法中的函式設計過程為:

(1)、fit()

該函式的主要功能是實現訓練資料,但knn演算法使用的是用距離進行比較分類,因此這裡的fit()函式不需要實現任何功能,只需將訓練資料進行賦值即可。

(2)、predict()

該函式為knn分類功能實現的主要函式,可以按照knn演算法的步驟進行設計。首先計算距離,然後對距離進行排序,選擇最小的k個距離,統計這k個距離對應的類別,然後統計出類別佔比最高的那個類別即為**的結果。

(3)、score()

該函式實現的是測試集精度計算功能,需要得到**結果後與測試集的標籤進行比較,計算**正確的結果所佔標籤的比例即為該測試資料的精度。

3、程式實現**

首先是需要匯入的python包

import numpy as np

from sklearn.datasets import load_iris

from collections import counter

from sklearn.model_selection import train_test_split

import pandas as pd

函式的實現

class

kneighborsclassifier

:def

__init__

(self, k)

:"""

初始化函式,將要訓練的資料設為私有的

:param k:k為要選取的最鄰近的點數目

"""self.k = k

self._x_train =

none

self._y_train =

none

deffit

(self,x_train,y_train)

:"""

定義訓練函式,但因為knn演算法中使用的是距離進行分類,

所以不需要訓練,因此這個函式只是將資料重新賦值一遍

:param x_train:訓練集資料

:param y_train:訓練資料集資料對應的標籤

:return:返回資料集

"""self._x_train = x_train

self._y_train = y_train

return self

def_predict

(self,x_new)

:"""

**函式,私有,因為不需要外部呼叫,實現了knn分類的功能,通過計算訓練集中所有資料點與新樣本點之間的距離,

選取距離樣本點最近的k個訓練集資料點,通過比較k個點中那種類別的點數目最多,

則新樣本點就為該類別。

:param x_new: 要**的樣本

:return:新樣本的類別

"""assert self._x_train is

notnone

# 斷言,要求訓練集資料不能為空,即必須先執行fit()函式

assert self._y_train is

notnone

# 計算點樣本點與訓練資料點之間的歐式距離

distances =

[np.sqrt(np.

sum(

(x_train-x_new)**2

))for x_train in self._x_train]

sort = np.argsort(distances)

# 對距離從小到大進行排序

topk =

[self._y_train[i]

for i in sort[

:self.k]

]# 選出前k個最近的距離所對應類別

votes = counter(topk)

# 統計每個距離所對應的類別的數目

y_predict = votes.most_common(1)

[0][

0]# 取出**得到的類別

return y_predict

defpredict

(self,x_predict)

:"""

實現多個要**的點的分類

:param x_predict: 要**的新樣本點

:return: **結果

"""y_predict =

[self._predict(x_new)

for x_new in x_predict]

# 迴圈**得到每個點的類別

return np.array(y_predict)

defscore

(self,y_test,y_predict)

:"""

計算測試集的精度

:param y_test: 測試資料的標籤

:param y_predict: 測試資料的**結果

:return: 測試集的精度

"""_score = np.mean(y_predict == y_test)

return _score

對函式功能進行測試,這裡使用的是sklearn中的鳶尾花資料集進行的測試,對於訓練資料與測試資料的分類是通過train_test_split完成的。

if __name__ ==

'__main__'

: iris_dataset = load_iris(

)# 獲得鳶尾花資料

"""將鳶尾花資料分類,data陣列裡面資料為鳶尾花的花萼長度、花萼寬度、花瓣長度、花瓣寬度

target陣列包含的測量過的每朵花的品種,共有三個品種"""

x_train, x_test, y_train, y_test = train_test_split(iris_dataset[

'data'

], iris_dataset[

'target'

], random_state=0)

knn = kneighborsclassifier(k=3)

# 建立例項,取3個最近鄰的點

knn.fit(x_train,y_train)

prediction =knn.predict(x_test)

# **測試集資料

score = knn.score(y_test,prediction)

# 計算測試集精確度

df =

result_frame = pd.dataframe(df)

cols =

list

(result_frame)

cols.insert(

0,cols.pop(cols.index(

'**結果'))

)# 交換兩列的位置

result_frame = result_frame.loc[

:,cols]

print

(result_frame)

print

("test set score:{}"

.format

(score)

)

輸出結果

可以看到測試集的精確度為0.9736842105263158,說明該演算法的基本功能已經能夠實現,並且模型對測試資料的**結果也比較準確。

原生Python實現KNN分類演算法

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

原生python實現knn分類演算法

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

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

1.作業題目 原生python實現knn分類演算法,用鳶尾花資料集 2.演算法設計 knn演算法設計思路 演算法涉及3個主要因素 訓練資料集 距離或相似度的計算衡量 k的大小 對於確定未知類別 1.計算已知類別資料集中的點與當前點的距離 距離的計算一般使用歐氏距離或曼哈頓距離 2.按照距離依次排序 ...