1. 程式人生 > >小白python學習——機器學習篇——k-近鄰演算法(KNN演算法)

小白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 著