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机器学习》