Python實(shí)現(xiàn)KNN鄰近算法
簡(jiǎn)介
鄰近算法,或者說(shuō)K最近鄰(kNN,k-NearestNeighbor)分類算法是數(shù)據(jù)挖掘分類技術(shù)中最簡(jiǎn)單的方法之一。所謂K最近鄰,就是k個(gè)最近的鄰居的意思,說(shuō)的是每個(gè)樣本都可以用它最接近的k個(gè)鄰居來(lái)代表。
kNN算法的核心思想是如果一個(gè)樣本在特征空間中的k個(gè)最相鄰的樣本中的大多數(shù)屬于某一個(gè)類別,則該樣本也屬于這個(gè)類別,并具有這個(gè)類別上樣本的特性。該方法在確定分類決策上只依據(jù)最鄰近的一個(gè)或者幾個(gè)樣本的類別來(lái)決定待分樣本所屬的類別。 kNN方法在類別決策時(shí),只與極少量的相鄰樣本有關(guān)。由于kNN方法主要靠周?chē)邢薜泥徑臉颖荆皇强颗袆e類域的方法來(lái)確定所屬類別的,因此對(duì)于類域的交叉或重疊較多的待分樣本集來(lái)說(shuō),kNN方法較其他方法更為適合。
本文將采用Python和numpy庫(kù)實(shí)現(xiàn)KNN的核心算法,并使用一個(gè)簡(jiǎn)單的例子進(jìn)行驗(yàn)證。
KNN核心算法的實(shí)現(xiàn)
對(duì)于KNN算法實(shí)現(xiàn),首先我們計(jì)算歐式空間距離,然后根據(jù)距離排序,找到k個(gè)緊鄰,找出最相近的分類。
from numpy import tile import operator def do_knn_classifier(in_array, data_set, labels, k): ''''' classify the in_array according the data set and labels ''' #計(jì)算距離適量 data_set_size = data_set.shape[0] diff_matrix = tile(in_array, (data_set_size, 1)) - data_set sq_diff_matrix = diff_matrix ** 2 sq_distance = sq_diff_matrix.sum(axis=1) distances = sq_distance ** 0.5 #argsort函數(shù)返回的是數(shù)組值從小到大的索引值, 距離排序 sorted_dist_indicies = distances.argsort() # 選擇K個(gè)緊鄰 class_count = {} for i in range(k): vote_label = labels[sorted_dist_indicies[i]] class_count[vote_label] = class_count.get(vote_label, 0) + 1 #排序,并返回最相鄰的分類 sorted_class_count = sorted(class_count.iteritems(), key=operator.itemgetter(1), reverse=True) return sorted_class_count[0][0]
數(shù)值的歸一化
多數(shù)情況下,由于選擇的特征值取值范圍比較大。在處理這種不同取值范圍的特征值時(shí),通常需要采用的方法就是將數(shù)值歸一化,如將取值范圍處理到0到1或-1到1之間。下面的公式可以將任意取值范圍的特征值轉(zhuǎn)化為0到1的區(qū)間內(nèi)的值:
newValue = (oldValue - min) / (max - min)
其中min和max分別是數(shù)據(jù)集中的最小特征值和最大特征值。
from numpy import tile import operator def auto_normalize_data(data_set): ''''' 對(duì)數(shù)據(jù)集進(jìn)行歸一化操作 ''' # 參數(shù)0使函數(shù)可以從列中選取最小值,而不是當(dāng)前行的最小值 min_vals = data_set.min(0) max_vals = data_set.max(0) ranges = max_vals - min_vals # 歸一化處理 m = data_set.shape[0] norm_data_set = data_set - tile(min_vals, (m, 1)) norm_data_set = norm_data_set / tile(ranges, (m, 1)) return norm_data_set, ranges, min_vals
實(shí)例
以一個(gè)簡(jiǎn)單的例子來(lái)結(jié)束本文的介紹。在這里并不需要實(shí)現(xiàn)數(shù)據(jù)的歸一化處理。
from numpy import array from knn.knn_classifier import do_knn_classifier def get_data_set(): ''''' Get data set and labels ''' group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]]) labels = ['A', 'A', 'B', 'B'] return group, labels if __name__ == '__main__': data_set, labels = get_data_set() t = do_knn_classifier(array([0.2, 0.1]), data_set, labels, 3) print t
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- kNN算法python實(shí)現(xiàn)和簡(jiǎn)單數(shù)字識(shí)別的方法
- 以Python代碼實(shí)例展示kNN算法的實(shí)際運(yùn)用
- python機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之最近鄰kNN分類器
- Python語(yǔ)言描述KNN算法與Kd樹(shù)
- python實(shí)現(xiàn)kNN算法
- 使用python實(shí)現(xiàn)knn算法
- 純python實(shí)現(xiàn)機(jī)器學(xué)習(xí)之kNN算法示例
- 用Python實(shí)現(xiàn)KNN分類算法
- Python代碼實(shí)現(xiàn)KNN算法
- python機(jī)器學(xué)習(xí)之KNN分類算法
相關(guān)文章
Python基礎(chǔ)學(xué)習(xí)之模塊的安裝和卸載
其實(shí)現(xiàn)在還是有很多剛開(kāi)始學(xué)習(xí)的小伙伴,會(huì)遇到模塊不會(huì)安裝的情況,或者一遇到報(bào)錯(cuò)就懵了,這樣就很耽誤我們的學(xué)習(xí)進(jìn)度。所以,今天我們就來(lái)了解一下Python幾種安裝模塊的方法吧2022-09-09python爬蟲(chóng) 線程池創(chuàng)建并獲取文件代碼實(shí)例
這篇文章主要介紹了python爬蟲(chóng) 線程池創(chuàng)建并獲取文件代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09python矩陣基本運(yùn)算的實(shí)現(xiàn)
本文主要介紹了python?矩陣的基本運(yùn)算,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-0720個(gè)Python?random模塊常用函數(shù)的應(yīng)用與代碼示例
隨機(jī)數(shù)在計(jì)算機(jī)科學(xué)和數(shù)據(jù)科學(xué)領(lǐng)域中扮演著重要角色,Python的標(biāo)準(zhǔn)庫(kù)中提供了random模塊,用于生成各種隨機(jī)數(shù),本文將深入探討random模塊的各種函數(shù),以及它們的應(yīng)用場(chǎng)景和代碼示例,需要的可以參考下2024-03-03Python中xlsx文件轉(zhuǎn)置操作詳解(行轉(zhuǎn)列和列轉(zhuǎn)行)
很多時(shí)候我們處理的Excel表格并不是我們想要的樣子,需要將表格的形式進(jìn)行相應(yīng)轉(zhuǎn)換后進(jìn)行數(shù)據(jù)分析操作,下面這篇文章主要給大家介紹了關(guān)于Python中xlsx文件轉(zhuǎn)置操作(行轉(zhuǎn)列和列轉(zhuǎn)行)的相關(guān)資料,需要的朋友可以參考下2022-07-07python自動(dòng)化實(shí)現(xiàn)登錄獲取圖片驗(yàn)證碼功能
這篇文章主要介紹了python自動(dòng)化實(shí)現(xiàn)登錄獲取圖片驗(yàn)證碼功能,本文通過(guò)實(shí)例截圖的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11對(duì)python實(shí)時(shí)得到鼠標(biāo)位置的示例講解
今天小編就為大家分享一篇對(duì)python實(shí)時(shí)得到鼠標(biāo)位置的示例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10