Python3 2 實現基於KNN演算法的資料分類

2021-06-22 00:38:38 字數 1977 閱讀 1374

這幾天在看《機器學習實戰》一書,買這本書的最首要原因是它裡面採用python來實現,而我這段時間對python的好感越來越強烈。拿到手後一看,果然很不錯,書中對一些經典機器學習演算法的解釋與實現 闡述的都很通俗。今天把knn演算法看懂了,在些基礎上用python進行了實現,**主要還是基於書中的示例,我在看明白後,加上了注釋。

knn屬於監督學習,要求事先準備好已知分類結果的資料集(即樣本資料),其基本原理較為簡單。對於待分類的資料集,將其各特徵值與樣本資料對應的特徵值進行比較,然後提取出樣本集中與待分類資料的特徵最相近的k個資料所對應的分類結果標註,最後從中找出出現最多的那個標註作為待分類資料的最終分類結果。

已有資料:

group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])

labels=['a','a','b','b']

兩組待分類資料:

[1.0,0.8]

[0.5,0.5]

求兩組待分類資料分別屬於哪一類

from numpy import *

import operator

#已有資料,以及對應的標籤

group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])

labels=['a','a','b','b']

'''作用:將待分類資料集與已有資料集以其標籤進行計算,從而得出待分類資料集最有可能所屬的類別

引數:inx:待分類資料集

dataset:已有資料集,通過createdataset()函式獲取

labels:已有資料集對應的分類標籤,通過createdataset()函式獲取

k:設定最小距離數

'''

def classify0(inx, dataset, labels, k):

datasetsize = dataset.shape[0] #獲取資料集的行數

#計算距離

#tile(a,(b,c)):將a的內容在行上重複b次,列上重複c次

#下面這一行**的結果是將待分類資料集擴充套件到與已有資料集同樣的規模,然後再與已有資料集作差

diffmat = tile(inx, (datasetsize,1)) - dataset

sqdiffmat = diffmat**2 #對上述差值求平方

sqdistances = sqdiffmat.sum(axis=1) #對於每一行資料求和

distances = sqdistances**0.5 #對上述結果開方

sorteddistindicies = distances.argsort() #對開方結果建立索引

#計算距離最小的k個點的lable

classcount={} #建立空字典,類別字典,儲存各類別的數目

for i in range(k): #通過迴圈尋找k個近鄰

voteilabel = labels[sorteddistindicies[i]] #先找出開方結果索引表中第i個值對應的label值

classcount[voteilabel] = classcount.get(voteilabel,0) + 1 # 存入當前label以及對應的類別值

sortedclasscount = sorted(classcount.items(), key=operator.itemgetter(1), reverse=true) #對類別字典進行逆排序,級別數目多的往前放

#返回結果

return sortedclasscount[0][0] #返回級別字典中的第乙個值,也就是最有可能的label值

#進行分類

Python3 2 實現基於KNN演算法的資料分類

這幾天在看 機器學習實戰 一書,買這本書的最首要原因是它裡面採用python來實現,而我這段時間對python的好感越來越強烈。拿到手後一看,果然很不錯,書中對一些經典機器學習演算法的解釋與實現 闡述的都很通俗。今天把knn演算法看懂了,在些基礎上用python進行了實現,主要還是基於書中的示例,我...

python3 2筆記(程式設計)

python中對檔案 資料夾的操作需要涉及到os模組和shutil模組。一 檔案開啟 f open name mode buffering 入口引數 name 檔名 mode 選項,字串 buffering 是否緩衝 0 不緩衝,1 緩衝,1的int數 緩衝區大小 返回值 檔案物件 mode 選項 ...

Python3 2 官方文件教程 列表

第三章 資料結構 這章將詳細學習你以前已經知道的知識,同時也會新增一些新知識。3.1 列表 列表資料型別有很多方法,以下是列表物件的所有方法 新增單個元素到列表末尾,等同於 a len a x list.extend l 通過新增指定列表中所有的元素來擴充套件列表,等同於 a len a l.lis...