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

posted @ 2019-05-13 16:33  Mr_Wmn  阅读(1131)  评论(0编辑  收藏  举报