KNN-----Python程序学习(一)
什么是KNN?(概述)
K最近鄰(kNN,k-NearestNeighbor)分類算法是數(shù)據(jù)挖掘分類技術(shù)中最簡單的方法之一。所謂K最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。Cover和Hart在1968年提出了最初的鄰近算法。
KNN是一種分類(classification)算法,它輸入基于實例的學(xué)習(xí)(instance-based learning),屬于懶惰學(xué)習(xí)(lazy learning)即KNN沒有顯式的學(xué)習(xí)過程,也就是說沒有訓(xùn)練階段,數(shù)據(jù)集事先已有了分類和特征值,待收到新樣本后直接進(jìn)行處理。與急切學(xué)習(xí)(eager learning)相對應(yīng)。
簡單的說,k-近鄰算法采用測量不同特征值之間的距離方法進(jìn)行分類。
思路是:如果一個樣本在特征空間中的k個最鄰近的樣本中的大多數(shù)屬于某一個類別,則該樣本也劃分為這個類別。KNN算法中,所選擇的鄰居都是已經(jīng)正確分類的對象。該方法在定類決策上只依據(jù)最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。
優(yōu)缺點以及適用數(shù)據(jù)范圍
優(yōu)點:
- 精度高
- 對異常值不敏感
- 無數(shù)據(jù)輸入設(shè)定
缺點:
- 計算復(fù)雜度高
- 空間復(fù)雜度高
適用數(shù)據(jù)范圍:
- 數(shù)值型和標(biāo)稱型
工作原理
存在一個樣本數(shù)據(jù)集合, 也稱作訓(xùn)練樣本集, 并且樣本集中每個數(shù)據(jù)都存在標(biāo)簽,即我們知道樣本集中每一數(shù)據(jù) 與所屬分類的對應(yīng)關(guān)系。 輸人沒有標(biāo)簽的新數(shù)據(jù)后, 將新數(shù)據(jù)的每個特征與樣本集中數(shù)據(jù)對應(yīng)的 特征進(jìn)行比較,然后算法提取樣本集中特征最相似數(shù)據(jù)( 最近鄰) 的分類標(biāo)簽。一般來說,我們 只選擇樣本數(shù)據(jù)集中前k個最相似的數(shù)據(jù), 這就是k-近鄰算法中k的出處,通常k是不大于20的整數(shù)。 最后,選擇k個最相似數(shù)據(jù)中出現(xiàn)次數(shù)最多的分類,作為新數(shù)據(jù)的分類。
k-近鄰算法的一般流程
(1)收集數(shù)據(jù):可以使用任何方法。
(2)準(zhǔn)備數(shù)據(jù):距離計算所需要的數(shù)值,最好是結(jié)構(gòu)化的數(shù)據(jù)格式。
(3)分析數(shù)據(jù):可以使用任何方法。
(4)訓(xùn)練算法:此步驟不適用于k-近鄰算法。
(5)測試算法:計算錯誤率。
(6)使用算法:首先需要輸入樣本數(shù)據(jù)和結(jié)構(gòu)化的輸出結(jié)果,然后運行女-近鄰算法判定輸 入數(shù)據(jù)分別屬于哪個分類,最后應(yīng)用對計算出的分類執(zhí)行后續(xù)的處理。
一般代碼
from numpy import * import operator from os import listdirdef createDataSet():group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])labels = ['A', 'A', 'B', 'B']return group, labelsgroup, labels = createDataSet() # print(group) # print(labels)def classify0(inX, dataSet, labels, k):dataSetSize = dataSet.shape[0]diffMat = tile(inX, (dataSetSize, 1)) - dataSet sqDiffMat = diffMat**2sqDistances = sqDiffMat.sum(axis=1)distances = sqDistances ** 0.5# 距離采用歐氏距離,計算*xA*和*xB*之間的距離sortedDistIndicies = distances.argsort()classCount = {}for i in range(k):voteIlabel = labels[sortedDistIndicies[i]]classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)return sortedClassCount[0][0]# 可以輸入一個點[0,0]進(jìn)行測試 a = classify0([0, 0], group, labels, 3) print(a) tile():重復(fù)inX的維度sorted(iterable, key=None, reverse=False) iterable -- 可迭代對象。 key -- 主要是用來進(jìn)行比較的元素,只有一個參數(shù),具體的函數(shù)的參數(shù)就是取自于可迭代對象中,指定可迭代對象中的一個元素來進(jìn)行排序。 reverse -- 排序規(guī)則, reverse = True 降序, reverse = False 升序(默認(rèn))。歐式距離:
總結(jié)
以上是生活随笔為你收集整理的KNN-----Python程序学习(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: scatter() 散点图样式
- 下一篇: ROS----龟界三角恋