您好,登錄后才能下訂單哦!
本文實例講述了Python機器學(xué)習(xí)k-近鄰算法。分享給大家供大家參考,具體如下:
存在一份訓(xùn)練樣本集,并且每個樣本都有屬于自己的標簽,即我們知道每個樣本集中所屬于的類別。輸入沒有標簽的新數(shù)據(jù)后,將新數(shù)據(jù)的每個特征與樣本集中數(shù)據(jù)對應(yīng)的特征進行比較,然后提取樣本集中與之最相近的k個樣本。觀察并統(tǒng)計這k個樣本的標簽,選擇數(shù)量最大的標簽作為這個新數(shù)據(jù)的標簽。
用以下這幅圖可以很好的解釋kNN算法:
不同形狀的點,為不同標簽的點。其中綠色點為未知標簽的數(shù)據(jù)點。現(xiàn)在要對綠色點進行預(yù)測。由圖不難得出:
偽代碼
對未知屬性的數(shù)據(jù)集中的每個點執(zhí)行以下操作
1. 計算已知類型類別數(shù)據(jù)集中的點與當前點之間的距離
2. 按照距離遞增次序排序
3. 選取與當前點距離最小的k個點
4. 確定前k個點所在類別的出現(xiàn)頻率
5. 返回前k個點出現(xiàn)頻率最高的類別作為當前點的預(yù)測分類
歐式距離(計算兩點之間的距離公式)
計算點x與點y之間歐式距離
python代碼實現(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)練集標簽 :param k: 選擇最近鄰居的數(shù)目 :return: 分類器對 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)) 對 array 進行 3×2 擴展為二維數(shù)組 sq_diff_mat = diff_mat ** 2 sq_distances = sq_diff_mat.sum(axis=1) # .sum(axis=1) 矩陣以列求和 # distances = sq_distances ** 0.5 # 主要是通過比較求最近點,所以沒有必要求平方根 distances_sorted_index = sq_distances.argsort() # .argsort() 對array進行排序 返回排序后對應(yīng)的索引 class_count_dict = {} # 用于統(tǒng)計類別的個數(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值對字典進行逆序排序 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)
運行結(jié)果:B
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)學(xué)運算技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設(shè)計有所幫助。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。