原理
KNN算法,又叫K近邻算法。就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类,其算法的描述为:
- 1)计算测试数据与各个训练数据之间的距离;
- 2)按照距离的递增关系进行排序;
- 3)选取距离最小的K个点;
- 4)确定前K个点所在类别的出现频率;
- 5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。
三要素:
- k值的选择
- 距离的度量(常见的距离度量有欧式距离,曼哈顿距离等)
- 分类决策规则 (多数表决规则)
k值的选择
- k值越小表明模型越复杂,更加容易过拟合
- 但是k值越大,模型越简单,如果k=N的时候就表明无论什么点都是训练集中类别最多的那个类
所以一般k会取一个较小的值,然后用过交叉验证来确定
这里所谓的交叉验证就是将样本划分一部分出来为预测样本,比如95%训练,5%预测,然后k分别取1,2,3,4,5之类的,进行预测,计算最后的分类误差,选择误差最小的k
KNN的回归
在找到最近的k个实例之后,可以计算这k个实例的平均值作为预测值。或者还可以给这k个实例添加一个权重再求平均值,这个权重与度量距离成反比(越近权重越大)。
优缺点:
KNN算法的优点:
- 思想简单,理论成熟,既可以用来做分类也可以用来做回归;
- 可用于非线性分类;
- 训练时间复杂度为O(n);
- 准确度高,对数据没有假设,对outlier不敏感;
缺点:
- 计算量大;
- 样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);
- 需要大量的内存;