小白python學習——機器學習篇——k-近鄰演算法(KNN演算法)
一、演算法理解
一般給你一資料集,作為該題目的資料(一個矩陣,每一行是所有特徵),而且每一組資料都是分了類,然後給你一個數據,讓這個你預測這組資料屬於什麼類別。你需要對資料集進行處理,如:歸一化數值。處理後可以用matplotlib繪製出影象,一般選兩個特徵繪製x,y軸,然後核心是計算出預測點到各個資料的距離,距離越小越接近正確。選出整個統計資料集的k個,然後概率大的一類作為該資料的分類。
二、步驟簡介
1、收集資料,把資料從檔案中合理提取出來,會用到一個提取資料函式。
2.分析資料,使用matplotlib繪製整體分佈,記住選出兩個特徵作為x,y值
3.準備資料(資料處理),資料歸一化,使資料變成在【-1,1】之間,公式:newValue=(oldvalue-min)/(max-min)
這裡的max和min是每一列的最值,也就是所有個體的同一特徵。
4.實現演算法,通過矩陣在座標軸的距離,實現分類
5.演算法錯誤率的計算(這裡不說了)
三、演算法展示
1.收集資料:
def file2matrix(filename): # 開啟檔案 fr = open(filename) # 計算文字檔案的行數 numberOfLines = len(fr.readlines()) # 建立返回的資料矩陣 returnMat = np.zeros((numberOfLines,3)) # 建立類標籤 classLabelVector = [] # 開啟檔案 fr = open(filename) # 定義索引 index = 0 # 讀取檔案的每一行並處理 for line in fr.readlines(): # 去除行的尾部的換行符 line = line.strip() # 將一行資料按空進行分割 listFromLine = line.split('\t') # 0:3列為資料集的資料 returnMat[index,:] = listFromLine[0:3] # 最後一列為資料的分類標籤 classLabelVector.append(listFromLine[-1]) # 索引加1 index += 1 # 返回資料集和對應的類標籤 return returnMat,classLabelVector
2.分析資料(matplotlib實現散點圖)
def scatter(returnMat): plt.scatter(returnMat[:, 1], returnMat[:, 2]) plt.title("約會散點圖", fontproperties="SimHei", fontsize=25) plt.xlabel("玩視訊遊戲所消耗的百分比", fontproperties="SimHei", fontsize=15) plt.ylabel("每週消耗的冰淇淋的公斤升數", fontproperties="SimHei", fontsize=15) plt.xlim((0, 25)) plt.ylim((0.0, 2.0)) plt.xticks([0, 5, 10, 15, 20, 25]) plt.yticks([0.0, 0.5, 1.0, 1.5, 2.0]) plt.show() #繪製資料集的散點圖
效果圖:
3.資料處理(歸一化數值).
def autoNorm(dataSet): # 求資料矩陣每一列的最小值 minVals = dataSet.min(0) # 求資料矩陣每一列的最大值 maxVals = dataSet.max(0) # 求資料矩陣每一列的最大最小值差值 ranges = maxVals - minVals # normDataSet = zeros(shape(dataSet)) # 返回資料矩陣第一維的數目 m = dataSet.shape[0] # 求矩陣每一列減去該列最小值,得出差值 normDataSet = dataSet - np.tile(minVals, (m, 1)) # 用求的差值除以最大最小值差值,即資料的變化範圍,即歸一化 normDataSet = normDataSet / np.tile(ranges, (m, 1)) # 返回歸一化後的資料,最大最小值差值,最小值 return normDataSet, ranges, minVals #將資料集歸一化特徵值
歸一化前後圖:
[[4.0920000e+04 8.3269760e+00 9.5395200e-01]
[1.4488000e+04 7.1534690e+00 1.6739040e+00]
[2.6052000e+04 1.4418710e+00 8.0512400e-01]
...
[2.6575000e+04 1.0650102e+01 8.6662700e-01]
[4.8111000e+04 9.1345280e+00 7.2804500e-01]
[4.3757000e+04 7.8826010e+00 1.3324460e+00]]
[[0.44832535 0.39805139 0.56233353]
[0.15873259 0.34195467 0.98724416]
[0.28542943 0.06892523 0.47449629]
...
[0.29115949 0.50910294 0.51079493]
[0.52711097 0.43665451 0.4290048 ]
[0.47940793 0.3768091 0.78571804]]
4.實現演算法
def autoNorm(dataSet): # 求資料矩陣每一列的最小值 minVals = dataSet.min(0) # 求資料矩陣每一列的最大值 maxVals = dataSet.max(0) # 求資料矩陣每一列的最大最小值差值 ranges = maxVals - minVals # normDataSet = zeros(shape(dataSet)) # 返回資料矩陣第一維的數目 m = dataSet.shape[0] # 求矩陣每一列減去該列最小值,得出差值 normDataSet = dataSet - np.tile(minVals, (m, 1)) # 用求的差值除以最大最小值差值,即資料的變化範圍,即歸一化 normDataSet = normDataSet / np.tile(ranges, (m, 1)) # 返回歸一化後的資料,最大最小值差值,最小值 return normDataSet, ranges, minVals #將資料集歸一化特徵值
註解:資料來源來自《機器學習實戰》 ——Peter Harrington 著