機器學習算法-KNN算法

機器學習算法-K近鄰算法

本文中介紹的機器學習中最基礎的一個算法:k-近鄰算法座咆,將從如下方面展開:

image

算法概述

k近鄰法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一種基本分類與回歸方法募谎。簡單地說竭鞍,k-近鄰算法就是采用不同特征值之間的距離來進行分類抄邀,算法主要特點為:

  • 優(yōu)點:精度高宣鄙,對異常值不敏感写烤,沒有數(shù)據(jù)輸入假定
  • 缺點:計算復雜度高焰扳,空間復雜度高
  • 適用數(shù)據(jù)范圍:數(shù)值型和標稱型(男女)

有人曾經(jīng)統(tǒng)計過很多電影的打斗鏡頭和接吻鏡頭挽荡,如下圖顯示的電影打斗鏡頭和接吻鏡頭:

image

假設有一部未看過的電影线得,如何確定它是愛情片還是動作片呢?我們看看下表的數(shù)據(jù):

image

當我們不知道未知電影史屬于何種類型徐伐,我們可以通過計算未知電影和其他電影的距離贯钩,按照電影的遞增排序,可以找到k個距離最近的電影办素。在距離最近的電影中角雷,選擇類別最多的那部電影,即可判斷為未知電影的類型性穿。

比如k=5勺三,這5部電影中3部是愛情片,2部是動作片需曾,那么我們將未知電影歸屬為愛情片吗坚。

工作原理

  1. 存在一個樣本數(shù)據(jù)集和數(shù)據(jù)標簽,知道樣本和標簽的對應關系
  2. 輸入沒有標簽的數(shù)據(jù)呆万,將新數(shù)據(jù)的每個特征與樣本集中數(shù)據(jù)對應的特征進行比較
  3. 提取樣本集中特征最相似數(shù)據(jù)的分類標簽商源,只選取前k個最相似的數(shù)據(jù),一般k是小于20

算法步驟

  • 計算已知類別數(shù)據(jù)集中的點與當前點之間的距離谋减;
  • 按照距離遞增次序排序牡彻;
  • 選取與當前點距離最小k個點;
  • 確定前k個點所在類別的出現(xiàn)頻率出爹;
  • 返回前k個點所出現(xiàn)頻率最高的類別作為當前點的預測分類庄吼。

機器學習中向量距離度量準則

下面??列舉了機器學習中常用的向量距離度量準則:

  • 歐式距離
  • 曼哈頓距離
  • 切比雪夫距離
  • 馬氏距離
  • 巴氏距離
  • 漢明距離
  • 皮爾遜系數(shù)
  • 信息熵

圖解過程

image

Python3版本代碼

偽代碼

首先給出KNN算法的偽代碼(對未知類別屬性的數(shù)據(jù)集中的每個點依次執(zhí)行以下操作):

  1. 計算已知類別數(shù)據(jù)集中的點和當前點之間的距離
  2. 按照距離遞增次序排序
  3. 選取與當前距離最小的k個點
  4. 確定k個點所在類別的出現(xiàn)頻率
  5. 返回前k個點出現(xiàn)頻率最高的類別作為當前點的預測分類

Python3實現(xiàn)

下面給出實際的Python3代碼。使用內(nèi)置的collections模塊來解決:

image

運行上面的代碼严就,顯示的結(jié)果為:

  • dist:待預測的電影和已知電影歐式距離
  • k_labels:取出排序后前(k=3)3個最小距離的電影對應的類別標簽总寻,結(jié)果是["動作片","動作片","愛情片"]
  • label:判斷的結(jié)果是動作片,因為動作片有2票
image

代碼解釋

1梢为、函數(shù)首先需要生成數(shù)據(jù)集:關于給出的前4部電影渐行,已知打斗次數(shù)和接吻次數(shù)轰坊,同時還有電影的分類情況;

2殊轴、現(xiàn)在新出現(xiàn)了一部電影:打斗次數(shù)是98衰倦,接吻次數(shù)是17,如何確定其屬于哪種類型的電影旁理?

打斗次數(shù) 接吻次數(shù) 電影分類
1 1 101 愛情片
2 5 89 愛情片
3 108 5 動作片
4 115 8 動作片
待預測 98 17 樊零?

不使用collections模塊如何解決?


image

classfiy函數(shù)有4個輸入?yún)?shù):

  1. 用于分類的輸入向量inX
  2. 輸入的訓練樣本集合為dataSet
  3. 標簽向量為labels
  4. 用于選擇最近鄰居的數(shù)目k

其中標簽向量的元素數(shù)目和矩陣dataSet的行數(shù)相同

看看具體的解釋:

1孽文、原始數(shù)據(jù)是什么樣子驻襟?

image

打印出來的效果:

image

2、為什么使用np.tile方法芋哭?

為了和dataSet的shape保持一致沉衣,方便后續(xù)的求距離

image

3、每個距離和相對的索引關系

image

Jupyter notebook中使用KNN算法

步驟

下面也是通過一個模擬的電影數(shù)據(jù)來講解如何在jupyter notebook中使用KNN算法减牺,大致步驟分為:

  1. 構(gòu)建數(shù)據(jù)集

構(gòu)建一個包含接吻鏡頭豌习、打斗鏡頭和電影類型的數(shù)據(jù)集

2、求距離

求出待預測分類的數(shù)據(jù)和原數(shù)據(jù)的歐式距離

3拔疚、距離排序

將求出的距離進行升序排列肥隆,并取出對應的電影分類

4、指定取出前k個數(shù)據(jù)

取出指定的前k個數(shù)據(jù)稚失,統(tǒng)計這些數(shù)據(jù)中電影類型的頻數(shù)栋艳,找出頻數(shù)最多的類型,即可判斷為未知待預測電影的類型

代碼

1句各、模擬數(shù)據(jù):

image

2吸占、求解距離

image
image
image

3、對距離升序排列

image

4凿宾、取出前k個數(shù)并統(tǒng)計頻數(shù)

image
image

封裝成函數(shù)

將上面的整個過程封裝成函數(shù):

image
import pandas as pd

"""
函數(shù)功能:KNN分類器

參數(shù)說明:
    inX:待預測分類的數(shù)據(jù)
    dataSet:原數(shù)據(jù)集矾屯,訓練集
    k:k-近鄰算法中的超參數(shù)k
    
返回值:分類結(jié)果

"""

def classify0(inX, dataSet,k):
    result = []
    
    # 1、求新數(shù)據(jù)和每個原數(shù)據(jù)的距離
    dist = list(((data.iloc[:6,1:3] - new_data) ** 2).sum(1) ** 0.5)
    # 2菌湃、將求出的距離和電影標簽放在一起
    dist_labels = pd.DataFrame({"dist":dist,"labels":data["電影類型"].tolist()})
    # 3问拘、根據(jù)距離升序排列,取出前k個
    dist_sorted = dist_labels.sort_values(by="dist")[:k]
    # 4惧所、排序之后取出標簽,并統(tǒng)計頻數(shù)
    res = dist_sorted.loc[:,"labels"].value_counts()
    result.append(res.index[0])
    
    return result

利用上面模擬的數(shù)據(jù)測試一下我們封裝的代碼绪杏,結(jié)果是相同的

image

參考資料

1下愈、《機器學習實戰(zhàn)》一書

2、機器學習實戰(zhàn)教程(一):K-近鄰算法(史詩級干貨長文)

3蕾久、《統(tǒng)計學習方法》-李航老師

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末势似,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌履因,老刑警劉巖障簿,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異栅迄,居然都是意外死亡站故,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門毅舆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來西篓,“玉大人,你說我怎么就攤上這事憋活∑窠颍” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵悦即,是天一觀的道長吮成。 經(jīng)常有香客問我,道長辜梳,這世上最難降的妖魔是什么粱甫? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮冗美,結(jié)果婚禮上魔种,老公的妹妹穿的比我還像新娘。我一直安慰自己粉洼,他們只是感情好节预,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著属韧,像睡著了一般安拟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宵喂,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天糠赦,我揣著相機與錄音,去河邊找鬼锅棕。 笑死拙泽,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的裸燎。 我是一名探鬼主播顾瞻,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼德绿!你這毒婦竟也來了荷荤?” 一聲冷哼從身側(cè)響起退渗,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蕴纳,沒想到半個月后会油,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡古毛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年翻翩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喇潘。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡体斩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出颖低,到底是詐尸還是另有隱情絮吵,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布忱屑,位于F島的核電站蹬敲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏莺戒。R本人自食惡果不足惜伴嗡,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望从铲。 院中可真熱鬧瘪校,春花似錦、人聲如沸名段。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伸辟。三九已至麻惶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間信夫,已是汗流浹背窃蹋。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留静稻,地道東北人警没。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像振湾,于是被迫代替她去往敵國和親惠奸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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