一、概述
1. KNN算法介绍
KNN算法又叫做K近邻算法,是众多机器学习算法里面最基础入门的算法。KNN算法是最简单的分类算法之一,同时,它也是最常用的分类算法之一。KNN算法是有监督学习中的分类算法,它看起来和Kmeans相似(Kmeans是无监督学习算法),但却是有本质区别的。
KNN算法基于实例之间的相似性进行分类或回归预测。在KNN算法中,要解决的问题是将新的数据点分配给已知类别中的某一类。该算法的核心思想是通过比较距离来确定最近邻的数据点,然后利用这些邻居的类别信息来决定待分类数据点的类别。其核心思想为:“近朱者赤近墨者黑”
2.实现步骤
KNN分类算法包括以下4个步骤:
①准备数据,对数据进行预处理
②计算测试样本点(也就是待分类点)到其他每个样本点的距离 。
③对每个距离进行排序,然后选择出距离最小的K个点。
④对K个点所属的类别进行比较,根据少数服从多数的原则,将测试样本点归入在K个点中占比最高的那一类。
3.KNN算法三要素
距离度量算法:一般使用的是欧氏距离。也可以使用其他距离:曼哈顿距离、切比雪夫距离、闵可夫斯基距离等。
k值的确定:k值越小,模型整体变得越复杂,越容易过拟合。通常使用交叉验证法来选取最优k值
分类决策:一般使用多数表决,即在 k 个临近的训练点钟的多数类决定输入实例的类。可以证明,多数表决规则等价于经验风险最小化
二、实例
通过电影场景里面的打斗镜头次数与接吻镜头次数的比较然后根据KNN算法来进行判断该电影的类型是动作片还是爱情片
代码:
import collections
import numpy as np
def createDataSet():
# 四组二维特征
group = np.array([[104, 3], [100, 2], [81, 1], [10, 101], [5, 99], [2, 98]])
# 四组特征的标签
labels = ['爱情片', '爱情片', '爱情片', '动作片', '动作片', '动作片']
return group, labels
def classify(inx, dataset, labels, k):
# 计算距离 其实就是计算点一定之间的距离
dist = np.sum((inx - dataset) ** 2, axis=1) ** 0.5
# k个最近的标签
# dist.argsort 将x中的元素从小到大排列,提取其对应的index(索引)
k_labels = [labels[index] for index in dist.argsort()[0: k]]
label = collections.Counter(k_labels).most_common(1)[0][0]
return label
if __name__ == '__main__':
# 创建数据集
group, labels = createDataSet()
# 测试集
test = [10,100 ]
test_class = classify(test, group, labels, 5)
# 打印分类结果
print('最终判定的影片类型:', test_class)
结果展示:
三、结论
KNN算法的优势和劣势
了解KNN算法的优势和劣势,可以帮助我们在选择学习算法的时候做出更加明智的决定。那我们就来看看KNN算法都有哪些优势以及其缺陷所在!
KNN算法优点
1.简单易用,相比其他算法,KNN算是比较简洁明了的算法。即使没有很高的数学基础也能搞清楚它的原理。
2.模型训练时间快,上面说到KNN算法是惰性的,这里也就不再过多讲述。
3.预测效果好。
4.对异常值不敏感
KNN算法缺点
1.对内存要求较高,因为该算法存储了所有训练数据
2.预测阶段可能很慢
3.对不相关的功能和数据规模敏感