思想是在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实例分类到这个类中(这就类似于现实生活中少数服从多数的思想)。
但k怎么确定的,k为多少效果最好呢?(其实是超参数,不能用数据进行调整的,只能用交叉验证推算)
如果我们选取较小的k值,那么就会意味着我们的整体模型会变得复杂,容易发生过拟合!(容易被噪声占据优势)
如果我们选取较大的k值,就相当于用较大邻域中的训练数据进行预测,这时与输入实例较远的(不相似)训练实例也会对预测起作用,使预测发生错误,k值的增大意味着整体模型变得简单。不解释。
k值既不能过大,也不能过小,要恰当好。通常采取交叉验证法来选取最优的k值。(也就是说,选取k值很重要的关键是实验调参,类似于神经网络选取多少层这种,通过调整超参数来得到一个较好的结果)
所谓的最近邻又是如何来判断给定呢?
这个就是各种距离,两个点之间的距离还是很好计算的。
而且还有归一化的问题,这个不难(x−ab−a\frac{x-a}{b-a}b−ax−a)。
总结:
kNN的时间复杂度和空间复杂度都是O(n);(测试集有多少个)
kNN是一种懒惰的学习方法,无需训练;
kNN算法隐含的假设是:一个实例的分类与它在欧式空间中附近的实例的分类相同
KNN是一种“非参数模型”,非参数不是说没有参数的意思,而是说参数很多,多到和样本一样多!
每日小常识:
定义中所说的最邻近是如何度量呢?也就是说,何为最近呢?这里就会引出我们几种度量俩个点之间距离的标准------也就是那几个范数,常用l2范数(欧式范数)
d=∑k=1n(x1−x2)2d=\sqrt{\sum^n_{k=1}(x_1-x_2)^2}d=k=1∑n(x1−x2)2
具体方法:
首先这里有训练集和测试集(用于交叉验证求k),是手写数字集合。
是矩阵的欧式范数怎么做呢?相当复杂,要求特征值的,而且网上全部都是压成一行。这样就可以用普通的欧式范数了。
本文探讨k-最近邻(kNN)算法中k的选择原则,介绍如何通过交叉验证确定最佳k值,并解析最近邻判断的方法,包括欧式范数和归一化技巧。重点讲解kNN的时间复杂度、空间复杂度,以及其作为非参数模型的特点和适用场景。
15万+

被折叠的 条评论
为什么被折叠?



