亚洲免费人人妻人人,cao78在线视频,福建一级毛片,91精品视频免费观看,高清另类图片操逼,日本特黄特色大片免费看,超碰欧美人人澡曰曰澡夜夜泛

Python實戰(zhàn)之KNN實現(xiàn) -電腦資料

電腦資料 時間:2019-01-01 我要投稿
【m.msguai.com - 電腦資料】

    用Python來實現(xiàn)K近鄰分類算法(KNN)已經(jīng)是一個老生常談的問題,網(wǎng)上也已經(jīng)有諸多資料,不過這里我還是決定記錄一下自己的學(xué)習(xí)心得,

Python實戰(zhàn)之KNN實現(xiàn)

    1、配置numpy庫

    numpy庫是Python用于矩陣運算的第三方庫,大多數(shù)數(shù)學(xué)運算都會依賴這個庫來進行,關(guān)于numpy庫的配置參見:Python配置第三方庫Numpy和matplotlib的曲折之路,配置完成后將numpy庫整體導(dǎo)入到當(dāng)前工程中。

    2、準(zhǔn)備訓(xùn)練樣本

    這里簡單的構(gòu)造四個點并配以對應(yīng)標(biāo)簽作為KNN的訓(xùn)練樣本:

# ====================創(chuàng)建訓(xùn)練樣本====================def createdataset():    group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])    labels = ['A', 'B', 'C', 'D']    return group, labels

    這里有一個小細節(jié),就是通過array()函數(shù)老構(gòu)造并初始化numpy的矩陣對象時,要保證只有一個參數(shù),因此在代碼中需要將參數(shù)用中括號括起來,像下面這種調(diào)用方式是不合法的:

group = array([1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1])

    3、創(chuàng)建分類函數(shù)

    K近鄰算法在分類時一般是根據(jù)歐氏距離進行分類的,因此需要將輸入的數(shù)據(jù)與訓(xùn)練數(shù)據(jù)在各個維度上相減再平方求和,再開方,如下:

# ====================歐氏距離分類====================def classify(Inx, Dataset, labels, k):    DataSetSize = Dataset.shape[0]  # 獲取數(shù)據(jù)的行數(shù),shape[1]位列數(shù)    diffmat = tile(Inx, (DataSetSize, 1)) - Dataset    SqDiffMat = diffmat**2    SqDistances = SqDiffMat.sum(axis=1)    Distance = SqDistances**0.5    SortedDistanceIndicies = Distance.argsort()    ClassCount = {}

    這里tile()函數(shù)是numpy的矩陣擴展函數(shù),比如說這個例子中訓(xùn)練樣本有四個二維坐標(biāo)點,對于輸入樣本(一個二維坐標(biāo)點),需要將其先擴展為一個4行1列的矩陣,然后在進行矩陣減法,在平法求和,再開平方算距離。計算完距離之后,調(diào)用矩陣對象的排序成員函數(shù)argsort()對距離進行升序排序。在這里介紹一個Pycharm查看源碼生命的小技巧:加入在編寫這段程序的時候我們并不確定argsort()是否為array對象的成員函數(shù),我們選中這個函數(shù)然后 右鍵 -> Go to -> Declaration,這樣就會跳轉(zhuǎn)到argsort()函數(shù)的聲明代碼片中,通過查看代碼的從屬關(guān)系能夠確認array類中確實包含這個成員函數(shù),調(diào)用沒有問題:

   

    對距離排序之后,接下來就根據(jù)前K個最小距離值所對應(yīng)的標(biāo)簽來判斷當(dāng)前樣本屬于哪一類:

for i in range(k):        VoteiLabel = labels[SortedDistanceIndicies[i]]        ClassCount[VoteiLabel] = ClassCount.get(VoteiLabel, 0) + 1    SortedClassCount = sorted(ClassCount.items(), key = operator.itemgetter(1), reverse = True)

    這里有一個小問題就是在Python2中獲取字典元素使用的是dict.iteritems()成員函數(shù),而在Python3中改為dict.items()函數(shù),

電腦資料

Python實戰(zhàn)之KNN實現(xiàn)》(http://m.msguai.com)。“key = operator.itemgetter(1)”的意思是指定函數(shù)針對字典中第二維元素進行排序,注意這里需要在之前導(dǎo)入符號庫operator。這里是通過記錄前K個距離最下值中每類標(biāo)簽出現(xiàn)的次數(shù)來判決測試樣本的歸屬。

    4、測試

    這里給出完整的KNN測試代碼:

# coding: utf-8from numpy import *import operator# ====================創(chuàng)建訓(xùn)練樣本====================def createdataset():    group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])    labels = ['A', 'B', 'C', 'D']    return group, labels# ====================歐氏距離分類====================def classify(Inx, Dataset, labels, k):    DataSetSize = Dataset.shape[0]  # 獲取數(shù)據(jù)的行數(shù),shape[1]位列數(shù)    diffmat = tile(Inx, (DataSetSize, 1)) - Dataset    SqDiffMat = diffmat**2    SqDistances = SqDiffMat.sum(axis=1)    Distance = SqDistances**0.5    SortedDistanceIndicies = Distance.argsort()    ClassCount = {}    for i in range(k):        VoteiLabel = labels[SortedDistanceIndicies[i]]        ClassCount[VoteiLabel] = ClassCount.get(VoteiLabel, 0) + 1    SortedClassCount = sorted(ClassCount.items(), key = operator.itemgetter(1), reverse = True)    return SortedClassCount[0][0]Groups, Labels = createdataset()Result = classify([0, 0], Groups, Labels, 1)print(Result)

    運行代碼,程序答應(yīng)結(jié)果“C”。這里需要提一點的就是對于單訓(xùn)練樣本(每類只有一個訓(xùn)練樣本)的分類問題,KNN的K值應(yīng)該設(shè)定為1。

最新文章