keyword
文本分類算法、簡單的機(jī)器學(xué)習(xí)算法、基本要素、距離度量、類別判定、k取值、改進(jìn)策略
摘要
kNN算法是著名的模式識別統(tǒng)計(jì)學(xué)方法,是最好的文本分類算法之一,在機(jī)器學(xué)習(xí)分類算法中占有相當(dāng)大的地位,是最簡單的機(jī)器學(xué)習(xí)算法之一。
基本信息
外文名:k-Nearest Neighbor(簡稱kNN)
中文名:k最鄰近分類算法
應(yīng)用:文本分類、模式識別、圖像及空間分類
典型:懶惰學(xué)習(xí)
訓(xùn)練時(shí)間開銷:0
提出時(shí)間:1968年
作者:Cover和Hart提出
關(guān)鍵字:kNN算法、k近鄰算法、機(jī)器學(xué)習(xí)、文本分類
工作原理
思想:
官方:給定測試樣本,基于某種距離度量找出訓(xùn)練集中與其最靠近的k個訓(xùn)練樣本,然后基于這k個"鄰居"的信息來進(jìn)行預(yù)測。
通俗點(diǎn)說:就是計(jì)算一個點(diǎn)與樣本空間所有點(diǎn)之間的距離,取出與該點(diǎn)最近的k個點(diǎn),然后統(tǒng)計(jì)這k個點(diǎn)里面所屬分類比例最大的(“回歸”里面使用平均法),則點(diǎn)A屬于該分類。
k鄰近法實(shí)際上利用訓(xùn)練數(shù)據(jù)集對特征向量空間進(jìn)行劃分,并作為其分類的“模型”。
三個基本要素:k值的選擇、距離度量、分類決策規(guī)則
圖例說明:
上圖中,綠色圓要被決定賦予哪個類,是紅色三角形還是藍(lán)色四方形?如果K=3,由于紅色三角形所占比例為2/3,綠色圓將被賦予紅色三角形那個類,如果K=5,由于藍(lán)色四方形比例為3/5,因此綠色圓被賦予藍(lán)色四方形類。
算法計(jì)算步驟
1、算距離: 給定測試對象,計(jì)算它與訓(xùn)練集中的每個對象的距離;
2、找鄰居:圈定距離最近的k個訓(xùn)練對象,作為測試對象的近鄰;
3、做分類:根據(jù)這k個近鄰歸屬的主要類別,來對測試對象分類;
距離的計(jì)算方式(相似性度量):
歐式距離:
曼哈頓距離:

類別的判定:
投票法:少數(shù)服從多數(shù),近鄰中哪個類別的點(diǎn)最多就分為該類。
加權(quán)投票法:根據(jù)距離的遠(yuǎn)近,對鄰近的投票進(jìn)行加權(quán),距離越近則權(quán)重越大(權(quán)重為距離平方的倒數(shù))。
優(yōu)、缺點(diǎn)
優(yōu)點(diǎn):
1、簡單,易于理解,易于實(shí)現(xiàn),無需估計(jì)參數(shù),無需訓(xùn)練;
2、適合對稀有事件進(jìn)行分類;
3、特別適合于多分類問題(multi-modal,對象具有多個類別標(biāo)簽), kNN比SVM的表現(xiàn)要好。
缺點(diǎn):
1、樣本容量較小的類域采用這種算法比較容易產(chǎn)生誤分。
該算法在分類時(shí)有個主要的不足是,當(dāng)樣本不平衡時(shí),如一個類的樣本容量很大,而其他類樣本容量很小時(shí),有可能導(dǎo)致當(dāng)輸入一個新樣本時(shí),該樣本的K個鄰居中大容量類的樣本占多數(shù)。 該算法只計(jì)算“最近的”鄰居樣本,某一類的樣本數(shù)量很大,那么或者這類樣本并不接近目標(biāo)樣本,或者這類樣本很靠近目標(biāo)樣本。無論怎樣,數(shù)量并不能影響運(yùn)行結(jié)果。
2、該方法的另一個不足之處是計(jì)算量較大,因?yàn)閷γ恳粋€待分類的文本都要計(jì)算它到全體已知樣本的距離,才能求得它的K個最近鄰點(diǎn)。
3、可理解性差,無法給出像決策樹那樣的規(guī)則。
算法實(shí)例
流程:
1、計(jì)算距離
2、選擇距離最小的k個點(diǎn)
3、通過投票方式,選擇點(diǎn)最多的標(biāo)簽。

#-*- coding:utf-8 -*-
import numpy as np
import operator
def createDataset():
#四組二維特征
group = np.array([[5,115],[7,106],[56,11],[66,9]])
#四組對應(yīng)標(biāo)簽
labels = ('動作片','動作片','愛情片','愛情片')
return group,labels
"""
KNN算法
"""
def classify(intX, dataSet, labels, k):
'''
numpy中shape[0]返回?cái)?shù)組的行數(shù),shape[1]返回列數(shù)
'''
dataSetSize = dataSet.shape[0]
"""
將intX在橫向重復(fù)dataSetSize次,縱向重復(fù)1次
例如intX=([1,2])--->([[1,2],[1,2],[1,2],[1,2]])便于后面計(jì)算
"""
diffMat = np.tile(intX, (dataSetSize, 1)) - dataSet
"""
計(jì)算距離:歐式距離, 特征相減后乘方,然后再開方
"""
sqdifMax = diffMat**2
seqDistances = sqdifMax.sum(axis=1)
distances = seqDistances**0.5
#返回distance中元素從小到大排序后的索引
print ("distances:",distances)
sortDistance = distances.argsort()
print ("sortDistance:", sortDistance)
"""
取出前k個元素的類別
"""
classCount = {}
for i in range(k):
voteLabel = labels[sortDistance[i]]
s = "第{}個voteLabel={}".format(i, voteLabel)
print(s)
classCount[voteLabel] = classCount.get(voteLabel,0)+1
#dict.get(key,default=None),字典的get()方法,返回指定鍵的值,如果值不在字典中返回默認(rèn)值。
#計(jì)算類別次數(shù)
#key=operator.itemgetter(1)根據(jù)字典的值進(jìn)行排序
#key=operator.itemgetter(0)根據(jù)字典的鍵進(jìn)行排序
#reverse降序排序字典
sortedClassCount = sorted(classCount.items(), key = operator.itemgetter(1), reverse = True)
#結(jié)果sortedClassCount = [('動作片', 2), ('愛情片', 1)]
print ("sortedClassCount:")
print(sortedClassCount)
return sortedClassCount[0][0]
if __name__ == '__main__':
group,labels = createDataset()
test = [20,101]
test_class = classify(test,group,labels,3)
print (test_class)
運(yùn)行結(jié)果 :
改進(jìn)策略
1、對樣本屬性進(jìn)行約簡。——刪除對分類結(jié)果影響較小的屬性。
2、采用權(quán)值的方法(和該樣本距離小的鄰居權(quán)值大)來改進(jìn)。——依照訓(xùn)練集合中各種分類的樣本數(shù)量,選取不同數(shù)目的最近鄰居,來參與分類。
常見問題
1、k值設(shè)定
k值選擇過小,得到的近鄰數(shù)過少,會降低分類精度,同時(shí)也會放大噪聲數(shù)據(jù)的干擾;而如果k值選擇過大,并且待分類樣本屬于訓(xùn)練集中包含數(shù)據(jù)數(shù)較少的類,那么在選擇k個近鄰的時(shí)候,實(shí)際上并不相似的數(shù)據(jù)亦被包含進(jìn)來,造成噪聲增加而導(dǎo)致分類效果的降低。
如何選取恰當(dāng)?shù)腒值也成為KNN的研究熱點(diǎn)。k值通常是采用交叉檢驗(yàn)來確定(以k=1為基準(zhǔn))。
經(jīng)驗(yàn)規(guī)則:k一般低于訓(xùn)練樣本數(shù)的平方根。
投票法沒有考慮近鄰的距離的遠(yuǎn)近,距離更近的近鄰也許更應(yīng)該決定最終的分類,所以加權(quán)投票法更恰當(dāng)一些。
3、距離度量方式的選擇
高維度對距離衡量的影響:眾所周知當(dāng)變量數(shù)越多,歐式距離的區(qū)分能力就越差。
變量值域?qū)嚯x的影響:值域越大的變量常常會在距離計(jì)算中占據(jù)主導(dǎo)作用,因此應(yīng)先對變量進(jìn)行標(biāo)準(zhǔn)化。
4、訓(xùn)練樣本的參考原則
學(xué)者們對于訓(xùn)練樣本的選擇進(jìn)行研究,以達(dá)到減少計(jì)算的目的,這些算法大致可分為兩類。第一類,減少訓(xùn)練集的大小。KNN算法存儲的樣本數(shù)據(jù),這些樣本數(shù)據(jù)包含了大量冗余數(shù)據(jù),這些冗余的數(shù)據(jù)增了存儲的開銷和計(jì)算代價(jià)。縮小訓(xùn)練樣本的方法有:在原有的樣本中刪掉一部分與分類相關(guān)不大的樣本樣本,將剩下的樣本作為新的訓(xùn)練樣本;或在原來的訓(xùn)練樣本集中選取一些代表樣本作為新的訓(xùn)練樣本;或通過聚類,將聚類所產(chǎn)生的中心點(diǎn)作為新的訓(xùn)練樣本
在訓(xùn)練集中,有些樣本可能是更值得依賴的。可以給不同的樣本施加不同的權(quán)重,加強(qiáng)依賴樣本的權(quán)重,降低不可信賴樣本的影響。
5、性能問題
kNN是一種懶惰算法,而懶惰的后果:構(gòu)造模型很簡單,但在對測試樣本分類地的系統(tǒng)開銷大,因?yàn)橐獟呙枞坑?xùn)練樣本并計(jì)算距離。
已經(jīng)有一些方法提高計(jì)算的效率,例如壓縮訓(xùn)練樣本量等。
參考文獻(xiàn)
推薦

喜歡編程
浙公網(wǎng)安備 33010602011771號