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.无法给出数据的基础结构信息