Python實現(xiàn)KNN鄰近算法
簡介
鄰近算法,或者說K最近鄰(kNN,k-NearestNeighbor)分類算法是數(shù)據(jù)挖掘分類技術(shù)中最簡單的方法之一。所謂K最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。
kNN算法的核心思想是如果一個樣本在特征空間中的k個最相鄰的樣本中的大多數(shù)屬于某一個類別,則該樣本也屬于這個類別,并具有這個類別上樣本的特性。該方法在確定分類決策上只依據(jù)最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。 kNN方法在類別決策時,只與極少量的相鄰樣本有關(guān)。由于kNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對于類域的交叉或重疊較多的待分樣本集來說,kNN方法較其他方法更為適合。
本文將采用Python和numpy庫實現(xiàn)KNN的核心算法,并使用一個簡單的例子進行驗證。
KNN核心算法的實現(xiàn)
對于KNN算法實現(xiàn),首先我們計算歐式空間距離,然后根據(jù)距離排序,找到k個緊鄰,找出最相近的分類。
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
'''
#計算距離適量
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個緊鄰
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ù)值歸一化,如將取值范圍處理到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): ''''' 對數(shù)據(jù)集進行歸一化操作 ''' # 參數(shù)0使函數(shù)可以從列中選取最小值,而不是當前行的最小值 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
實例
以一個簡單的例子來結(jié)束本文的介紹。在這里并不需要實現(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
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python MySQL如何通過Binlog獲取變更記錄恢復數(shù)據(jù)
本文介紹了如何使用Python和pymysqlreplication庫通過MySQL的二進制日志(Binlog)獲取數(shù)據(jù)庫的變更記錄,并展示了一個簡單的Python腳本,該腳本讀取Binlog事件并打印出插入、更新和刪除操作的SQL語句,此外,還提到可以使用pandas將結(jié)果輸出到Excel表格中進行數(shù)據(jù)分析處理2025-01-01
python和pygame實現(xiàn)簡單俄羅斯方塊游戲
這篇文章主要為大家詳細介紹了python和pygame實現(xiàn)簡單俄羅斯方塊游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-06-06

