K-近邻算法详解-1

泪湿孤枕 提交于 2020-01-30 07:08:53

K-近邻算法(k-neareast neighbor,kNN)
————(解决分类和回归问题的最基本算法之一)

核心思想:给定测试样本,基于某种距离度量找出训练集中与其最近的k个训练样本,然后基于这k个“邻居”信息进行测试集的预测。

下面分为3点和大家了解这个算法:

1.距离度量
如上述核心思想所述,我们需要找到测试集与其最近的k个数据之间的距离信息,然而距离的度量有很多种,下面给出几个常用的距离度量。

1.欧氏距离

2.曼哈顿距离

3.闵可夫斯基距离

2.K值的选择
选择K个与待测样本最近的样本,并认为K个已知样本中出现次数最多的类别即为待测样本的类别。

但是K值的大小的不同,待测样本的类别也会不同。如下图所示:

判断上图中长方形的类别,当K=3时,长方形的类别为三角形,当K=7时,长方形的类别为圆形。

K值越小,就意味着选择较小的领域的数据来判断待测数据的类别,换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合。
K值越大,说明选择较大的领域的数据来判断待测数据的类别,K值越大,模型越简单

在应用中,K值一般选择一个较小的数值,采用交叉验证来选择最优的K值

3.分类决策规则
看待测样本的近邻那个类别的点最多,那么待测样本就属于哪个类别,也就是多数表决,也可以是加权投票,距离最近的样本的权重多一点,距离远的样本的权重小一点,通过加权投票最后判断待测样本属于哪个类别。

当属于回归问题时,待测样本的数值就是离待测样本最近的K个样本的数值的平均或者加权平均

4.相关代码
以鸢尾花数据集为例,结合sklearn,代码如下:

from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
iris = datasets.load_iris() 
X = iris.data
Y = iris.target#数据集的标签
X_train,X_test,Y_tesin,Y_test = train_test_split(X,Y,test_size=0.3)#划分训练集,测试集
knn = KNeighborsClassifier()#括号内可填KNN的相关参数
knn.fit(X_train,Y_train)#模型训练
print(knn.predict(X_test))#预测测试集类别
print(knn.score(X_test,Y_test)#预测准确率

5.算法优缺点
优点:
1.算法实现简单
2.无需提前训练模型
3.对异常值不敏感

缺点:
1.训练集过大时预测速度很慢(计算复杂度高)
2.预测时须保留训练数据集(空间复杂度高)
3.无法给出数据的基础结构信息

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!