機器學習實戰《學習筆記》 KNN

2021-07-29 15:53:41 字數 2898 閱讀 2100

#新增編碼方式

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

from numpy import *

import operator

# 準備資料

defcreatedataset

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

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

return group, labels

# 使用knn找出距離最近的類別標籤

# inx:待**的樣本向量

# dataset:訓練樣本集

# labels:訓練樣本集對應的類別標籤,長度與dataset的長度一致

# k:從dataset中找出離inx距離最近的k個樣本

defclassifyknn

(inx, dataset, labels, k):

datasetnum = dataset.shape[0] # 樣本數,dataset是個矩陣/二維陣列,shape屬性返回矩陣的形狀,即行數列數資訊,行數即為樣本個數

diffmat = tile(inx, (datasetnum, 1)) - dataset # tile是numpy庫中的拼接函式,(datasetnum,1)表示副本的行列數,這樣做是為了讓inx與dataset的每一行做運算

sqdiffmat = diffmat ** 2

#inx與每個訓練樣本對應特徵差值的平方

sqdistances = sqdiffmat.sum(axis=1)

distances = sqdistances ** 0.5

#按列對平方差值矩陣求和,之後再開方,即為inx與每個訓練樣本的歐式距離

sorteddistanceidx = distances.argsort() # 距離從小到大的索引值,sorteddistanceidx中存放的是值從小到大的distances的索引值

classcount = {} #統計類別數

for i in range(k): #0~k-1

votelabel = labels[sorteddistanceidx[i]] #sorteddistanceidx中存放的是distances的索引值,其與訓練集的labels是相對應的,只不過sorteddistanceidx儲存的是距離從小到大的索引,若此時i=0,則sorteddistanceidx[i]值為離inx最近的訓練樣本的索引值,labels[sorteddistanceidx[i]]值為這個離的最近的訓練樣本的類別

classcount[votelabel] = classcount.get(votelabel, 0) + 1

#類別字典對應key的value增1

sortedclasscount = sorted(classcount.iteritems(), key=operator.itemgetter(1), reverse=true) #sorted是python內建的排序方法,classcount.iteritems()得到字典的key-value對列表,用來迭代,key指使用哪個特徵來排序,reverse表示降序or公升序

return sortedclasscount[0][0] #因為是降序排列,sortedclasscount[0][0]表示出現次數最多的類別,sortedclasscount[0][1]表示最多類別的出現次數

# 執行

g, l = createdataset()

print classifyknn((0, 0), g, l, 3)

a = (4, 1, 3)

b = operator.itemgetter(2, 0)

print b(a)

結果為(3, 4)

students = [('carl', 'c', 66), ('sarah', 'a', 93), ('bill', 'c', 71)]

s = sorted(students, key=lambda student: student[2], reverse=true) #lambda表示式

t = sorted(students, key=operator.itemgetter(0), reverse=false) #operator.itemgetter

print s, '\n', t

結果為[('sarah', 'a', 93), ('bill', 'c', 71), ('carl', 'c', 66)]

[('bill', 'c', 71), ('carl', 'c', 66), ('sarah', 'a', 93)],其中,students是list,lamdba表示式是用第2個特徵來做排序的,operator.itemgetter是用第0個特徵來排序,排序結果都是list。

students = 

s = sorted(students.iteritems(), key=lambda student: student[1], reverse=false)

t = sorted(students.iteritems(), key=operator.itemgetter(1), reverse=false)

print s, '\n', t

結果為[('carl', 66), ('bill', 71), ('sarah', 93)]

[('carl', 66), ('bill', 71), ('sarah', 93)],其中,students是字典dict,要先使用iteritems方法獲取key-value的迭代物件,這裡的key都是用第1個特徵排序,lambda表示式和operator.itemgetter的效果一樣,排序結果都是list。

學習筆記 機器學習實戰 KNN

knn演算法注釋版,新手小白,有錯誤歡迎指正 環境 python 3.6 knn分類器 def classify inx,dataset,labels,k inx為行向量 datasize dataset.shape 0 求訓練集的行數 diffmat tile inx datasize,1 dat...

機器學習實戰 kNN

一 演算法過程 1 首先存在乙個資料集作為訓練樣本集dataset,比如訓練樣本的資料中,每一條資料都包含乙個城市的某一天空氣中的pm2.5,no2濃度等維度的特徵值。每一條資料同時包含乙個標籤,比如這一天的空氣質素是優,良,輕度汙染,中度汙染,重度汙染中的乙個。2 現在我們輸入一條資料inx,如包...

機器學習實戰 KNN

import numpy as np import operator def createdataset group np.array 1.0,1.1 1.0,1.0 0,0 0,0.1 labels a a b b return group,labels def classify0 inx,dat...