1. 程式人生 > >機器學習實戰第二章——學習KNN演算法,讀書筆記

機器學習實戰第二章——學習KNN演算法,讀書筆記

        K近鄰演算法(簡稱KNN)學習是一種常用的監督學習方法,給定測試樣本,基於某種距離度量找出訓練集中與其最靠近的k個訓練樣本,然後基於這k個“鄰居”的資訊來進行預測。通常在分類任務中可以使用“投票法”,即選擇這k個樣本中出現最多的類別標記作為預測結果;在迴歸任務中可以使用“平均法”,即將這個k個樣本的實值輸出標記的平均值作為預測結果。
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] #返回數量最多的一個類別
       上面程式碼中的tile函式,tile函式位於python模組 numpy.lib.shape_base中,他的功能是重複某個陣列。比如tile(A,reps),功能是將陣列A重複reps次,構成一個新的陣列,生成一個與reps的長度相同維度的陣列,上面程式碼中的tile(inX,(dataSetSize,1))中的resps就是(dataSetSize,1),相當於是一個4*1的矩陣型別。

      程式碼的執行結果:

示例:使用K-近鄰演算法

(1)從文字檔案中解析資料

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
 然後用MatPlotlib建立散點圖


    散點圖的顯示如上圖所示。