K最近鄰算法


K最近鄰算法原理:在數據集里,新數據點離誰最近,就和誰屬於同一類

K最近鄰算法的用法:可以用於分類與回歸

K最近鄰算法在分類任務中的應用:

#導入數據集生成工具
from sklearn.datasets import make_blobs
#導入畫圖工具
import matplotlib.pyplot as plt
#導入KNN分類器
from sklearn.neighbors import KNeighborsClassifier
#生成數據集為1的數據集
data = make_blobs(n_samples=200,centers=2,random_state=8)
X,y = data
#繪制數據可視化
plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.spring,edgecolor='k')
#顯示圖像
plt.show()

分類新數據點

#導入numpy
import numpy as np
clf = KNeighborsClassifier()
clf.fit(X,y)

#下面的代碼用於畫圖
x_min,x_max = X[:,0].min()-1,X[:,0].max()+1
y_min,y_max = X[:,1].min()-1,X[:,1].max()+1
#用不同的背景色表示不同的分類
xx,yy = np.meshgrid(np.arange(x_min,x_max,.02),np.arange(y_min,y_max,.02))
Z = clf.predict(np.c_[(xx.ravel(),yy.ravel())]).reshape(xx.shape)
Z = Z.reshape(xx.shape)

plt.pcolormesh(xx,yy,Z,cmap=plt.cm.Pastel1)

#############################################################
#把新的數據點用五角星表示出來
plt.scatter(6.75,4.82,marker='*',c='red',s=200)
#############################################################

plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.spring,edgecolor='k')
plt.xlim(xx.min(),xx.max())
plt.ylim(yy.min(),yy.max())
plt.title("Classifier:KNN")
#現實圖片
plt.show()

判斷

#對數據點分裂進行判斷
print('\n\n\n')
print('代碼運行結果:')
print('====================================')
print('新數據點的分類是:',clf.predict([[6.75,4.82]]))
print('====================================')
print('\n\n\n')

 

K最近鄰算法處理多元分類任務

#生成數據集為1的數據集
data2 = make_blobs(n_samples=500,centers=5,random_state=8)
X2,y2 = data2
#繪制數據可視化
plt.scatter(X2[:,0],X2[:,1],c=y2,cmap=plt.cm.spring,edgecolor='k')
#顯示圖像
plt.show()

擬合數據:

clf = KNeighborsClassifier()
clf.fit(X2,y2)

#下面的代碼用於畫圖
x_min,x_max = X2[:,0].min()-1,X2[:,0].max()+1
y_min,y_max = X2[:,1].min()-1,X2[:,1].max()+1
#用不同的背景色表示不同的分類
xx,yy = np.meshgrid(np.arange(x_min,x_max,.02),np.arange(y_min,y_max,.02))
Z = clf.predict(np.c_[(xx.ravel(),yy.ravel())]).reshape(xx.shape)
Z = Z.reshape(xx.shape)
plt.pcolormesh(xx,yy,Z,cmap=plt.cm.Pastel1)
plt.scatter(X2[:,0],X2[:,1],c=y2,cmap=plt.cm.spring,edgecolor='k')
plt.xlim(xx.min(),xx.max())
plt.ylim(yy.min(),yy.max())
plt.title("Classifier:KNN")
#現實圖片
plt.show()

評分: 0.96分

#對模型進行評分
print('\n\n\n')
print('代碼運行結果:')
print('====================================')
print('模型正確率:{:.2f}'.format(clf.score(X2,y2)))
print('====================================')
print('\n\n\n')

 

K最近鄰算法用於回歸分析

#導入make_regression數據集生成器
from sklearn.datasets import make_regression
#生成特征為1,噪音為50的數據集
X,y = make_regression(n_features=1,n_informative=1,noise=50,random_state=8)
#用散點圖將數據點進行可視化
plt.scatter(X,y,c='orange',edgecolor='k')
plt.show()

回歸分析:

#導入用於回歸分析的KNN模型
from sklearn.neighbors import KNeighborsRegressor
reg = KNeighborsRegressor()
#用KNN模型擬合數據
reg.fit(X,y)
#把預測結果用圖像進行可視化
z = np.linspace(-3,3,200).reshape(-1,1)
plt.scatter(X,y,c='orange',edgecolor='k')
plt.plot(z,reg.predict(z),c='k',linewidth=3)
#向圖像中添加標題
plt.title('KNN Regressor')
plt.show()

評分:0.77

#對模型進行評分
print('\n\n\n')
print('代碼運行結果:')
print('====================================')
print('模型正確率:{:.2f}'.format(reg.score(X,y)))
print('====================================')
print('\n\n\n')

減少模型的n_neighbors參數為2

#導入用於回歸分析的KNN模型
from sklearn.neighbors import KNeighborsRegressor
#減少模型的n_neighbors參數為2
reg2 = KNeighborsRegressor(n_neighbors=2)
#用KNN模型擬合數據
reg2.fit(X,y)
#把預測結果用圖像進行可視化
plt.scatter(X,y,c='orange',edgecolor='k')
plt.plot(z,reg2.predict(z),c='k',linewidth=3)
#向圖像中添加標題
plt.title('KNN Regressor: n_neighbors=2')
plt.show()

評分: 0.86

#對模型進行評分
print('\n\n\n')
print('代碼運行結果:')
print('====================================')
print('模型正確率:{:.2f}'.format(reg2.score(X,y)))
print('====================================')
print('\n\n\n')

 

總結:

K近鄰是一個經典且容易理解的算法,不過在實際使用中有很多問題:

1.需要對數據集進行預處理

2.對規模超大的數據集擬合時間較長

3.對高維數據集擬合欠佳

4.對稀疏數據集束手無策

所以,在當前應用場景中,K近鄰算法不常用

 

 

文章引自:《深入淺出Python機器學習》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM