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

浙公网安备 33010602011771号