6.8.3 數(shù)據(jù)分類實例-鳶尾花分類_第1頁
6.8.3 數(shù)據(jù)分類實例-鳶尾花分類_第2頁
6.8.3 數(shù)據(jù)分類實例-鳶尾花分類_第3頁
6.8.3 數(shù)據(jù)分類實例-鳶尾花分類_第4頁
6.8.3 數(shù)據(jù)分類實例-鳶尾花分類_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第6章Python程序設(shè)計基礎(chǔ)人工智能與計算機應(yīng)用6.8.3數(shù)據(jù)分類實例—鳶尾花分類案例分析不同品種的鳶尾花的花萼和花瓣長度和寬度存在明顯的差異,如下圖表所示。根據(jù)花萼、花瓣的長度和寬度可以將鳶尾花劃分為不同的品種。Setisa(山尾)Virginica(維吉尼亞鳶尾)Versicolour(雜色鳶尾)花萼長度花萼寬度花瓣長度花瓣寬度5.13.51.40.24.93.01.40.24.73.21.30.24.63.11.50.25.03.61.40.25

個鳶尾花樣本的特征數(shù)據(jù)我們使用經(jīng)典的機器學(xué)習(xí)算法——KNN算法通過花萼長度,花萼寬度,花瓣長度,花瓣寬度4個屬性預(yù)測鳶尾花卉屬于Setosa,Versicolour,Virginica三個種類中的哪一類。本次授課內(nèi)容一、使用Python編寫KNN算法對鳶尾花進(jìn)行分類二、使用機器學(xué)習(xí)庫Sklearn對鳶尾花進(jìn)行分類一使用Python編寫KNN算法對鳶尾花進(jìn)行分類1.KNN算法步驟

(1)計算預(yù)測數(shù)據(jù)與訓(xùn)練數(shù)據(jù)之間的距離。(2)將距離進(jìn)行遞增排序。(3)選擇距離最小的前k個數(shù)據(jù)。(4)確定前k個數(shù)據(jù)的類別,及其出現(xiàn)頻率。(5)返回前k個數(shù)據(jù)中頻率最高的類別(預(yù)測結(jié)果)。2.KNN算法的關(guān)鍵問題

KNN算法有兩個關(guān)鍵,分別是距離計算和k值選擇。(1)距離計算。

已知數(shù)據(jù)和測試數(shù)據(jù)的距離有多種度量方式,如歐氏距離、余弦距離、漢明距離、曼哈頓距離等。在KNN算法中常使用的距離計算方式是歐式距離,計算公式為:(2)K值選擇。由于不同的測試數(shù)據(jù)對k值有不同的要求,因此可以通過交叉驗證的方式進(jìn)行最佳k值的驗證。它的核心思想就是把一些可能的k值,逐個嘗試一遍,選出最佳k值。3.具體操作過程

(1)導(dǎo)入程序使用的工具包NumPy、Pandas、Counter

、Matplotlib。importnumpyasnp #導(dǎo)入numpy處理多維數(shù)組importpandasaspd #導(dǎo)入pandas將數(shù)據(jù)轉(zhuǎn)換為數(shù)據(jù)幀形式fromcollectionsimportCounter #從collections包中導(dǎo)入Counter,用于計數(shù)importmatplotlib.pyplotasplt #導(dǎo)入繪圖模塊(2)載入鳶尾花數(shù)據(jù)集。def

Data(): #定義函數(shù),用于加載鳶尾花數(shù)據(jù)集

iris=pd.read_csv('C:/Python實驗/素材/iris.csv') #從本地文件中讀取數(shù)據(jù)

returniris #返回讀取的數(shù)據(jù)(3)劃分?jǐn)?shù)據(jù)集。def

Datasets(iris):#定義函數(shù),用于劃分?jǐn)?shù)據(jù)集。函數(shù)的參數(shù)是鳶尾花數(shù)據(jù)集

index=np.random.permutation(len(iris))#將150個樣本打亂順序

index=index[0:15]#取出前15個樣本數(shù)據(jù)作為測試數(shù)據(jù)集,剩下的135個樣本作為訓(xùn)練集

Test=iris.take(index) #測試數(shù)據(jù)集

Train=iris.drop(index) #訓(xùn)練數(shù)據(jù)集

datasets=[Test,Train] #生成數(shù)據(jù)集

returndatasets #返回劃分后的數(shù)據(jù)集3.具體操作過程(4)KNN算法。def

KNN(Train,Test,GT,k): #定義函數(shù),用于實現(xiàn)KNN算法。

Train_num=Train.shape[0] #獲得訓(xùn)練集個數(shù)

tests=np.tile(Test,(Train_num,1))-Traindistance=(tests**2)**0.5 #計算歐氏距離

result=distance.sum(axis=1) #從小到大排序,返回索引值

results=result.argsort()label=[] #定義空標(biāo)簽

foriin

range(k):label.append(GT[results[i]]) #把結(jié)果添加到標(biāo)簽中

returnlabel #返回標(biāo)簽3.具體操作過程(5)交叉驗證(確定最佳k值)。def

cross_define_K(Train,Test,GT):

#定義函數(shù),用于尋找最佳的k值precision=[]#準(zhǔn)確度

forkin

range(1,50):

#逐個嘗試1到50的所有值true=0

foriinTest:Test1=[i[0],i[1],i[2],i[3]]result=KNN(Train,Test1,GT,k)

#調(diào)用KNN函數(shù)collection=Counter(result)#返回每個標(biāo)簽出現(xiàn)的次數(shù)

result=collection.most_common(1)#返回出現(xiàn)次數(shù)最多的標(biāo)簽

ifresult[0][0]==i[4]:true+=1#計算預(yù)測準(zhǔn)確的個數(shù)

success=true/len(Test)#計算預(yù)測準(zhǔn)確率

precision.append(success)#k1=range(1,50)#plt.rcParams['font.sans-serif']=['SimHei’]#正常顯示中文

#plt.plot(k1,precision,label='line1',color='g',marker='.',markerfacecolor='pink',markersize=9)#plt.xlabel('k')#plt.ylabel('Precision')#plt.title('交叉驗證k值')#plt.legend()#plt.show()#畫圖顯示交叉驗證K的值,如圖所示k=precision.index(max(precision))+1#獲取k的值

print("準(zhǔn)確度precision最大時,k=",k)

#輸出準(zhǔn)確度最大時k的取值

returnk

#返回k的值3.具體操作過程(6)主程序,調(diào)用函數(shù)和輸出結(jié)果if__name__=="__main__": #主程序

iris=Data() #讀取鳶尾花數(shù)據(jù)集

print("\niris數(shù)據(jù)集:")

print(iris) #輸出鳶尾花數(shù)據(jù)集

datasets=Datasets(iris) #對鳶尾花數(shù)據(jù)集進(jìn)行劃分

print("\n測試數(shù)據(jù)集:")

print(datasets[0]) #輸出測試數(shù)據(jù)集

Train=datasets[1].drop(columns=['Species']).values #將訓(xùn)練數(shù)據(jù)集的實際值隱去

GT=datasets[1]['Species'].values #讀取訓(xùn)練數(shù)據(jù)集的實際值

Test=datasets[0].values #讀取測試數(shù)據(jù)集

k=cross_define_K(Train,Test,GT) #調(diào)用交叉驗證結(jié)果

true=0

print("\n預(yù)測結(jié)果:")

foriinTest:Test=[i[0],i[1],i[2],i[3]]result=KNN(Train,Test,GT,k) #調(diào)用KNN算法

collection=Counter(result)result=collection.most_common(1)

print("預(yù)測='"+result[0][0]+"',\t\t實際='"+i[4]+“’”) #輸出預(yù)測值和實際值

ifresult[0][0]==i[4]: #計算預(yù)測準(zhǔn)確的個數(shù)

true+=1success=(true/len(datasets[0]))*100 #計算預(yù)測準(zhǔn)確率

print("\n預(yù)測準(zhǔn)確率:",success,"%") #輸出預(yù)測準(zhǔn)確率二使用機器學(xué)習(xí)庫Sklearn對鳶尾花進(jìn)行分類1.使用Sklearn進(jìn)行機器學(xué)習(xí)的主要步驟

(1)獲取數(shù)據(jù)。fromsklearn.preprocessingimportStandardScaler#導(dǎo)入數(shù)據(jù)處理模塊中的標(biāo)準(zhǔn)化函數(shù)fromsklearnimportdatasets #導(dǎo)入datasets,以便數(shù)據(jù)獲取fromsklearn.model_selectionimporttrain_test_split#導(dǎo)入train_test_split用于劃分?jǐn)?shù)據(jù)fromsklearn.neighborsimportKNeighborsClassifier#導(dǎo)入sklearn中的KNN算法KNeighborsClassifieriris=datasets.load_iris() #加載sklearn庫中的鳶尾花數(shù)據(jù)集(2)數(shù)據(jù)預(yù)處理。#劃分?jǐn)?shù)據(jù)集#將數(shù)據(jù)集劃分為訓(xùn)練數(shù)據(jù)集與測試數(shù)據(jù)集。其中,test_size=0.2表示測試數(shù)據(jù)集占20%x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論