
機(jī)器學(xué)習(xí)中的kNN算法及Matlab實(shí)例
K最近鄰(k-Nearest Neighbor,KNN)分類算法,是一個(gè)理論上比較成熟的方法,也是最簡(jiǎn)單的機(jī)器學(xué)習(xí)算法之一。該方法的思路是:如果一個(gè)樣本在特征空間中的k個(gè)最相似(即特征空間中最鄰近)的樣本中的大多數(shù)屬于某一個(gè)類別,則該樣本也屬于這個(gè)類別。
盡管kNN算法的思想比較簡(jiǎn)單,但它仍然是一種非常重要的機(jī)器學(xué)習(xí)(或數(shù)據(jù)挖掘)算法。在2006年12月召開的 IEEE
International Conference on Data Mining (ICDM),與會(huì)的各位專家選出了當(dāng)時(shí)的十大數(shù)據(jù)挖掘算法( top 10 data mining algorithms ),可以參加文獻(xiàn)【1】, K最近鄰算法即位列其中。
二、在Matlab中利用kNN進(jìn)行最近鄰查詢
如果手頭有一些數(shù)據(jù)點(diǎn)(以及它們的特征向量)構(gòu)成的數(shù)據(jù)集,對(duì)于一個(gè)查詢點(diǎn),我們?cè)撊绾胃咝У貜臄?shù)據(jù)集中找到它的最近鄰呢?最通常的方法是基于k-d-tree進(jìn)行最近鄰搜索。
KNN算法不僅可以用于分類,還可以用于回歸,但主要應(yīng)用于回歸,所以下面我們就演示在MATLAB中利用KNN算法進(jìn)行數(shù)據(jù)挖掘的基本方法。
首先在Matlab中載入數(shù)據(jù),代碼如下,其中meas( : , 3:4)相當(dāng)于取出(之前文章中的)Petal.Length和Petal.Width這兩列數(shù)據(jù),一共150行,三類鳶尾花每類各50行。
[plain] view plain copy
load fisheriris
x = meas(:,3:4);
然后我們可以借助下面的代碼來用圖形化的方式展示一下數(shù)據(jù)的分布情況:
[plain] view plain copy
gscatter(x(:,1),x(:,2),species)
legend('Location','best')
執(zhí)行上述代碼,結(jié)果如下圖所示:
然后我們?cè)谝胍粋€(gè)新的查詢點(diǎn),并在圖上把該點(diǎn)用×標(biāo)識(shí)出來:
[plain] view plain copy
newpoint = [5 1.45];
line(newpoint(1),newpoint(2),'marker','x','color','k',...
'markersize',10,'linewidth',2)
結(jié)果如下圖所示:
接下來建立一個(gè)基于KD-Tree的最近鄰搜索模型,查詢目標(biāo)點(diǎn)附近的10個(gè)最近鄰居,并在圖中用圓圈標(biāo)識(shí)出來。
[plain] view plain copy
>> Mdl = KDTreeSearcher(x)
Mdl =
KDTreeSearcher with properties:
BucketSize: 50
Distance: 'euclidean'
DistParameter: []
X: [150x2 double]
>> [n,d] = knnsearch(Mdl,newpoint,'k',10);
line(x(n,1),x(n,2),'color',[.5 .5 .5],'marker','o',...
'linestyle','none','markersize',10)
下圖顯示確實(shí)找出了查詢點(diǎn)周圍的若干最近鄰居,但是好像只要8個(gè),
不用著急,其實(shí)系統(tǒng)確實(shí)找到了10個(gè)最近鄰居,但是其中有兩對(duì)數(shù)據(jù)點(diǎn)完全重合,所以在圖上你只能看到8個(gè),不妨把所有數(shù)據(jù)都輸出來看看,如下所示,可知確實(shí)是10個(gè)。
[plain] view plain copy
>> x(n,:)
ans =
5.0000 1.5000
4.9000 1.5000
4.9000 1.5000
5.1000 1.5000
5.1000 1.6000
4.8000 1.4000
5.0000 1.7000
4.7000 1.4000
4.7000 1.4000
4.7000 1.5000
KNN算法中,所選擇的鄰居都是已經(jīng)正確分類的對(duì)象。該方法在確定分類決策上只依據(jù)最鄰近的一個(gè)或者幾個(gè)樣本的類別來決定待分樣本所屬的類別。例如下面的代碼告訴我們,待查詢點(diǎn)的鄰接中有80%是versicolor類型的鳶尾花,所以如果采用KNN來進(jìn)行分類,那么待查詢點(diǎn)的預(yù)測(cè)分類結(jié)果就應(yīng)該是versicolor類型。
[plain] view plain copy
>> tabulate(species(n))
Value Count Percent
virginica 2 20.00%
versicolor 8 80.00%
在利用 KNN方法進(jìn)行類別決策時(shí),只與極少量的相鄰樣本有關(guān)。由于KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對(duì)于類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合。
我們還要說明在Matlab中使用KDTreeSearcher進(jìn)行最近鄰搜索時(shí),距離度量的類型可以是歐拉距離('euclidean')、曼哈頓距離('cityblock')、閔可夫斯基距離('minkowski')、切比雪夫距離('chebychev'),缺省情況下系統(tǒng)使用歐拉距離。你甚至還可以自定義距離函數(shù),然后使用knnsearch()函數(shù)來進(jìn)行最近鄰搜索,具體可以查看MATLAB的幫助文檔,我們不具體展開。
三、利用kNN進(jìn)行數(shù)據(jù)挖掘的實(shí)例
下面我們來演示在MATLAB構(gòu)建kNN分類器,并以此為基礎(chǔ)進(jìn)行數(shù)據(jù)挖掘的具體步驟。首先還是載入鳶尾花數(shù)據(jù),不同的是這次我們使用全部四個(gè)特征來訓(xùn)練模型。
[plain] view plain copy
load fisheriris
X = meas; % Use all data for fitting
Y = species; % Response data
然后使用fitcknn()函數(shù)來訓(xùn)練分類器模型。
[plain] view plain copy
>> Mdl = fitcknn(X,Y)
Mdl =
ClassificationKNN
ResponseName: 'Y'
CategoricalPredictors: []
ClassNames: {'setosa' 'versicolor' 'virginica'}
ScoreTransform: 'none'
NumObservations: 150
Distance: 'euclidean'
NumNeighbors: 1
你可以看到默認(rèn)情況下,最近鄰的數(shù)量為1,下面我們把它調(diào)整為4。
[plain] view plain copy
Mdl.NumNeighbors = 4;
或者你可以使用下面的代碼來完成上面同樣的任務(wù):
[plain] view plain copy
Mdl = fitcknn(X,Y,'NumNeighbors',4);
既然有了模型,我們能否利用它來執(zhí)行以下預(yù)測(cè)分類呢,具體來說此時(shí)我們需要使用predict()函數(shù),例如
[plain] view plain copy
>> flwr = [5.0 3.0 5.0 1.45];
>> flwrClass = predict(Mdl,flwr)
flwrClass =
'versicolor'
最后,我們還可以來評(píng)估一下建立的kNN分類模型的情況。例如你可以從已經(jīng)建好的模型中建立一個(gè)cross-validated 分類器:
[plain] view plain copy
CVMdl = crossval(Mdl);
然后再來看看cross-validation loss,它給出了在對(duì)那些沒有用來訓(xùn)練的數(shù)據(jù)進(jìn)行預(yù)測(cè)時(shí)每一個(gè)交叉檢驗(yàn)?zāi)P偷钠骄鶕p失
[plain] view plain copy
>> kloss = kfoldLoss(CVMdl)
kloss =
0.0333
再來檢驗(yàn)一下resubstitution loss, which,默認(rèn)情況下,它給出的是模型Mdl預(yù)測(cè)結(jié)果中被錯(cuò)誤分類的數(shù)據(jù)占比。
[plain] view plain copy
>> rloss = resubLoss(Mdl)
rloss =
0.0400
如你所見,cross-validated 分類準(zhǔn)確度與 resubstitution 準(zhǔn)確度大致相近。所以你可以認(rèn)為你的模型在面對(duì)新數(shù)據(jù)時(shí)(假設(shè)新數(shù)據(jù)同訓(xùn)練數(shù)據(jù)具有相同分布的話),分類錯(cuò)誤的可能性大約是 4% 。
四、關(guān)于k值的選擇
kNN算法在分類時(shí)的主要不足在于,當(dāng)樣本不平衡時(shí),如一個(gè)類的樣本容量很大,而其他類樣本容量很小時(shí),有可能導(dǎo)致當(dāng)輸入一個(gè)新樣本時(shí),該樣本的K個(gè)鄰居中大容量類的樣本占多數(shù)。因此可以采用權(quán)值的方法(和該樣本距離小的鄰居權(quán)值大)來改進(jìn)。
從另外一個(gè)角度來說,算法中k值的選擇對(duì)模型本身及其對(duì)數(shù)據(jù)分類的判定結(jié)果都會(huì)產(chǎn)生重要影響。如果選擇較小的k值,就相當(dāng)于用較小的領(lǐng)域中的訓(xùn)練實(shí)例來進(jìn)行預(yù)測(cè),學(xué)習(xí)的近似誤差會(huì)減小,只有與輸入實(shí)例較為接近(相似的)訓(xùn)練實(shí)例才會(huì)對(duì)預(yù)測(cè)結(jié)果起作用。但缺點(diǎn)是“學(xué)習(xí)”的估計(jì)誤差會(huì)增大。預(yù)測(cè)結(jié)果會(huì)對(duì)近鄰的實(shí)例點(diǎn)非常敏感。如果臨近的實(shí)例點(diǎn)恰巧是噪聲,預(yù)測(cè)就會(huì)出現(xiàn)錯(cuò)誤。換言之,k值的減小意味著整體模型變得復(fù)雜,容易發(fā)成過擬合。數(shù)據(jù)分析師培訓(xùn)
如果選擇較大的k值,就相當(dāng)于用較大的鄰域中的訓(xùn)練實(shí)例進(jìn)行預(yù)測(cè),其優(yōu)點(diǎn)是可以減少學(xué)習(xí)的估計(jì)誤差,但缺點(diǎn)是學(xué)習(xí)的近似誤差會(huì)增大。這時(shí)與輸入實(shí)例較遠(yuǎn)的(不相似的)訓(xùn)練實(shí)例也會(huì)對(duì)預(yù)測(cè)起作用,使預(yù)測(cè)發(fā)生錯(cuò)誤。k值的增大就意味著整體的模型變得簡(jiǎn)單。
在應(yīng)用中,k值一般推薦取一個(gè)相對(duì)比較小的數(shù)值。并可以通過交叉驗(yàn)證法來幫助選取最優(yōu)k值。
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫(kù)管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫(kù)表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫(kù)表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫(kù))處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場(chǎng)景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場(chǎng)景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫(kù)表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營(yíng)問題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營(yíng)銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營(yíng)銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場(chǎng)景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡(jiǎn)單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10