大家好,我是一枚小小的北漂渣碩毅往,為了更加有效率地督促自己系統(tǒng)的學(xué)習(xí)檩淋、及時(shí)將自己的學(xué)習(xí)心得分享給處于類似學(xué)習(xí)階段的朋友芬为,同時(shí)也為了獲得大家的指導(dǎo),我開啟了自己的博文之旅狼钮,如果有侵權(quán)碳柱、錯(cuò)誤等捡絮,請(qǐng)大家及時(shí)反饋熬芜,我一定改正。謝謝大家~~
本人目前正在學(xué)習(xí)機(jī)器學(xué)習(xí)福稳,分享的內(nèi)容也主要是知識(shí)涎拉、編程、自我的認(rèn)知的圆。好噠鼓拧,開始正文。這段時(shí)間越妈,我正在學(xué)習(xí)機(jī)器學(xué)習(xí)的核心算法季俩,針對(duì)每種算法,我會(huì)分別用單純的python算法和基于scikit-learn框架來實(shí)現(xiàn)梅掠。
K-NN算法(理論知識(shí)來自Peter Harrington的《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》和李航的《統(tǒng)計(jì)學(xué)習(xí)方法》酌住,非常感謝這些優(yōu)秀人物和優(yōu)秀書籍)
K-NN算法工作原理:KNN算法是1968年由Cover和Hart提出店归。存在一個(gè)樣本數(shù)據(jù)集合, 也稱作訓(xùn)練樣本集, 并且樣本集中每個(gè)數(shù)據(jù)都存在標(biāo)簽, 即我們知道樣本集中每一數(shù)據(jù)與所屬分類的對(duì)應(yīng)關(guān)系。輸人沒有標(biāo)簽的新數(shù)據(jù)后, 將新數(shù)據(jù)的每個(gè)特征與樣本集中數(shù)據(jù)對(duì)應(yīng)的特征進(jìn)行比較, 然后算法提取樣本集中特征最相似數(shù)據(jù)(最近鄰)的分類標(biāo)簽酪我。一般來說, 只選擇樣本數(shù)據(jù)集中前k個(gè)最相似的數(shù)據(jù),
這就是KNN算法中k的出處消痛。通常,k是不大于20的整數(shù)(較大的k可以抑制噪聲都哭,但是會(huì)使得分類邊界不明顯)秩伞。最后, 選擇k個(gè)最相似數(shù)據(jù)中出現(xiàn)次數(shù)最多的分類,作為新數(shù)據(jù)的分類
k近鄰法實(shí)際上利用訓(xùn)練數(shù)據(jù)集對(duì)特征向量空間進(jìn)行劃分,并作為其分類的“模型”欺矫。k值的選擇纱新、距離度量及分類決策規(guī)則是k近鄰法的三個(gè)基本要素。
K-NN算法的適用場(chǎng)景:樣本在50k-100k之間穆趴,具有明確的離散標(biāo)簽的數(shù)據(jù)分類或者有連續(xù)標(biāo)簽的數(shù)據(jù)回歸怒炸。
K-NN算法的實(shí)現(xiàn)
流程:1)收集數(shù)據(jù):提供文本文件; 2)準(zhǔn)備數(shù)據(jù):使用Python解析文本文件毡代,同時(shí)如果特征值數(shù)據(jù)差異較大阅羹,需要做數(shù)值歸一化處理;3)分析數(shù)據(jù):使用Matplotlib畫二維擴(kuò)散圖教寂;4)測(cè)試算法:使用測(cè)試集來測(cè)試準(zhǔn)確度捏鱼;5)使用算法:將數(shù)據(jù)集合中的特征值輸入程序就行分類
基礎(chǔ)Python算法實(shí)現(xiàn)
1)首先準(zhǔn)備數(shù)據(jù)(如果原始數(shù)據(jù)特征值值的大小差異大,最好先繼續(xù)數(shù)據(jù)的歸一化處理酪耕。一般常用的數(shù)值歸一化方法有:最大最小值方法(最大值與最小值容易受異常點(diǎn)影響导梆,魯棒性較差,只適合傳統(tǒng)精確小數(shù)據(jù)場(chǎng)景)和正太標(biāo)準(zhǔn)化方法(在已有樣本足夠多的情況下比較穩(wěn)定迂烁,適合現(xiàn)代嘈雜大數(shù)據(jù)場(chǎng)景))
2)將訓(xùn)練集集中的三個(gè)特征值繪制出來看尼,代碼見圖2,效果見圖3
3)接下來完成KNN算法
備注:獲取數(shù)組的最值函數(shù)如min()或者max()以及包括后面的一些比較運(yùn)算等盟步,需要數(shù)組中數(shù)據(jù)具有統(tǒng)一的格式藏斩,否則會(huì)報(bào)錯(cuò),因此却盘,利用astype來統(tǒng)一成一樣的數(shù)據(jù)類型
4)結(jié)合測(cè)試集狰域,驗(yàn)證KNN算法的有效性(主要是基于錯(cuò)誤率)
結(jié)果表明,KNN算法中黄橘,k的取值非常重要兆览,影響算法的有效性,k的取值應(yīng)該考慮所在數(shù)據(jù)集合的大小
好噠塞关,至此基于Python完成了KNN算法的初步編程設(shè)計(jì)抬探,下一節(jié),我將基于scikit-learn來學(xué)習(xí)KNN算法帆赢,歡迎大家指點(diǎn)小压,也希望大家多多支持小菜鳥啦砰左,如果對(duì)您有幫助,請(qǐng)賞我一杯咖啡錢吧~~