機器學習實戰第二章——學習KNN演算法,讀書筆記
阿新 • • 發佈:2019-01-10
K近鄰演算法(簡稱KNN)學習是一種常用的監督學習方法,給定測試樣本,基於某種距離度量找出訓練集中與其最靠近的k個訓練樣本,然後基於這k個“鄰居”的資訊來進行預測。通常在分類任務中可以使用“投票法”,即選擇這k個樣本中出現最多的類別標記作為預測結果;在迴歸任務中可以使用“平均法”,即將這個k個樣本的實值輸出標記的平均值作為預測結果。
上面程式碼中的tile函式,tile函式位於python模組 numpy.lib.shape_base中,他的功能是重複某個陣列。比如tile(A,reps),功能是將陣列A重複reps次,構成一個新的陣列,生成一個與reps的長度相同維度的陣列,上面程式碼中的tile(inX,(dataSetSize,1))中的resps就是(dataSetSize,1),相當於是一個4*1的矩陣型別。from numpy import * import operator def createDataSet(): #建立一個數據集 group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) #作為訓練集的資料,該資料集有4個樣本,每一個樣本是一個二維座標 labels=['A','A','B','B'] #上面的樣本資料所對應的標記 return group,labels def classify0(inX,dataSet,labels,k): #classify0()函式有4個輸入引數,inX是用於分類的輸入向量,dataSet是上面函式中的訓練資料集, #label是上面的訓練資料集中的樣本的標記,k是KNN選擇的大小 dataSetSize=dataSet.shape[0] #dataSetSize是上面的訓練資料集的大小 diffMat=tile(inX,(dataSetSize,1))-dataSet #為了計算距離的準備,tile函式將inX重複了dataSetSize行,每一行重複1次,與訓練集相減 sqDiffMat=diffMat**2 #diffMat的平方,(x1-x2)^2
sqDistances=sqDiffMat.sum(axis=1) #列相加,(x1-x2)^2+(y1-y2)^2 distances=sqDistances**0.5 sortedDistIndicies=distances.argsort() #argsort進行排序,按照值的大小按照從小到大的順序返回下標值 classCount={} for i in range(k): voteIlabel=labels[sortedDistIndicies[i]] #返回前k個小的距離的標記 classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 #這一行程式碼的意思就是將返回的k個點的類別進行統計 sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True) #按照類別和數量進行排序 return sortedClassCount[0][0] #返回數量最多的一個類別
程式碼的執行結果:
示例:使用K-近鄰演算法
(1)從文字檔案中解析資料
然後用MatPlotlib建立散點圖def file2matrix(filename): fr=open(filename) #開啟檔案 arrayOLines=fr.readlines() #一行一行的讀檔案內容 numberOfLines=len(arrayOLines) #得到檔案的行數,返回給numberOfLines returnMat=zeros((numberOfLines,3)) #建立一個以0填充的矩陣,是一個二維矩陣,numberOfLines*3的矩陣 classLabelVector=[] index=0 for line in arrayOLines: line=line.strip() #擷取掉所有的回車字元 listFromLine=line.split('\t') #然後使用tab字元‘\t’將上一步得到的整行資料分割成一個元素列表 returnMat[index,:]=listFromLine[0:3] #取元素列表中的前3個元素,將其儲存到特徵矩陣當中 classLabelVector.append(int(listFromLine[-1])) #Python語言使用索引值-1表示列表中的最後一列元素,需要明確的表示儲存的型別是int,不然會解釋為字串 index+=1 return returnMat,classLabelVector
散點圖的顯示如上圖所示。