#新增編碼方式
# -*- 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...