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