機器學習 k-近鄰演算法
阿新 • • 發佈:2018-10-31
1、使用python匯入資料
from numpy import * def createDataSet(): group=array([[1.1,1.1],[1.0,1.0],[0,0],[0,0.1]]) labels=['A','A','B','B'] return group,labels
kNN分類演算法:
from numpy import * import operator def classify0(inX,dataSet,labels,k): dataSetSize=dataSet.shape[0] #shape[0]表示dataSet的行數diffMat=tile(inX,(dataSetSize,1))-dataSet sqDiffMat=diffMat**2 sqDistances=sqDiffMat.sum(axis=1) distances=sqDistances**0.5 sortedDistIndicies=distances.argsort() classCount={} for i in range(k): voteIlabel=labels[sortedDistIndicies[i]] classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) return sortedClassCount[0][0]
distances是1*4的矩陣,分別表示待分類的點與所有已知點的距離;
sortedDistIndicies是distances從小到大的索引值;
voteIlabel相當於臨時變數,用來取得標籤值;
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 如果在字典classCount中找到key=voteIlabel的value,就加1,找不到的話classCount.get(voteIlabel,0) 返回0然後加1
sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) 先把字典classCount變成列表,再按照第二維降序排列,返回的仍是列表
執行演算法:
import kNN from classify_kNN import * g,l=kNN.createDataSet() result=classify0([0,0],g,l,3) print(result)
輸出:
B
items():將字典中的項按照列表返回,無序:
get():返回字典對應key的value值,不存在key時返回第二個引數:
dic={'a':1,'b':2,'c':3} print(dic.items()) print(dic.get('c','no')) 輸出: dict_items([('b', 2), ('c', 3), ('a', 1)]) 3
shape:返回矩陣的維數;
from numpy import * c=array([[1,1],[2,3,],[5,6]]) print(c) print(c.shape) print(c.shape[0]) print(c.shape[1]) 輸出: [[1 1] [2 3] [5 6]] (3, 2) 3 2
operator.itemgetter():返回物件特定維的資料,結合sorted()方法使用:
import operator students=[['剛田武',20,'gangtw'],['朱二娃',25,'zhuerw'],['咪咪two',30,'miomitwo']] print(sorted(students,key=operator.itemgetter(1),reverse=True)) 輸出: [['咪咪two', 30, 'miomitwo'], ['朱二娃', 25, 'zhuerw'], ['剛田武', 20, 'gangtw']]
argsort():返回陣列值從小到大的索引值