需要源碼和數(shù)據(jù)集請點贊關(guān)注收藏后評論區(qū)留言私信~~~
KNN算法簡介
KNN(K-Nearest Neighbor)算法是機器學(xué)習(xí)算法中最基礎(chǔ)、最簡單的算法之一。它既能用于分類,也能用于回歸。KNN通過測量不同特征值之間的距離來進(jìn)行分類。
KNN算法的思想非常簡單:對于任意n維輸入向量,分別對應(yīng)于特征空間中的一個點,輸出為該特征向量所對應(yīng)的類別標(biāo)簽或預(yù)測值。
KNN算法是一種非常特別的機器學(xué)習(xí)算法,因為它沒有一般意義上的學(xué)習(xí)過程。它的工作原理是利用訓(xùn)練數(shù)據(jù)對特征向量空間進(jìn)行劃分,并將劃分結(jié)果作為最終算法模型。存在一個樣本數(shù)據(jù)集合,也稱作訓(xùn)練樣本集,并且樣本集中的每個數(shù)據(jù)都存在標(biāo)簽,即我們知道樣本集中每一數(shù)據(jù)與所屬分類的對應(yīng)關(guān)系。
輸入沒有標(biāo)簽的數(shù)據(jù)后,將這個沒有標(biāo)簽的數(shù)據(jù)的每個特征與樣本集中的數(shù)據(jù)對應(yīng)的特征進(jìn)行比較,然后提取樣本中特征最相近的數(shù)據(jù)(最近鄰)的分類標(biāo)簽。
一般而言,我們只選擇樣本數(shù)據(jù)集中前k個最相似的數(shù)據(jù),這就是KNN算法中K的由來,通常k是不大于20的整數(shù)。最后,選擇k個最相似數(shù)據(jù)中出現(xiàn)次數(shù)最多的類別,作為新數(shù)據(jù)的分類。
KNN分類算法的分類預(yù)測過程十分簡單并容易理解:對于一個需要預(yù)測的輸入向量x,我們只需要在訓(xùn)練數(shù)據(jù)集中尋找k個與向量x最近的向量的集合,然后把x的類別預(yù)測為這k個樣本中類別數(shù)最多的那一類。
KNN算法中只有一個超參數(shù)k,k值的確定對KNN算法的預(yù)測結(jié)果有著至關(guān)重要的影響。接下來,我們討論一下k值大小對算法結(jié)果的影響以及一般情況下如何選擇k值。
如果k值比較小,相當(dāng)于我們在較小的領(lǐng)域內(nèi)訓(xùn)練樣本對實例進(jìn)行預(yù)測。這時,算法的近似誤差(Approximate Error)會比較小,因為只有與輸入實例相近的訓(xùn)練樣本才會對預(yù)測結(jié)果起作用。
但是,它也有明顯的缺點:算法的估計誤差比較大,預(yù)測結(jié)果會對近鄰點十分敏感,也就是說,如果近鄰點是噪聲點的話,預(yù)測就會出錯。因此,k值過小容易導(dǎo)致KNN算法的過擬合。
同理,如果k值選擇較大的話,距離較遠(yuǎn)的訓(xùn)練樣本也能夠?qū)嵗A(yù)測結(jié)果產(chǎn)生影響。這時候,模型相對比較魯棒,不會因為個別噪聲點對最終預(yù)測結(jié)果產(chǎn)生影響。但是缺點也十分明顯:算法的近鄰誤差會偏大,距離較遠(yuǎn)的點(與預(yù)測實例不相似)也會同樣對預(yù)測結(jié)果產(chǎn)生影響,使得預(yù)測結(jié)果產(chǎn)生較大偏差,此時模型容易發(fā)生欠擬合。
因此,在實際工程實踐中,我們一般采用交叉驗證的方式選取k值。通過以上分析可知,一般k值選得比較小,我們會在較小范圍內(nèi)選取k值,同時把測試集上準(zhǔn)確率最高的那個確定為最終的算法超參數(shù)k。
使用KNN進(jìn)行水果分類
部分?jǐn)?shù)據(jù)如下
預(yù)測結(jié)果和精確度如下
?
部分代碼如下
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
import pandas as pd
#導(dǎo)入水果數(shù)據(jù)并查看數(shù)據(jù)特征
fruit = pd.read_csv('fruit_data.txt','\t')
# 獲取屬性
X = fruit.iloc[:,1:]
# 獲取類別
Y = fruit.iloc[:,0].T
# 劃分成測試集和訓(xùn)練集
fruit_train_X,fruit_test_X,fruit_train_y,fruit_test_y=train_test_split(X,Y,test_size=0.2, random_state=0)
#分類eighborsClassifier()
#對訓(xùn)練集進(jìn)行訓(xùn)練
knn.fit(fruit_train_X, fruit_train_y)
#對測試集數(shù)據(jù)的水果類型進(jìn)行預(yù)測
predict_result = knn.predict(fruit_test_X)
print('測試集大?。?,fruit_test_X.shape)
print('真實結(jié)果:',fruit_test_y)
print('預(yù)it_test_y))
?繪制KNN分類器圖
分類結(jié)果如下 可以看到鳶尾花數(shù)據(jù)集大致分為三類
?部分代碼如下文章來源:http://www.zghlxwxcb.cn/news/detail-429775.html
import numpy as np
from sklearn import neighbors, datasets
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
# 建立KNN模型,使用前兩個特征
iris = datasets.load_iris()
irisData = iris.data[:, :2] # Petal length、Petal width特征
irisTarget = iris.target
clf = neors.KNeighborsClassifier(5) # K=5
clf.fit(irisData, irisTarget)
#繪制plot
ColorMp = ListedColormap(['#005500', '#00AA00', '#00FF00'])
X_min, X_max = irisData[:, 0].min(), irisData[:, 0].max()
Y_min
label = clf.predict(np.c_[X.ravel(), Y.ravel()])
label = label.reshape(X.shape)
#繪圖并顯示
plt.figure()
plt.pcolormesh(X,Y,label,cmap=ColorMp)
plt.show()
創(chuàng)作不易 覺得有幫助請點贊關(guān)注收藏~~~文章來源地址http://www.zghlxwxcb.cn/news/detail-429775.html
到了這里,關(guān)于【Python機器學(xué)習(xí)】KNN進(jìn)行水果分類和分類器實戰(zhàn)(附源碼和數(shù)據(jù)集)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!