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機器學習》
