从零开始的AI·吃透kNN算法,学完我悟了(附实例代码)
從零開始的AI系列
- 從零開始的AI·機器學(xué)習(xí)の基本概念
- 從零開始的AI·決策樹原來這么好理解(附實例代碼)
- 從零開始的AI·樸素貝葉斯?拿來吧你(附實例代碼)
文章目錄
- 從零開始的AI系列
- 前言
- 一、權(quán)衡利弊
- 二、整體感知
- 圖解kNN
- 具體實例的應(yīng)用
- 三、具體實現(xiàn)過程及細節(jié)
- 1. 數(shù)據(jù)的讀取
- 2. K值的選擇
- 3. 距離的計算
- 4. 數(shù)據(jù)的處理
- 5. 測試
- 四、封裝函數(shù)的使用
前言
本文理論部分基于Peter Harrington的《機器學(xué)習(xí)實戰(zhàn)》一書
kNN(k- Nearest Neighbor)即k-近鄰算法,最初由 Cover和Hart于1968年提出,是一個理論上比較成熟的方法,也是最簡單的機器學(xué)習(xí)算法之一。該方法的思路非常簡單直觀:如果一個樣本在特征空間中的K個最相似(即特征空間中最鄰近)的樣本中的大多數(shù)屬于某一個類別,則該樣本也屬于這個類別。該方法在定類決策上只依據(jù)最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。
如果覺得AI學(xué)習(xí)枯燥,可以選擇看一下這個老哥做的網(wǎng)站,趣味性直接拉滿>>人工智能教程
一、權(quán)衡利弊
- 優(yōu)點:精度高、對異常值不敏感、無數(shù)據(jù)輸入假定。
- 缺點:計算復(fù)雜度高、空間復(fù)雜度高。
- 適用數(shù)據(jù)范圍:數(shù)值型和標稱型。
- 應(yīng)用:分類,回歸
二、整體感知
圖解kNN
在上圖中,五角星和方塊分別代表不同特征的數(shù)據(jù),問號 是需要我們預(yù)測的數(shù)據(jù)。現(xiàn)我們假設(shè) k=5,即以距離問號最近5個數(shù)據(jù)的特征來確定該問號的特征。由此可知,問號①被預(yù)測為五角星,問號②被預(yù)測為方塊。但是,當數(shù)據(jù)足夠復(fù)雜時,k的值稍有變化,結(jié)果就可能不同,因此k的取值顯得尤為重要。
具體實例的應(yīng)用
電影可以按照題材分類,同一題材的電影具有一些公共特征。那么動作片具有哪些共有特征,使得動作片之間非常類似,而與愛情片存在著明顯的差別呢?動作片中也會存在接吻鏡頭,愛情片中也會存在打斗場景,我們不能單純依靠是否存在打斗或者親吻來判斷影片的類型。但是愛情片中的親吻鏡頭更多,動作片中的打斗場景也更頻繁,基于此類場景在某部電影中出現(xiàn)的次數(shù)可以用來進行電影分類。基于電影中出現(xiàn)的親吻、打斗出現(xiàn)的次數(shù),使用k-近鄰算法構(gòu)造程序,我們就可以實現(xiàn)自動劃分電影的題材類型。
由上圖可計算出距離
根據(jù)幾個距離最小的已知電影,我們可以預(yù)測出,未知電影為愛情片
三、具體實現(xiàn)過程及細節(jié)
1. 數(shù)據(jù)的讀取
對數(shù)據(jù)進行讀取,并隨機分為三類:訓(xùn)練集,驗證集,測試集
with open('iris.csv','r') as file: ##打開文件'iris.csv',并命名為 filereader = csv.DictReader(file) datas = [row for row in reader] random.shuffle(datas) n = len(datas)//3 test_set = datas[0:n] train_set = datas[n:]2. K值的選擇
- 取值方式:從選取一個較小的K值開始,不斷增加K值
- 驗證方式:交叉驗證(將數(shù)據(jù)按照一定比例分出訓(xùn)練組和測試組,用測試組驗證訓(xùn)練組得出的模型) 原理+方法
3. 距離的計算
-
閔可夫斯基距離
-
歐氏距離
-
曼哈頓距離
4. 數(shù)據(jù)的處理
'''(1)對距離排序—升序'''res = sorted(res, key = lambdaitem:item['distance'])# '''(2)取前K個'''res2 = res[0:K] '''(3)加權(quán)平均(距離近的比重大)'''result = {'0': 0, '1':0, '2': 0}sum = 0for r in res2: sum+= r['distance']for r in res2: result[r['result']] += 1 - r['distance']/sum resulutCount1= sorted(result.items(),key=operator.itemgetter(1), reverse=True)return (resulutCount1[0][0])5. 測試
利用測試集進行測試對比
correct = 0 for test in test_set: result = test['virginica']result2 = knn(test)if result == result2:correct+=1print("正確率:{:.2f}%".format(100*correct/len(test_set)))四、封裝函數(shù)的使用
- 分類:neighbors.KNeighborsClassifier
- 預(yù)測:neighbors.KNeighborsRegressor
總結(jié)
以上是生活随笔為你收集整理的从零开始的AI·吃透kNN算法,学完我悟了(附实例代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 想写游戏吗?手把手教你SDL的安装及配置
- 下一篇: 从零开始的AI·朴素贝叶斯?拿来吧你(附