未来面试之三:knn近邻算法

这周来个简单的算法好啦。我记得当时学的最简单的一个算法就是K近邻算法,它简单到什么程度呢?可以说它是我学过的算法中最简单的一个。但是呀,它的作用很不小嘞。

初识KNN

近邻分类被称为“懒惰学习”算法。原理很简单,就是把未标记的案例归类为与他们最为相似的带有标记的案例所在的类,尽管这一想法很简单,但是紧邻分类及其强大(具体多强大我也体会不出来,反正就是既简单又强大),应用呢,离我们最近的就是预测一个人是否喜欢推荐给他们的电影

特点

简单而且有效,训练阶段很快,对数据的分布没有要求。但是不产生模型,在发现特征之间关系上的能力有限(这点可能跟他的简单有关系),分类阶段很慢且需要大量的内存,特征和缺失数据需要额外处理

原理

KNN算法将特征处理为一个多维特征空间内的坐标,假如给定一个未知因变量数值的一组特征,KNN会利用每个特征的数值在多维空间中描出不同的点,然后计算这个未知因变量的点与它的K(操作的时候可以自己定义的)个离的最近的点,然后看这几个点,哪种类别的点最多,那给的这个点就属于哪一类。这个道理用一句话来说就是少数服从多数。至于如果这几个点属于的类别一样多(就是如果有9个近邻,3个属于A类,3个B类,3个C类,这种情况的话我就不晓得咋整了。)好,我们接着说这个距离的问题,我们知道的计算距离的公式和方法有很多,到底用哪个呢。嫑担心,传统上,KNN算法采用的是欧氏距离。

好了,上面的都是我用自己的语言总结出来的,自认为还是比较准确的哈,算了,还是po出官方的定义吧:

所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中。(看人家这,精确又简练)

注意:KNN所选择的的几个近邻都是已经正确分类的对象,这个也很容易理解嘛,没有标签的话咋少数服从多数,四八四。

KNN的分类器不需要使用训练集进行训练,因此它的训练时间复杂度为0,而他的计算复杂度和训练集中文档数目成正比,即:如果训练集中文档总数为n,那么它的分类时间复杂度为o(n)

距离度量一般采用欧氏距离,在使用之前最好将每个属性值规范化即标准化,这样有助于防止具有较大初始值域的属性比具有较小初始值域的属性权重过大。

K值

K值的不同会对算法结果产生重大影响。在实际应用中K值一般选择较小的一个数值,通常采用交叉验证的方法选取最优的K值随着训练实例数目趋向于无穷和K=1时,误差率不会超过贝叶斯误差率的二倍,如果K也趋向于无穷,则误差率趋向于贝叶斯误差率。(这句话看不懂,但是貌似很厉害的样子,先摆这啦,没准以后再反过头来再看这篇文章会知道他)

KNN算法不仅可以用于分类,还可以用于回归通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成反比。 该算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。 该算法只计算“最近的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。

该方法的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。

(前两段是抄的,讲真,我还不知道它能做回归,厉害了,长见识了啊。但是呢,它的回归用到的并不多,因为有专门做回归的东西比如各种回归算法和高大上的算法,应该是比这个KNN的回归厉害的,因此这个回归只要了解知道一下就可以了。)

关于K的骚操作

在实际应用中,K的选取取决于要学习概念的难度和训练数据中案例的数量。通常K为3~10.一种常见的做法就是设置K等于训练集中案例数的平方根。但是呢这个不一定有交叉验证出来的好,所以呀,数据量不大,在电脑可以跑得动的前提下还是乖乖用交叉验证吧

猜你喜欢

转载自blog.csdn.net/qq_41020194/article/details/80031020