kNN分類算法實例

寫在前面:

kNN算法,或者說K最近鄰(kNN,k-NearestNeighbor)分類算法,它是分類技術(shù)中最簡單的方法之一。所謂K最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。

我們來看一個簡單的例子:

圖1 kNN圖解

????如圖1,有兩類數(shù)據(jù),分別是藍色方塊紅色三角形,現(xiàn)在,我們在圖正中間有了一個綠色圓圈,并且需要判斷它屬于這兩類中的哪一類。要怎么做呢?
????這個時候我們就用到kNN算法了,假設(shè)取k=3,那么離綠色圓圈最近的3個中有2個是紅色三角形,1個是藍色方塊。紅色三角形所占比例高,為2/3,所以可以把綠色圓圈歸為紅色三角形類。
????但如果取k=5,由于藍色方塊所占比例高,為3/5,所以可以把綠色圓圈歸為藍色方塊類。
????從這個例子不僅可以看出kNN算法的工作原理,而且也能夠看出k取值的重要性。

給出kNN的偽代碼(文字流程)如下:

0)假設(shè)現(xiàn)有已知類別的訓(xùn)練集一份和未知類別的測試數(shù)據(jù)一條;
1)計算訓(xùn)練集中的點與測試數(shù)據(jù)點之間的距離;
2)按照距離遞增次序排序;
3)選取與當(dāng)前點距離最小的k個點;
4)確定前k個點所在類別的出現(xiàn)頻率;
5)返回前k個點出現(xiàn)頻率最高的類別作為當(dāng)前點的預(yù)測分類。

那么,我們結(jié)合實際例子分析下kNN的實現(xiàn):

情景為: 海倫一直使用在線約會網(wǎng)站尋找適合自己的約會對象。盡管約會網(wǎng)站會推薦不同的人選,但她沒有從中找到喜歡的人。經(jīng)過一番總結(jié),她發(fā)現(xiàn)曾交往過三種類型的人:
????①不喜歡的人;
????②魅力一般的人;
????③極具魅力的人。
她現(xiàn)在總結(jié)好的數(shù)據(jù)中(即訓(xùn)練集)包含三種特征:
????①每年獲得的飛行常客里程數(shù)
????②玩視頻游戲所耗時間百分比
????③每周消費的冰淇淋公升數(shù)
她希望根據(jù)現(xiàn)有的數(shù)據(jù)類型標(biāo)簽來判斷一個陌生男人會被她歸到哪一類。于是,她使用了kNN……

這里先給出數(shù)據(jù)集地址https://github.com/ocAreTheBestLanguage/fileRepository

圖2 訓(xùn)練集格式.JPG

上圖為數(shù)據(jù)的格式樣本,前三列是特征,最后一列是標(biāo)簽,總共有1000行樣本。

此處考慮到篇幅問題,略去對數(shù)據(jù)進行的預(yù)處理及歸一化處理代碼,假設(shè)我們已經(jīng)獲得了歸一化后的shape為(1000,3)的矩陣dataSet及shape為(1000,)標(biāo)簽數(shù)組labels,且k為要求得的最近鄰居的個數(shù)。并且使用歐式距離公式來計算點與點之間的距離,如distance = √( (x1-x2)2+(y1-y2)2+(z1-z2)2 )。

那么代碼如下:

#dataSet為訓(xùn)練集
#labels為標(biāo)簽集
#inX為要預(yù)測的那條數(shù)據(jù)

#獲取數(shù)據(jù)集的行數(shù)
dataSetRows = dataSet.shape[0] 

#用tile()函數(shù)把要預(yù)測那條數(shù)據(jù)重復(fù)擴充到(1000,1) 然后與數(shù)據(jù)集相減并平方
temp = (tile(inX, (dataSetRows, 1)) - dataSet)**2
#求得每一行數(shù)據(jù)的總和并開平方,完成求得歐式距離
distances = temp.sum(axis=1) ** 0.5

#返回從小到大排列的元素下標(biāo)
sortedIndicies = distances.argsort()

#用與計算某類出現(xiàn)的次數(shù)
classCount = {}

#計算類別出現(xiàn)的對應(yīng)次數(shù)
for i in range(k):
    label = labels[sortedIndicies[i]]
    classCount[label] = classCount.get(label, 0) + 1

#利用類別出現(xiàn)的次數(shù),從大到小排序,其中的參數(shù)itemgetter(1)代表按照第二個域進行排序,即按照第二列進行排序。
sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)

#求得最終的預(yù)測類別
finalClass = sortedClassCount[0][0]

寫在最后:

最后簡單評價一下kNN吧,kNN是機器學(xué)習(xí)中可以說是最簡單的算法啦。

kNN的優(yōu)點在于簡單,容易理解,而且無須估計參數(shù),這也意味著它不需要訓(xùn)練這種操作。另外它適合對稀有事件進行分類。

kNN的缺點在于當(dāng)樣本不平衡時,如一個類的樣本容量很大,而其他類樣本容量很小時,有可能導(dǎo)致當(dāng)輸入一個新樣本時,該樣本的K個鄰居中大容量類的樣本占多數(shù)。這就使得運行結(jié)果受到數(shù)量的影響,而偏離了因為相似所以歸為同一類的原則。

謝謝閱讀本文!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,106評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,441評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,211評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,736評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,475評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,834評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,009評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,559評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,306評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,516評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,728評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,132評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,443評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,249評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,484評論 2 379

推薦閱讀更多精彩內(nèi)容