資源描述:
《k近鄰算法以及實例》由會員上傳分享,免費在線閱讀,更多相關內容在工程資料-天天文庫。
1、【機器學習】k-近鄰算法以及算法實例時間?2015-01-2614:31:00??博客園-原創(chuàng)精華區(qū)原文??http://www.cnblogs.com/jtianwen2014/p/4249003.html主題?算法?數據挖掘機器學習中常常要用到分類算法,在諸多的分類算法中有一種算法名為k-近鄰算法,也稱為kNN算法。一、kNN算法的工作原理二、適用情況三、算法實例及講解---1.收集數據---2.準備數據---3.設計算法分析數據---4.測試算法一、kNN算法的工作原理官方解釋:存在一個樣本數據集,也稱
2、作訓練樣本集,并且樣本中每個數據都存在標簽,即我們知道樣本集中每一數據與所屬分類的對應關系,輸入沒有標簽的新數據后,將新數據的每個特征與樣本集中的數據對應的特征進行比較,然后算法提取樣本集中特征最相似的數據(最近鄰)的分類標簽。一般來說,我們只選擇樣本集中前k個最相似的數據,這就是k-近鄰算法中k的出處,通常k是不大于20的整數,最后,選擇k個最相似的數據中出現次數最多的分類,作為新數據的分類。我的理解:k-近鄰算法就是根據“新數據的分類取決于它的鄰居”進行的,比如鄰居中大多數都是退伍軍人,那么這個人也極有可
3、能是退伍軍人。而算法的目的就是先找出它的鄰居,然后分析這幾位鄰居大多數的分類,極有可能就是它本省的分類。二、適用情況優(yōu)點:精度高,對異常數據不敏感(你的類別是由鄰居中的大多數決定的,一個異常鄰居并不能影響太大),無數據輸入假定;缺點:計算發(fā)雜度高(需要計算新的數據點與樣本集中每個數據的“距離”,以判斷是否是前k個鄰居),空間復雜度高(巨大的矩陣);適用數據范圍:數值型(目標變量可以從無限的數值集合中取值)和標稱型(目標變量只有在有限目標集中取值)。三、算法實例及講解例子中的案例摘《機器學習實戰(zhàn)》一書中的,代碼
4、例子是用python編寫的(需要matplotlib和numpy庫),不過重在算法,只要算法明白了,用其他語言都是可以寫出來的:海倫一直使用在線約會網站尋找合適自己的約會對象。盡管約會網站會推薦不同的人選,但她沒有從中找到喜歡的人。經過一番總結,她發(fā)現曾交往過三種類型的人:1.不喜歡的人(?以下簡稱1?);2.魅力一般的人(?以下簡稱2?);3.極具魅力的人(以下簡稱3?)?盡管發(fā)現了上述規(guī)律,但海倫依然無法將約會網站推薦的匹配對象歸入恰當的分類。她覺得可以在周一到周五約會哪些魅力一般的人,而周末則更喜歡與那
5、些極具魅力的人為伴。海倫希望我們的分類軟件可以更好的幫助她將匹配對象劃分到確切的分類中。此外海倫還收集了一些約會網站未曾記錄的數據信息,她認為這些數據更有助于匹配對象的歸類。我們先提取一下這個案例的目標:根據一些數據信息,對指定人選進行分類(1或2或3)。為了使用kNN算法達到這個目標,我們需要哪些信息?前面提到過,就是需要樣本數據,仔細閱讀我們發(fā)現,這些樣本數據就是“?海倫還收集了一些約會網站未曾記錄的數據信息?”。好的,下面我們就開始吧!?----1.收集數據海倫收集的數據是記錄一個人的三個特征:每年獲得
6、的飛行??屠锍虜?;玩視頻游戲所消耗的時間百分比;每周消費的冰淇淋公升數。數據是txt格式文件,如下圖,前三列依次是三個特征,第四列是分類(1:不喜歡的人,2:魅力一般的人,3:極具魅力的人),每一行代表一個人。數據文檔的下載鏈接是:http://pan.baidu.com/s/1jG7n4hS----?2.準備數據何為準備數據?之前收集到了數據,放到了txt格式的文檔中了,看起來也比較規(guī)整,但是計算機并不認識啊。計算機需要從txt文檔中讀取數據,并把數據進行格式化,也就是說存到矩陣中,用矩陣來承裝這些數據,這
7、樣才能使用計算機處理。需要兩個矩陣:一個承裝三個特征數據,一個承裝對應的分類。于是,我們定義一個函數,函數的輸入時數據文檔(txt格式),輸出為兩個矩陣。代碼如下:1deffile2matrix(filename):2fr=open(filename)3numberOfLines=len(fr.readlines())4returnMat=zeros((numberOfLines,3))5classLabelVector=[]6fr=open(filename)7index=08forlineinfr.rea
8、dlines():9line=line.strip()10listFromLine=line.split('t')11returnMat[index,:]=listFromLine[0:3]12classLabelVector.append(int(listFromLine[-1]))13index+=114returnreturnMat,classLabelVector簡要解讀代碼:首先打開文件