Python機(jī)器學(xué)習(xí)k-近鄰算法(K Nearest Neighbor)實(shí)例詳解
本文實(shí)例講述了Python機(jī)器學(xué)習(xí)k-近鄰算法。分享給大家供大家參考,具體如下:
工作原理
存在一份訓(xùn)練樣本集,并且每個(gè)樣本都有屬于自己的標(biāo)簽,即我們知道每個(gè)樣本集中所屬于的類別。輸入沒有標(biāo)簽的新數(shù)據(jù)后,將新數(shù)據(jù)的每個(gè)特征與樣本集中數(shù)據(jù)對(duì)應(yīng)的特征進(jìn)行比較,然后提取樣本集中與之最相近的k個(gè)樣本。觀察并統(tǒng)計(jì)這k個(gè)樣本的標(biāo)簽,選擇數(shù)量最大的標(biāo)簽作為這個(gè)新數(shù)據(jù)的標(biāo)簽。
用以下這幅圖可以很好的解釋kNN算法:
不同形狀的點(diǎn),為不同標(biāo)簽的點(diǎn)。其中綠色點(diǎn)為未知標(biāo)簽的數(shù)據(jù)點(diǎn)?,F(xiàn)在要對(duì)綠色點(diǎn)進(jìn)行預(yù)測(cè)。由圖不難得出:
- 如果k=3,那么離綠色點(diǎn)最近的有2個(gè)紅色三角形和1個(gè)藍(lán)色的正方形,這3個(gè)點(diǎn)投票,于是綠色的這個(gè)待分類點(diǎn)屬于紅色的三角形。
- 如果k=5,那么離綠色點(diǎn)最近的有2個(gè)紅色三角形和3個(gè)藍(lán)色的正方形,這5個(gè)點(diǎn)投票,于是綠色的這個(gè)待分類點(diǎn)屬于藍(lán)色的正方形。
kNN算法實(shí)施
偽代碼
對(duì)未知屬性的數(shù)據(jù)集中的每個(gè)點(diǎn)執(zhí)行以下操作
1. 計(jì)算已知類型類別數(shù)據(jù)集中的點(diǎn)與當(dāng)前點(diǎn)之間的距離
2. 按照距離遞增次序排序
3. 選取與當(dāng)前點(diǎn)距離最小的k個(gè)點(diǎn)
4. 確定前k個(gè)點(diǎn)所在類別的出現(xiàn)頻率
5. 返回前k個(gè)點(diǎn)出現(xiàn)頻率最高的類別作為當(dāng)前點(diǎn)的預(yù)測(cè)分類
歐式距離(計(jì)算兩點(diǎn)之間的距離公式)
計(jì)算點(diǎn)x與點(diǎn)y之間歐式距離
python代碼實(shí)現(xiàn)
# -*- coding:utf-8 -*- #! python2 import numpy as np import operator # 訓(xùn)練集 data_set = np.array([[1., 1.1], [1.0, 1.0], [0., 0.], [0, 0.1]]) labels = ['A', 'A', 'B', 'B'] def classify_knn(in_vector, training_data, training_label, k): """ :param in_vector: 待分類向量 :param training_data: 訓(xùn)練集向量 :param training_label: 訓(xùn)練集標(biāo)簽 :param k: 選擇最近鄰居的數(shù)目 :return: 分類器對(duì) in_vector 分類的類別 """ data_size = training_data.shape[0] # .shape[0] 返回二維數(shù)組的行數(shù) diff_mat = np.tile(in_vector, (data_size, 1)) - data_set # np.tile(array, (3, 2)) 對(duì) array 進(jìn)行 3×2 擴(kuò)展為二維數(shù)組 sq_diff_mat = diff_mat ** 2 sq_distances = sq_diff_mat.sum(axis=1) # .sum(axis=1) 矩陣以列求和 # distances = sq_distances ** 0.5 # 主要是通過比較求最近點(diǎn),所以沒有必要求平方根 distances_sorted_index = sq_distances.argsort() # .argsort() 對(duì)array進(jìn)行排序 返回排序后對(duì)應(yīng)的索引 class_count_dict = {} # 用于統(tǒng)計(jì)類別的個(gè)數(shù) for i in range(k): label = training_label[distances_sorted_index[i]] try: class_count_dict[label] += 1 except KeyError: class_count_dict[label] = 1 class_count_dict = sorted(class_count_dict.iteritems(), key=operator.itemgetter(1), reverse=True) # 根據(jù)字典的value值對(duì)字典進(jìn)行逆序排序 return class_count_dict[0][0] if __name__ == '__main__': vector = [0, 0] # 待分類數(shù)據(jù)集 print classify_knn(in_vector=vector, training_data=data_set, training_label=labels, k=3)
運(yùn)行結(jié)果:B
算法評(píng)價(jià)
- 優(yōu)點(diǎn):精度高、對(duì)異常值不敏感、無(wú)數(shù)據(jù)輸入假定
- 缺點(diǎn):計(jì)算復(fù)雜度高、空間復(fù)雜度高
- 使用數(shù)據(jù)范圍:數(shù)據(jù)型和標(biāo)稱型
- 適用:kNN方法通常用于一個(gè)更復(fù)雜分類算法的一部分。例如,我們可以用它的估計(jì)值做為一個(gè)對(duì)象的特征。有時(shí)候,一個(gè)簡(jiǎn)單的kNN算法在良好選擇的特征上會(huì)有很出色的表現(xiàn)。
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)學(xué)運(yùn)算技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
如何將Python代碼轉(zhuǎn)化為可執(zhí)行的程序
在Python中,將代碼轉(zhuǎn)成可以執(zhí)行的程序需要安裝庫(kù)pyinstaller,如果是Windows用戶,打開Anaconda?Prompt輸入相對(duì)應(yīng)代碼,下面小編給大家詳細(xì)講解如何將Python代碼轉(zhuǎn)化為可執(zhí)行的程序,感興趣的朋友一起看看吧2024-03-03OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
這篇文章主要介紹了OpenCV2.3.1+Python2.7.3+Numpy等的配置解析,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01pandas.DataFrame的for循環(huán)迭代的實(shí)現(xiàn)
本文主要介紹了pandas.DataFrame的for循環(huán)迭代的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02Python進(jìn)階之高級(jí)用法詳細(xì)總結(jié)
今天帶各位小伙伴學(xué)習(xí)一下Python高級(jí)語(yǔ)法,主要有Lambda表達(dá)式,map函數(shù),filter函數(shù),reduce函數(shù),三大推導(dǎo)式等,文中有非常詳細(xì)的介紹,需要的朋友可以參考下2021-05-05python網(wǎng)絡(luò)編程之UDP通信實(shí)例(含服務(wù)器端、客戶端、UDP廣播例子)
UDP,用戶數(shù)據(jù)報(bào)傳輸協(xié)議,它位于TCP/IP協(xié)議的傳輸層,是一種無(wú)連接的協(xié)議,它發(fā)送的報(bào)文不能確定是否完整地到達(dá)了另外一端2014-04-04