這幾天在看《機器學習實戰》一書,買這本書的最首要原因是它裡面採用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...