日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > ChatGpt >内容正文

ChatGpt

从零开始的AI·吃透kNN算法,学完我悟了(附实例代码)

發(fā)布時(shí)間:2025/4/5 ChatGpt 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从零开始的AI·吃透kNN算法,学完我悟了(附实例代码) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

從零開始的AI系列

  • 從零開始的AI·機(jī)器學(xué)習(xí)の基本概念
  • 從零開始的AI·決策樹原來這么好理解(附實(shí)例代碼)
  • 從零開始的AI·樸素貝葉斯?拿來吧你(附實(shí)例代碼)

文章目錄

  • 從零開始的AI系列
  • 前言
  • 一、權(quán)衡利弊
  • 二、整體感知
    • 圖解kNN
    • 具體實(shí)例的應(yīng)用
  • 三、具體實(shí)現(xiàn)過程及細(xì)節(jié)
    • 1. 數(shù)據(jù)的讀取
    • 2. K值的選擇
    • 3. 距離的計(jì)算
    • 4. 數(shù)據(jù)的處理
    • 5. 測試
  • 四、封裝函數(shù)的使用


前言

本文理論部分基于Peter Harrington的《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》一書

kNN(k- Nearest Neighbor)即k-近鄰算法,最初由 Cover和Hart于1968年提出,是一個(gè)理論上比較成熟的方法,也是最簡單的機(jī)器學(xué)習(xí)算法之一。該方法的思路非常簡單直觀:如果一個(gè)樣本在特征空間中的K個(gè)最相似(即特征空間中最鄰近)的樣本中的大多數(shù)屬于某一個(gè)類別,則該樣本也屬于這個(gè)類別。該方法在定類決策上只依據(jù)最鄰近的一個(gè)或者幾個(gè)樣本的類別來決定待分樣本所屬的類別。

如果覺得AI學(xué)習(xí)枯燥,可以選擇看一下這個(gè)老哥做的網(wǎng)站,趣味性直接拉滿>>人工智能教程


一、權(quán)衡利弊

  • 優(yōu)點(diǎn):精度高、對異常值不敏感、無數(shù)據(jù)輸入假定。
  • 缺點(diǎn):計(jì)算復(fù)雜度高、空間復(fù)雜度高。
  • 適用數(shù)據(jù)范圍:數(shù)值型和標(biāo)稱型。
  • 應(yīng)用:分類回歸

二、整體感知

圖解kNN


在上圖中,五角星方塊分別代表不同特征的數(shù)據(jù),問號 是需要我們預(yù)測的數(shù)據(jù)。現(xiàn)我們假設(shè) k=5,即以距離問號最近5個(gè)數(shù)據(jù)的特征來確定該問號的特征。由此可知,問號①被預(yù)測為五角星,問號②被預(yù)測為方塊。但是,當(dāng)數(shù)據(jù)足夠復(fù)雜時(shí),k的值稍有變化,結(jié)果就可能不同,因此k的取值顯得尤為重要。

具體實(shí)例的應(yīng)用

電影可以按照題材分類,同一題材的電影具有一些公共特征。那么動(dòng)作片具有哪些共有特征,使得動(dòng)作片之間非常類似,而與愛情片存在著明顯的差別呢?動(dòng)作片中也會(huì)存在接吻鏡頭,愛情片中也會(huì)存在打斗場景,我們不能單純依靠是否存在打斗或者親吻來判斷影片的類型。但是愛情片中的親吻鏡頭更多動(dòng)作片中的打斗場景也更頻繁,基于此類場景在某部電影中出現(xiàn)的次數(shù)可以用來進(jìn)行電影分類。基于電影中出現(xiàn)的親吻、打斗出現(xiàn)的次數(shù),使用k-近鄰算法構(gòu)造程序,我們就可以實(shí)現(xiàn)自動(dòng)劃分電影的題材類型。



由上圖可計(jì)算出距離

根據(jù)幾個(gè)距離最小的已知電影,我們可以預(yù)測出,未知電影為愛情片

三、具體實(shí)現(xiàn)過程及細(xì)節(jié)

1. 數(shù)據(jù)的讀取

對數(shù)據(jù)進(jìn)行讀取,并隨機(jī)分為三類:訓(xùn)練集,驗(yà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值的選擇

  • 取值方式:從選取一個(gè)較小的K值開始,不斷增加K值
  • 驗(yàn)證方式:交叉驗(yàn)證(將數(shù)據(jù)按照一定比例分出訓(xùn)練組和測試組,用測試組驗(yàn)證訓(xùn)練組得出的模型) 原理+方法

3. 距離的計(jì)算

  • 閔可夫斯基距離

  • 歐氏距離

  • 曼哈頓距離

'''此處為歐式距離公式''' def distance(d1, d2):res = 0feature = ("150","4","setosa","versicolor")for key in (feature):res += (float(d1[key])-float(d2[key]))**2return res**0.5

4. 數(shù)據(jù)的處理

'''(1)對距離排序—升序'''res = sorted(res, key = lambdaitem:item['distance'])# '''(2)取前K個(gè)'''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. 測試

利用測試集進(jìn)行測試對比

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
neighbors.KNeighborsClassifier(n_neighbors=5, weights='uniform',p=2, metric='minkowski',) n_neighbors:用于指定近鄰樣本個(gè)數(shù)K,默認(rèn)為5 weights:用于指定近鄰樣本的投票權(quán)重,默認(rèn)為'uniform',表示所有近鄰樣本的投票權(quán)重一樣;如果為'distance',則表示投票權(quán)重與距離成反比,即近鄰樣本與未知類別的樣本點(diǎn)距離越遠(yuǎn),權(quán)重越小,反之,權(quán)重越大 metric:用于指定距離的度量指標(biāo),默認(rèn)為閔可夫斯基距離 p:當(dāng)參數(shù)metric為閔可夫斯基距離時(shí),p=1,表示計(jì)算點(diǎn)之間的曼哈頓距離;p=2,表示計(jì)算點(diǎn)之間的歐氏距離;該參數(shù)的默認(rèn)值為2 #適用于最新版本python,復(fù)制就可以跑的代碼!!! #原理代碼 import csv import random #讀取 with open('train.csv','r') as file:reader=csv.DictReader(file)datas=[row for row in reader]#分組 random.shuffle(datas) n=len(datas)//10test_set=datas[0:8*n] train_set=datas[8*n:]#KNN #距離 def distance(d1,d2):res=0for key in ("radius","texture"):res+=(float(d1[key])-float(d2[key]))**2return res**0.5K=1 def knn(data): #1.距離res=[{"result":train['diagnosis_result'],"distance":distance(data,train)}for train in train_set]#2.排序--升序res=sorted(res, key=lambda item:item['distance'])#3.取前K個(gè)res2=res[0:K]#4.加權(quán)平均result={'0':0,'1':0} #總距離sum=0for r in res2:sum+=r['distance']for r in res2:result[r['result']]+=1-r['distance']/sumif result['0']>result['1']:return '0'else:return'1' #測試階段 correct=0 for test in test_set:result=test['diagnosis_result']result2=knn(test)if result==result2:correct+=1print('準(zhǔn)確率{:.2f}%'.format(100*correct/len(test_set))) knn(test_set[0] #實(shí)際應(yīng)用代碼 import csv import pandas as pd from sklearn import model_selection from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_split from sklearn import neighbors#讀取并處理數(shù)據(jù) data=pd.read_csv('train.csv') predictors=data.columns[:-1] X_train, X_test, Y_train, Y_test =model_selection.train_test_split(data[predictors],data.diagnosis_result,test_size=0.25,random_state=1234)#knn算法 knn = KNeighborsClassifier(n_neighbors=1)# 評估模型的準(zhǔn)確率 knn.fit(X_train, Y_train) print("預(yù)測的準(zhǔn)確率為:", knn.score(X_test, Y_test))

總結(jié)

以上是生活随笔為你收集整理的从零开始的AI·吃透kNN算法,学完我悟了(附实例代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。