摘要:算法是一種數據分類算法,以距離樣本個最鄰近數據的類別代表樣本的類別,因此也叫作近鄰算法。排序后訪問元素的方式與訪問二維數組元素的方式一致
KNN算法是一種數據分類算法,以距離樣本k個最鄰近數據的類別代表樣本的類別,因此也叫作k-近鄰算法。KNN算法是數據挖掘中最簡單的方法之一,大致可分為以下幾個步驟:
訓練數據:原數據集中所有數據類別的數據。
測試數據:我們將要拿來測試的數據樣本。
處理數據
我們得到的測試數據,通常和訓練數據是不同維的,這時候就需要我們將測試數據升維到和訓練數據相同,python的numpy中自帶了一個tile()函數可以幫助我們將測試數據升維。
將數據向量化
測試數據升維后,我們為了計算距離樣本點的距離,此時需要將數據向量化,所謂的向量化就很簡單了,即將兩個同維數據相減。
計算歐式距離
歐式距離,即歐幾里得距離,運用勾股定理即可求出,將升維后的測試數據和訓練數據相減獲得的向量組的每一個向量的平方和開方即可得到由距離組成的向量組。
根據距離進行分類
選擇k個距離樣本點距離最小的數據,統計在這k個數據中哪類數據類別出現的頻率最高,樣本點的數據類別即可確定。
算法實現:
1.首先我們需要引入numpy以及operator,輸入from numpy import *和import operator。
2.接下來我們需要定義一個knn函數,在knn函數中我們需要引入四個參數,分別為k、訓練數據、測試數據和數據類別。
3.接下來我們需要先對數據進行升維操作,需要用到numpy下的tile(a,(b,c))函數,a為要進行升維操作的數據,也就是測試數據,b為要對測試數據升維的行數據,c為要對測試數據升維的列數據。
4.在上一操作中,我們一般需要獲得訓練數據的行數和列數,這時需要用到shape()函數,shape()函數返回的是由訓練數據的行和列組成的元組,我們想要知道訓練數據的行數或列數只需通過數組元素下標的方式引用。
5.數據的維度相同后,我們要將兩數據相減得到一個向量,再計算這個向量每個值的平方和的開方即得測試數據到訓練數據的距離,再調用argsort()函數將距離按照升序排列,不過該函數返回的是數組元素的下標。
6.接下來我們為了直觀的看到不同數據類別的出現次數,需要設置一個空字典來存放這些數據,在得到字典后,我們需要將字典按照不同數據類別的出現次數降序排列,進而返回字典的第一個值即得到測試數據的數據類別。
7.算法代碼如下:
from numpy import * import operator def knn(k, test_data, train_data, labels): train_size = train_data.shape[0] #獲取訓練數據的行數 test_size = tile(test_data, (train_size, 1)) #將測試數據的行升維 minus = test_size-train_data #得到向量 sq_minus = minus**2 sum_sq_minus = sq_minus.sum(axis=1) #得到平方后的每個數組內元素的和 distc = sum_sq_minus**0.5 sort_distc = distc.argsort() #將距離按升序排列 static = {} for i in range(0, k): vote = labels[sort_distc[i]] #獲取數據類型 static[vote] = static.get(vote, 0)+1 #統計每個數據類型的出現次數 sort_static = sorted(static.items(), key=operator.itemgetter(1), reverse=True) #將字典中的元素按出現次數降序排列 return sort_static[0][0] #返回出現次數最多的數據類型
8.算法中需要對字典進行排序,因此需要用到sorted()函數,sorted()函數共有三個參數,分別為items(),operator.itemgetter(),reverse,默認的排序為升序,我們要想按照降序排列需要令第三個參數為True,在這里我們是按照字典的values進行排序的,因此我們需要輸入sorted(static.items(), key=operator.itemgetter(1), reverse=True),operator.itemgetter()函數中的值為1時,是按照字典的values進行排序,值為0時,是按照字典的key進行排序。
9.排序后訪問元素的方式與訪問二維數組元素的方式一致
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43003.html
摘要:背景近鄰算法的概述近鄰算法的簡介近鄰算法是屬于一個非常有效且易于掌握的機器學習算法,簡單的說就是采用測量不同特征值之間距離的方法對數據進行分類的一個算法。完美的分類器的錯誤率為,而最差的分類器的錯誤率則為。 1 背景 1.1 k近鄰算法的概述 (1)k近鄰算法的簡介 k-近鄰算法是屬于一個非...
必須要看的前言 本文風格:以??簡單易懂??的語言帶你徹底搞懂KNN,了解什么是有監督學習算法。 認真看完這篇文章,徹底了解KNN、了解監督學習算法絕對是一樣很簡單的事情。 注:本篇文章非常詳細,同時我也附加了Python代碼,歡迎收藏后慢慢閱讀。 目錄 必須要看的前言監督學習算法KNN/K近鄰算法1 算法原理1.1 實現過程1.2 距離的確定 2 算法的優缺點3 算法的變種3.1 變...
摘要:算法及工作原理近鄰算法采用測量不同特征值之間的距離方法進行分類。最后選擇個最相似數據中出現次數最多的分類作為新數據的分類。 1 分類算法引言 眾所周知,電影可以按照題材分類,然而題材本身是如何定義的?由誰來判定某部電影屬于哪個題材?也就是說同一題材的電影具有哪些公共特征?這些都是在進行電影分類時必須要考慮的問題。 動作片中也會存在接吻鏡頭,愛情片中也會存在打斗場景,我們不能單純依靠是...
摘要:是一種非參數的懶惰的監督學習算法非參數的意思是,模型不會對基礎數據分布做出任何假設。電腦端查看源碼參考資料網址是一個支持的人工智能建模平臺,能幫助你快速開發訓練并部署應用。 KNN 是一種非參數的懶惰的監督學習算法. 非參數的意思是,模型不會對基礎數據分布做出任何假設。換句話說,模型的結構是根據數據確定的。懶惰的意思是沒有或者只有很少的訓練過程. KNN 算法既可以處理分類問題,測試數...
閱讀 1481·2019-08-30 15:44
閱讀 1945·2019-08-30 14:07
閱讀 2871·2019-08-30 13:56
閱讀 2336·2019-08-29 17:06
閱讀 1323·2019-08-29 14:13
閱讀 2078·2019-08-29 11:28
閱讀 3223·2019-08-26 13:56
閱讀 1940·2019-08-26 12:11