硬核機(jī)器學(xué)習(xí)干貨,手把手教你寫KNN郭厌!

姓名:王咫毅

學(xué)號(hào):19021211150

【嵌牛導(dǎo)讀】強(qiáng)化學(xué)習(xí)就是通過(guò)觀察來(lái)學(xué)習(xí)做成某個(gè)動(dòng)作袋倔,每個(gè)動(dòng)作呢都會(huì)對(duì)環(huán)境有所影響,并且環(huán)境會(huì)給出反饋折柠,學(xué)習(xí)對(duì)象就會(huì)根據(jù)觀察到的周圍環(huán)境的反饋來(lái)做出判斷宾娜。這個(gè)過(guò)程就是強(qiáng)化學(xué)習(xí)。k-近鄰算法(k-Nearest Neighbour algorithm)扇售,又稱為KNN算法前塔,是數(shù)據(jù)挖掘技術(shù)中原理最簡(jiǎn)單的算法。KNN的工作原理承冰。

【嵌牛鼻子】有監(jiān)督學(xué)習(xí) knn 機(jī)器學(xué)習(xí)

【嵌牛提問(wèn)】knn原理是什么华弓?怎么實(shí)現(xiàn)?

【嵌牛正文】

轉(zhuǎn)載自:http://www.reibang.com/p/5f623766ea1d

在探討算法之前困乒,我們先來(lái)談一談什么是機(jī)器學(xué)習(xí)寂屏,相信大家都聽說(shuō)過(guò)AlphaGo。2016年3月娜搂,AlphaGo與圍棋世界冠軍李世石進(jìn)行圍棋人機(jī)大戰(zhàn)迁霎,最終以4:1獲勝;2017年5月百宇,AlphaGo與世界圍棋冠軍柯潔對(duì)戰(zhàn)欧引,以3:0獲勝。AlphaGo其實(shí)就是一款圍棋人工智能程序恳谎,其主要工作原理是“深度學(xué)習(xí)”芝此。看一下下面這張圖因痛,來(lái)了解一下婚苹,人工智能、機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的關(guān)系鸵膏。

在20世紀(jì)五十年代膊升,人工智能開始興起,早期的人工智能還是讓人興奮的(雖然后來(lái)發(fā)展歷程跌宕起伏谭企,像下面這張圖廓译,比過(guò)山車還刺激评肆,當(dāng)然這個(gè)不是我們今天的探討重點(diǎn),感興趣的小伙伴們可以自行補(bǔ)充這塊知識(shí))非区。在八十年代的時(shí)候瓜挽,機(jī)器學(xué)習(xí)作為人工智能的一個(gè)分支也開始興起,之后也得到了很廣泛的應(yīng)用征绸,比如淘寶京東商品推送久橙,豆瓣電影的“猜你喜歡”這類的推薦系統(tǒng),還有其他的領(lǐng)域管怠,像 數(shù)據(jù)挖掘淆衷、計(jì)算機(jī)視覺、自然語(yǔ)言處理渤弛、生物特征識(shí)別祝拯、搜索引擎、醫(yī)學(xué)診斷她肯、檢測(cè)信用卡欺騙鹿驼、語(yǔ)音與手寫識(shí)別、戰(zhàn)略游戲辕宏、機(jī)器人等等等等畜晰,足以看出它的應(yīng)用范圍有多廣。2010年左右瑞筐,機(jī)器學(xué)習(xí)里面的一個(gè)分支——深度學(xué)習(xí)取得了突破性進(jìn)展凄鼻,驅(qū)動(dòng)人工智能蓬勃發(fā)展,比如像AlphaGo聚假、人臉識(shí)別块蚌、圖像識(shí)別、文字識(shí)別膘格、智能監(jiān)控等等峭范。

這里我們重點(diǎn)來(lái)看一下,機(jī)器學(xué)習(xí)的概念瘪贱,什么是機(jī)器學(xué)習(xí)呢纱控?他其實(shí)就是一段計(jì)算機(jī)程序,針對(duì)某一個(gè)特定的任務(wù)菜秦,從經(jīng)驗(yàn)中學(xué)習(xí)甜害,并且變得越來(lái)越好。這就是機(jī)器學(xué)習(xí)球昨。機(jī)器學(xué)習(xí)有哪些類型呢尔店?主要就是監(jiān)督學(xué)習(xí)、無(wú)監(jiān)督學(xué)習(xí)、半監(jiān)督學(xué)習(xí)嚣州、強(qiáng)化學(xué)習(xí)鲫售。

機(jī)器學(xué)習(xí)定義

人工智能(Artificial Intelligence, AI):是指由人工制造出來(lái)的系統(tǒng)所表現(xiàn)出來(lái)的智能。類似于電影中終結(jié)者该肴、阿爾法狗這類的具有一定的和人類智慧同樣本質(zhì)的一類智能的物體情竹。

機(jī)器學(xué)習(xí)(Machine Learning, ML):是人工智能的一個(gè)分支,是實(shí)現(xiàn)人工智能的一個(gè)途徑沙庐,即以機(jī)器學(xué)習(xí)為手段解決人工智能中的問(wèn)題。讓一個(gè)計(jì)算機(jī)程序針對(duì)某一個(gè)特定任務(wù)佳吞,從經(jīng)驗(yàn)中學(xué)習(xí)拱雏,并且越來(lái)越好。

深度學(xué)習(xí)(Deep Learning, DL):是機(jī)器學(xué)習(xí)拉出的分支底扳。是機(jī)器學(xué)習(xí)算法中的一種算法铸抑,一種實(shí)現(xiàn)機(jī)器學(xué)習(xí)的技術(shù)和學(xué)習(xí)方法。

機(jī)器學(xué)習(xí)類型

監(jiān)督學(xué)習(xí)就是輸入一個(gè)包含有特征和目標(biāo)的訓(xùn)練集衷模,并且要求目標(biāo)是認(rèn)為標(biāo)注好的鹊汛,也就是你需要提前告訴模型,特征是什么阱冶,目標(biāo)是什么刁憋,然后讓模型根據(jù)訓(xùn)練集學(xué)習(xí)出一個(gè)函數(shù),那么當(dāng)新的數(shù)據(jù)來(lái)的時(shí)候木蹬,可以根據(jù)這個(gè)函數(shù)預(yù)測(cè)出結(jié)果至耻。

無(wú)監(jiān)督學(xué)習(xí)與監(jiān)督學(xué)習(xí)唯一的不同就是訓(xùn)練集沒有提前進(jìn)行人為標(biāo)注。

半監(jiān)督學(xué)習(xí)顧名思義就是介于監(jiān)督學(xué)習(xí)和無(wú)監(jiān)督學(xué)習(xí)之間

強(qiáng)化學(xué)習(xí)就是通過(guò)觀察來(lái)學(xué)習(xí)做成某個(gè)動(dòng)作镊叁,每個(gè)動(dòng)作呢都會(huì)對(duì)環(huán)境有所影響尘颓,并且環(huán)境會(huì)給出反饋,學(xué)習(xí)對(duì)象就會(huì)根據(jù)觀察到的周圍環(huán)境的反饋來(lái)做出判斷晦譬。這個(gè)過(guò)程就是強(qiáng)化學(xué)習(xí)疤苹。

那我們今天要講的k-近鄰算法就屬于機(jī)器學(xué)習(xí)中的有監(jiān)督學(xué)習(xí),并且屬于有監(jiān)督學(xué)習(xí)中的距離類模型敛腌。

一卧土、k-近鄰算法是什么

k-近鄰算法(k-Nearest Neighbour algorithm),又稱為KNN算法像樊,是數(shù)據(jù)挖掘技術(shù)中原理最簡(jiǎn)單的算法夸溶。KNN的工作原理:給定一個(gè)已知標(biāo)簽類別的訓(xùn)練數(shù)據(jù)集,輸入沒有標(biāo)簽的新數(shù)據(jù)后凶硅,在訓(xùn)練數(shù)據(jù)集中找到與新數(shù)據(jù)最鄰近的k個(gè)實(shí)例缝裁,如果這k個(gè)實(shí)例的多數(shù)屬于某個(gè)類別,那么新數(shù)據(jù)就屬于這個(gè)類別〗莅螅可以簡(jiǎn)單理解為:由那些離X最近的k個(gè)點(diǎn)來(lái)投票決定X歸為哪一類韩脑。

圖1中有紅色三角和藍(lán)色方塊兩種類別,我們現(xiàn)在需要判斷綠色圓點(diǎn)屬于哪種類別

當(dāng)k=3時(shí)粹污,綠色圓點(diǎn)屬于紅色三角這種類別段多;

當(dāng)k=5時(shí),綠色圓點(diǎn)屬于藍(lán)色方塊這種類別壮吩。

舉個(gè)簡(jiǎn)單的例子进苍,可以用k-近鄰算法分類一個(gè)電影是愛情片還是動(dòng)作片。(打斗鏡頭和接吻鏡頭數(shù)量為虛構(gòu))

表1就是我們已有的數(shù)據(jù)集合鸭叙,也就是訓(xùn)練樣本集觉啊。這個(gè)數(shù)據(jù)集有兩個(gè)特征——打斗鏡頭數(shù)和接吻鏡頭數(shù)。除此之外沈贝,我們也知道每部電影的所屬類型杠人,即分類標(biāo)簽。粗略看來(lái)宋下,接吻鏡頭多的就是愛情片嗡善,打斗鏡頭多的就是動(dòng)作片。以我們多年的經(jīng)驗(yàn)來(lái)看学歧,這個(gè)分類還算合理罩引。如果現(xiàn)在給我一部新的電影,告訴我電影中的打斗鏡頭和接吻鏡頭分別是多少枝笨,那么我可以根據(jù)你給出的信息進(jìn)行判斷蜒程,這部電影是屬于愛情片還是動(dòng)作片。而k-近鄰算法也可以像我們?nèi)艘粯幼龅竭@一點(diǎn)伺帘。但是昭躺,這僅僅是兩個(gè)特征,如果把特征擴(kuò)大到N個(gè)呢伪嫁?我們?nèi)祟愡€能憑經(jīng)驗(yàn)“一眼看出”電影的所屬類別嗎领炫?想想就知道這是一個(gè)非常困難的事情,但算法可以张咳,這就是算法的魅力所在帝洪。

我們已經(jīng)知道k-近鄰算法的工作原理,根據(jù)特征比較脚猾,然后提取樣本集中特征最相似數(shù)據(jù)(最近鄰)的分類標(biāo)簽葱峡。那么如何進(jìn)行比較呢?比如表1中新出的電影龙助,我們?cè)撊绾闻袛嗨鶎俚碾娪邦悇e呢砰奕?如圖2所示:

我們可以從散點(diǎn)圖中大致推斷,這個(gè)未知電影有可能是愛情片,因?yàn)榭雌饋?lái)距離已知的三個(gè)愛情片更近一點(diǎn)军援。k-近鄰算法是用什么方法進(jìn)行判斷呢仅淑?沒錯(cuò),就是距離度量胸哥。這個(gè)電影分類例子中有兩個(gè)特征涯竟,也就是在二維平面中計(jì)算兩點(diǎn)之間的距離,就可以用我們高中學(xué)過(guò)的距離計(jì)算公式:

如果是多個(gè)特征擴(kuò)展到N維空間空厌,怎么計(jì)算庐船?沒錯(cuò),我們可以使用歐氏距離(也稱歐幾里得度量)嘲更,如下所示:

通過(guò)計(jì)算可以得到訓(xùn)練集中所有電影與未知電影的距離筐钟,如表2所示:

通過(guò)表2的計(jì)算結(jié)果,我們可以知道綠點(diǎn)標(biāo)記的電影到愛情片《后來(lái)的我們》距離最近哮内,為29.1盗棵。如果僅僅根據(jù)這個(gè)結(jié)果壮韭,判定綠點(diǎn)電影的類別為愛情片北发,這個(gè)算法叫做最近鄰算法,而非k-近鄰算法喷屋。k-近鄰算法步驟如下:

(1) 計(jì)算已知類別數(shù)據(jù)集中的點(diǎn)與當(dāng)前點(diǎn)之間的距離琳拨;(2) 按照距離遞增次序排序;(3) 選取與當(dāng)前點(diǎn)距離最小的k個(gè)點(diǎn)屯曹;(4) 確定前k個(gè)點(diǎn)所在類別的出現(xiàn)頻率狱庇;(5) 返回前k個(gè)點(diǎn)出現(xiàn)頻率最高的類別作為當(dāng)前點(diǎn)的預(yù)測(cè)類別。

比如恶耽,現(xiàn)在K=4密任,那么在這個(gè)電影例子中,把距離按照升序排列偷俭,距離綠點(diǎn)電影最近的前4個(gè)的電影分別是《后來(lái)的我們》浪讳、《前任3》、《無(wú)問(wèn)西東》和《紅海行動(dòng)》涌萤,這四部電影的類別統(tǒng)計(jì)為愛情片:動(dòng)作片=3:1淹遵,出現(xiàn)頻率最高的類別為愛情片,所以在k=4時(shí)负溪,綠點(diǎn)電影的類別為愛情片透揣。這個(gè)判別過(guò)程就是k-近鄰算法。

二川抡、k-近鄰算法的Python實(shí)現(xiàn)

在了解k-近鄰算法的原理及實(shí)施步驟之后辐真,我們用python將這些過(guò)程實(shí)現(xiàn)。

算法實(shí)現(xiàn)

1.1構(gòu)建已經(jīng)分類好的原始數(shù)據(jù)集

為了方便驗(yàn)證,這里使用python的字典dict構(gòu)建數(shù)據(jù)集拆祈,然后再將其轉(zhuǎn)化成DataFrame格式恨闪。

import pandas as pdrowdata={'電影名稱':['無(wú)問(wèn)西東','后來(lái)的我們','前任3','紅海行動(dòng)','唐人街探案','戰(zhàn)狼2'], '打斗鏡頭':[1,5,12,108,112,115], '接吻鏡頭':[101,89,97,5,9,8], '電影類型':['愛情片','愛情片','愛情片','動(dòng)作片','動(dòng)作片','動(dòng)作片']}movie_data= pd.DataFrame(rowdata)movie_data

1.2計(jì)算已知類別數(shù)據(jù)集中的點(diǎn)與當(dāng)前點(diǎn)之間的距離

new_data = [24,67]dist = list((((movie_data.iloc[:6,1:3]-new_data)2).sum(1))0.5)dist

1.3將距離升序排列,然后選取距離最小的k個(gè)點(diǎn)

dist_l = pd.DataFrame({'dist': dist, 'labels': (movie_data.iloc[:6, 3])})dr = dist_l.sort_values(by = 'dist')[: 4]dr

1.4確定前k個(gè)點(diǎn)所在類別的出現(xiàn)頻率

re = dr.loc[:,'labels'].value_counts()re

1.5選擇頻率最高的類別作為當(dāng)前點(diǎn)的預(yù)測(cè)類別

result = [] result.append(re.index[0])result

封裝函數(shù)

完整的流程已經(jīng)實(shí)現(xiàn)了放坏,下面我們需要將這些步驟封裝成函數(shù)咙咽,方便我們后續(xù)的調(diào)用

import pandas as pd"""函數(shù)功能:KNN分類器參數(shù)說(shuō)明:* new_data:需要預(yù)測(cè)分類的數(shù)據(jù)集** dataSet:已知分類標(biāo)簽的數(shù)據(jù)集(訓(xùn)練集)** k:k-近鄰算法參數(shù),選擇距離最小的k個(gè)點(diǎn)返回:?result:分類結(jié)果"""def* classify0(inX,dataSet,k): result = [] dist = list((((dataSet.iloc[:,1:3]-inX)2).sum(1))0.5) dist_l = pd.DataFrame({'dist':dist,'labels':(dataSet.iloc[:, 3])}) dr = dist_l.sort_values(by = 'dist')[: k] re = dr.loc[:, 'labels'].value_counts() result.append(re.index[0])?return?result

測(cè)試函數(shù)運(yùn)行結(jié)果

inX = new_datadataSet = movie_datak = 3classify0(inX,dataSet,k)

這就是我們使用k-近鄰算法構(gòu)建的一個(gè)分類器淤年,根據(jù)我們的“經(jīng)驗(yàn)”可以看出钧敞,分類器給的答案還是比較符合我們的預(yù)期的。

學(xué)習(xí)到這里麸粮,有人可能會(huì)問(wèn):”分類器何種情況下會(huì)出錯(cuò)溉苛?“或者”分類器給出的答案是否永遠(yuǎn)都正確?“答案一定是否定的弄诲,分類器并不會(huì)得到百分百正確的結(jié)果愚战,我們可以使用很多種方法來(lái)驗(yàn)證分類器的準(zhǔn)確率。此外齐遵,分類器的性能也會(huì)受到很多因素的影響寂玲,比如k的取值就在很大程度上影響了分類器的預(yù)測(cè)結(jié)果,還有分類器的設(shè)置梗摇、原始數(shù)據(jù)集等等拓哟。為了測(cè)試分類器的效果,我們可以把原始數(shù)據(jù)集分為兩部分伶授,一部分用來(lái)訓(xùn)練算法(稱為訓(xùn)練集)断序,一部分用來(lái)測(cè)試算法的準(zhǔn)確率(稱為測(cè)試集)。同時(shí)糜烹,我們不難發(fā)現(xiàn)违诗,k-近鄰算法沒有進(jìn)行數(shù)據(jù)的訓(xùn)練,直接使用未知的數(shù)據(jù)與已知的數(shù)據(jù)進(jìn)行比較疮蹦,得到結(jié)果诸迟。因此,可以說(shuō)挚币,k-近鄰算法不具有顯式的學(xué)習(xí)過(guò)程亮蒋。

三、k-近鄰算法之約會(huì)網(wǎng)站配對(duì)效果判定

海倫一直使用在線約會(huì)網(wǎng)站尋找適合自己的約會(huì)對(duì)象妆毕,盡管約會(huì)網(wǎng)站會(huì)推薦不同的人選慎玖,但她并不是每一個(gè)都喜歡,經(jīng)過(guò)一番總結(jié)笛粘,她發(fā)現(xiàn)曾經(jīng)交往的對(duì)象可以分為三類:

不喜歡的人

魅力一般的人

極具魅力得人

海倫收集約會(huì)數(shù)據(jù)已經(jīng)有了一段時(shí)間趁怔,她把這些數(shù)據(jù)存放在文本文件datingTestSet.txt中湿硝,其中各字段分別為:

每年飛行常客里程

玩游戲視頻所占時(shí)間比

每周消費(fèi)冰淇淋公升數(shù)

準(zhǔn)備數(shù)據(jù)

datingTest = pd.read_table('datingTestSet.txt',header=None)

datingTest.head()

datingTest.shape

datingTest.info()

分析數(shù)據(jù)

使用 Matplotlib 創(chuàng)建散點(diǎn)圖润努,查看各數(shù)據(jù)的分布情況

%matplotlib inline

import matplotlib as mpl

import matplotlib.pyplot as plt

把不同標(biāo)簽用顏色區(qū)分

Colors = []

for

i in range(datingTest.shape[0]):

m = datingTest.iloc[i,-1]if

m=='didntLike':

Colors.append('black')if

m=='smallDoses':

Colors.append('orange')if

m=='largeDoses':

Colors.append('red')

繪制兩兩特征之間的散點(diǎn)圖

plt.rcParams['font.sans-serif']=['Simhei'] 圖中字體設(shè)置為黑體

pl=plt.figure(figsize=(12,8))

fig1=pl.add_subplot(221)

plt.scatter(datingTest.iloc[:,1],datingTest.iloc[:,2],marker='.',c=Colors)

plt.xlabel('玩游戲視頻所占時(shí)間比')

plt.ylabel('每周消費(fèi)冰淇淋公升數(shù)')

fig2=pl.add_subplot(222)

plt.scatter(datingTest.iloc[:,0],datingTest.iloc[:,1],marker='.',c=Colors)

plt.xlabel('每年飛行彻匦保客里程')

plt.ylabel('玩游戲視頻所占時(shí)間比')

fig3=pl.add_subplot(223)

plt.scatter(datingTest.iloc[:,0],datingTest.iloc[:,2],marker='.',c=Colors)

plt.xlabel('每年飛行常客里程')

plt.ylabel('每周消費(fèi)冰淇淋公升數(shù)')

plt.show()

數(shù)據(jù)歸一化

下表是提取的4條樣本數(shù)據(jù)铺浇,如果我們想要計(jì)算樣本1和樣本2之間的距離痢畜,可以使用歐幾里得計(jì)算公式:

我們很容易發(fā)現(xiàn),上面公式中差值最大的屬性對(duì)計(jì)算結(jié)果的影響最大鳍侣,也就是說(shuō)每年飛行扯∠。客里程對(duì)計(jì)算結(jié)果的影響遠(yuǎn)遠(yuǎn)大于其他兩個(gè)特征,原因僅僅是因?yàn)樗臄?shù)值比較大倚聚,但是在海倫看來(lái)這三個(gè)特征是同等重要的线衫,所以接下來(lái)我們要進(jìn)行數(shù)值歸一化的處理,使得這三個(gè)特征的權(quán)重相等惑折。

數(shù)據(jù)歸一化的處理方法有很多種授账,比如0-1標(biāo)準(zhǔn)化、Z-score標(biāo)準(zhǔn)化惨驶、Sigmoid壓縮法等等白热,在這里我們使用最簡(jiǎn)單的0-1標(biāo)準(zhǔn)化,公式如下:

"""

函數(shù)功能:歸一化

參數(shù)說(shuō)明:

dataSet:原始數(shù)據(jù)集

返回:0-1標(biāo)準(zhǔn)化之后的數(shù)據(jù)集

"""

def

minmax(dataSet):

minDf = dataSet.min()maxDf = dataSet.max()normSet = (dataSet - minDf )/(maxDf - minDf)return

normSet

將我們的數(shù)據(jù)集帶入函數(shù)敞咧,進(jìn)行歸一化處理

datingT = pd.concat([minmax(datingTest.iloc[:, :3]), datingTest.iloc[:,3]], axis=1)

datingT.head()

劃分訓(xùn)練集和測(cè)試集

前面概述部分我們有提到棘捣,為了測(cè)試分類器的效果辜腺,我們可以把原始數(shù)據(jù)集分為訓(xùn)練集和測(cè)試集兩部分休建,訓(xùn)練集用來(lái)訓(xùn)練模型,測(cè)試集用來(lái)驗(yàn)證模型準(zhǔn)確率评疗。

關(guān)于訓(xùn)練集和測(cè)試集的切分函數(shù)测砂,網(wǎng)上一搜一大堆,Scikit Learn官網(wǎng)上也有相應(yīng)的函數(shù)比如modelselection 類中的train

test_split 函數(shù)也可以完成訓(xùn)練集和測(cè)試集的切分百匆。

通常來(lái)說(shuō)砌些,我們只提供已有數(shù)據(jù)的90%作為訓(xùn)練樣本來(lái)訓(xùn)練模型,其余10%的數(shù)據(jù)用來(lái)測(cè)試模型加匈。這里需要注意的10%的測(cè)試數(shù)據(jù)一定要是隨機(jī)選擇出來(lái)的存璃,由于海倫提供的數(shù)據(jù)并沒有按照特定的目的來(lái)排序,所以我們這里可以隨意選擇10%的數(shù)據(jù)而不影響其隨機(jī)性雕拼。

"""

函數(shù)功能:切分訓(xùn)練集和測(cè)試集

參數(shù)說(shuō)明:

dataSet:原始數(shù)據(jù)集

rate:訓(xùn)練集所占比例

返回:切分好的訓(xùn)練集和測(cè)試集

"""

def

randSplit(dataSet,rate=0.9):

n=dataSet.shape[0]m=int(n*rate)train=dataSet.iloc[:m,:]test=dataSet.iloc[m:,:]test.index=range(test.shape[0])return

train,test

train,test = randSplit(datingT)

train

test

分類器針對(duì)于約會(huì)網(wǎng)站的測(cè)試代碼

接下來(lái)纵东,我們一起來(lái)構(gòu)建針對(duì)于這個(gè)約會(huì)網(wǎng)站數(shù)據(jù)的分類器,上面我們已經(jīng)將原始數(shù)據(jù)集進(jìn)行歸一化處理然后也切分了訓(xùn)練集和測(cè)試集啥寇,所以我們的函數(shù)的輸入?yún)?shù)就可以是train偎球、test和k(k-近鄰算法的參數(shù)洒扎,也就是選擇的距離最小的k個(gè)點(diǎn))。

"""

函數(shù)功能:k-近鄰算法分類器

參數(shù)說(shuō)明:

train:訓(xùn)練集

test:測(cè)試集

k:k-近鄰參數(shù)衰絮,即選擇距離最小的k個(gè)點(diǎn)

返回:預(yù)測(cè)好分類的測(cè)試集

"""

def

datingClass(train,test,k):

n = train.shape[1] - 1? ? ? ? ? ? ? ? ? m = test.shape[0]? ? ? ? ? ? ? ? ? ? ? ? result = []? ? ? ? ? ? ? ? ? ? for

i in range(m):

dist = list((((train.iloc[:, :n] - test.iloc[i, :n]) 2).sum(1))0.5)? ? dist_l = pd.DataFrame({'dist': dist, 'labels': (train.iloc[:, n])})? ? dr = dist_l.sort_values(by = 'dist')[: k]? ? re = dr.loc[:, 'labels'].value_counts()? ? result.append(re.index[0])result = pd.Series(result)test['predict'] = resultacc = (test.iloc[:,-1]==test.iloc[:,-2]).mean()print(f'模型預(yù)測(cè)準(zhǔn)確率為{acc}')return

test

最后袍冷,測(cè)試上述代碼能否正常運(yùn)行,使用上面生成的測(cè)試集和訓(xùn)練集來(lái)導(dǎo)入分類器函數(shù)之中猫牡,然后執(zhí)行并查看分類結(jié)果胡诗。

datingClass(train,test,5)

從結(jié)果可以看出,我們模型的準(zhǔn)確率還不錯(cuò)淌友,這是一個(gè)不錯(cuò)的結(jié)果了乃戈。

四、算法總結(jié)

image

優(yōu)點(diǎn)

簡(jiǎn)單好用亩进,容易理解症虑,精度高,理論成熟归薛,既可以用來(lái)做分類也可以用來(lái)做回歸

可用于數(shù)值型數(shù)據(jù)和離散型數(shù)據(jù)

無(wú)數(shù)據(jù)輸入假定

適合對(duì)稀有事件進(jìn)行分類

計(jì)算復(fù)雜性高谍憔;空間復(fù)雜性高;

計(jì)算量太大主籍,所以一般數(shù)值很大的時(shí)候不用這個(gè)习贫,但是單個(gè)樣本又不能太少,否則容易發(fā)生誤分千元。

樣本不平衡問(wèn)題(即有些類別的樣本數(shù)量很多苫昌,而其它樣本的數(shù)量很少)

缺點(diǎn)

可理解性比較差,無(wú)法給出數(shù)據(jù)的內(nèi)在含義

作者:CDA數(shù)據(jù)分析師培訓(xùn)

鏈接:http://www.reibang.com/p/5f623766ea1d

來(lái)源:簡(jiǎn)書

著作權(quán)歸作者所有幸海。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)祟身,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末物独,一起剝皮案震驚了整個(gè)濱河市袜硫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挡篓,老刑警劉巖婉陷,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異官研,居然都是意外死亡秽澳,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門戏羽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)担神,“玉大人,你說(shuō)我怎么就攤上這事蛛壳⌒诱埃” “怎么了所刀?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)捞挥。 經(jīng)常有香客問(wèn)我浮创,道長(zhǎng),這世上最難降的妖魔是什么砌函? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任斩披,我火速辦了婚禮,結(jié)果婚禮上讹俊,老公的妹妹穿的比我還像新娘垦沉。我一直安慰自己,他們只是感情好仍劈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布厕倍。 她就那樣靜靜地躺著,像睡著了一般贩疙。 火紅的嫁衣襯著肌膚如雪讹弯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天这溅,我揣著相機(jī)與錄音组民,去河邊找鬼。 笑死悲靴,一個(gè)胖子當(dāng)著我的面吹牛臭胜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播癞尚,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼耸三,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了否纬?” 一聲冷哼從身側(cè)響起吕晌,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蛋褥,失蹤者是張志新(化名)和其女友劉穎临燃,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烙心,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膜廊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淫茵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爪瓜。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖匙瘪,靈堂內(nèi)的尸體忽然破棺而出铆铆,到底是詐尸還是另有隱情蝶缀,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布薄货,位于F島的核電站翁都,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谅猾。R本人自食惡果不足惜柄慰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望税娜。 院中可真熱鬧坐搔,春花似錦、人聲如沸敬矩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)弧岳。三九已至占锯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缩筛,已是汗流浹背消略。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞎抛,地道東北人艺演。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像桐臊,于是被迫代替她去往敵國(guó)和親胎撤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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