
python 實例簡述 k-近鄰算法的基本原理
首先我們一個樣本集合,也稱為訓練樣本集,在訓練樣本集中每個數據都存在一個標簽用來指明該數據的所屬分類。在輸入一個新的未知所屬分類的數據后,將新數據的所有特征和樣本集中的所有數據計算距離。從樣本集中選擇與新數據距離最近的 k 個樣本,將 k 個樣本中出現頻次最多的分類作為新數據的分類,通常 k 是小于20的,這也是 k 的出處。
k近鄰算法的優點:精度高,對異常值不敏感,無數據輸入假定。
k 近鄰算法的缺點:時間復雜度和空間復雜度高
數據范圍:數值型和標稱型
簡單的k 近鄰算法實現
第一步:使用 python 導入數據
from numpy import *
import operator
'''simple kNN test'''
#get test data
def createDataSet():
group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels=['A','A','B','B']
return group,labels
作為例子,直接創建數據集和標簽,實際應用中往往是從文件中讀取數據集和標簽。array 是 numpy 提供的一種數據結構,用以存儲同樣類型的數據,除了常規數據類型外,其元素也可以是列表和元組。這里 group 就是元素數據類型為 list 的數據集。labels 是用列表表示的標簽集合。其中 group 和 labels 中的數據元素一一對應,比如數據點[1.0,1.1]標簽是 A,數據點[0,0.1]標簽是 B。
第二步:實施 kNN 算法
kNN 算法的自然語言描述如下:
1. 計算已知類別數據集中的所有點與未分類點之間的距離。
2. 將數據集中的點按照與未分類點的距離遞增排序。
3. 選出數據集中的與未分類點間距離最近的 n 個點。
4. 統計這 n 個點中所屬類別出現的頻次。
5. 返回這 n 個點中出現頻次最高的那個類別。
實現代碼:
def classify0(inX,dataSet,labels,k):
dataSetSize=dataSet.shape[0]
diffMat=tile(inX,(dataSetSize,1))-dataSet
sqDiffMat=diffMat**2
sqDistances=sqDiffMat.sum(axis=1)
distances=sqDistances**0.5
sortedDistIndicies=distances.argsort()
classCount={}
for i in range(k):
voteIlabel=labels[sortedDistIndicies[i]]
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
classify0函數中的四個參數含義分別如下:inX 是希望被分類的數據點的屬性向量,dataSet 是訓練數據集向量,labels 是標簽向量,k 是 kNN 算法的參數 k。
接下來來看看本函數的語句都做了那些事。
第一行dataSetSize=dataSet.shape[0],dataSet 是 array 類型,那么dataSet.shape表示 dataSet 的維度矩陣,dataSet.shape[0]表示第二維的長度,dataSet.shape[1]表示第一維的長度。在這里dataSetSize 表示訓練數據集中有幾條數據。
第二行tile(inX,(dataSetSize,1))函數用以返回一個將 inX 以矩陣形式重復(dataSetSize,1)遍的array,這樣產生的矩陣減去訓練數據集矩陣就獲得了要分類的向量和每一個數據點的屬性差,也就是 diffMat。
第三行**在 python 中代表乘方,那么sqDiffMat也就是屬性差的乘方矩陣。
第四行array 的 sum 函數若是加入 axis=1的參數就表示要將矩陣中一行的數據相加,這樣,sqDistances的每一個數據就代表輸入向量和訓練數據點的距離的平方了。
第五行不解釋,得到了輸入向量和訓練數據點的距離矩陣。
第六行sortedDistIndicies=distances.argsort(),其中 argsort 函數用以返回排序的索引結果,直接使用 argsort 默認返回第一維的升序排序的索引結果。
然后創建一個字典。
接下來進行 k 次循環,每一次循環中,找到 i 對應的數據的標簽,并將其所在字典的值加一,然后對字典進行遞減的按 value 的排序。
這樣循環完成后,classCount 字典的第一個值就是kNN 算法的返回結果了,也就是出現最多次數的那個標簽。
二維的歐式距離公式如下,很簡單:
相同的,比如說四維歐式距離公式如下:
第三步:測試分類器
在測試 kNN 算法結果的時候,其實就是討論分類器性能,至于如何改進分類器性能將在后續學習研究中探討,現在,用正確率來評估分類器就可以了。完美分類器的正確率為1,最差分類器的正確率為0,由于分類時類別可能有多種,注意在分類大于2時,最差分類器是不能直接轉化為完美分類器的。
數據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
CDA數據分析師證書考試體系(更新于2025年05月22日)
2025-05-26解碼數據基因:從數字敏感度到邏輯思維 每當看到超市貨架上商品的排列變化,你是否會聯想到背后的銷售數據波動?三年前在零售行 ...
2025-05-23在本文中,我們將探討 AI 為何能夠加速數據分析、如何在每個步驟中實現數據分析自動化以及使用哪些工具。 數據分析中的AI是什么 ...
2025-05-20當數據遇見人生:我的第一個分析項目 記得三年前接手第一個數據分析項目時,我面對Excel里密密麻麻的銷售數據手足無措。那些跳動 ...
2025-05-20在數字化運營的時代,企業每天都在產生海量數據:用戶點擊行為、商品銷售記錄、廣告投放反饋…… 這些數據就像散落的拼圖,而相 ...
2025-05-19在當今數字化營銷時代,小紅書作為國內領先的社交電商平臺,其銷售數據蘊含著巨大的商業價值。通過對小紅書銷售數據的深入分析, ...
2025-05-16Excel作為最常用的數據分析工具,有沒有什么工具可以幫助我們快速地使用excel表格,只要輕松幾步甚至輸入幾項指令就能搞定呢? ...
2025-05-15數據,如同無形的燃料,驅動著現代社會的運轉。從全球互聯網用戶每天產生的2.5億TB數據,到制造業的傳感器、金融交易 ...
2025-05-15大數據是什么_數據分析師培訓 其實,現在的大數據指的并不僅僅是海量數據,更準確而言是對大數據分析的方法。傳統的數 ...
2025-05-14CDA持證人簡介: 萬木,CDA L1持證人,某電商中廠BI工程師 ,5年數據經驗1年BI內訓師,高級數據分析師,擁有豐富的行業經驗。 ...
2025-05-13CDA持證人簡介: 王明月 ,CDA 數據分析師二級持證人,2年數據產品工作經驗,管理學博士在讀。 學習入口:https://edu.cda.cn/g ...
2025-05-12CDA持證人簡介: 楊貞璽 ,CDA一級持證人,鄭州大學情報學碩士研究生,某上市公司數據分析師。 學習入口:https://edu.cda.cn/g ...
2025-05-09CDA持證人簡介 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度、美團、阿里等 ...
2025-05-07相信很多做數據分析的小伙伴,都接到過一些高階的數據分析需求,實現的過程需要用到一些數據獲取,數據清洗轉換,建模方法等,這 ...
2025-05-06以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda.cn/g ...
2025-04-30CDA持證人簡介: 邱立峰 CDA 數據分析師二級持證人,數字化轉型專家,數據治理專家,高級數據分析師,擁有豐富的行業經驗。 ...
2025-04-29CDA持證人簡介: 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度,美團,阿里等 ...
2025-04-28CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-27數據分析在當今信息時代發揮著重要作用。單因素方差分析(One-Way ANOVA)是一種關鍵的統計方法,用于比較三個或更多獨立樣本組 ...
2025-04-25CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-25