机器学习 之 K近邻(KNN),各种距离(范数)

思想是在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实例分类到这个类中(这就类似于现实生活中少数服从多数的思想)。

但k怎么确定的,k为多少效果最好呢?(其实是超参数,不能用数据进行调整的,只能用交叉验证推算)

如果我们选取较小的k值,那么就会意味着我们的整体模型会变得复杂,容易发生过拟合!(容易被噪声占据优势)

如果我们选取较大的k值,就相当于用较大邻域中的训练数据进行预测,这时与输入实例较远的(不相似)训练实例也会对预测起作用,使预测发生错误,k值的增大意味着整体模型变得简单。不解释。

k值既不能过大,也不能过小,要恰当好。通常采取交叉验证法来选取最优的k值。(也就是说,选取k值很重要的关键是实验调参,类似于神经网络选取多少层这种,通过调整超参数来得到一个较好的结果)

所谓的最近邻又是如何来判断给定呢?
这个就是各种距离,两个点之间的距离还是很好计算的。

而且还有归一化的问题,这个不难(x − a b − a \frac{x-a}{b-a}baxa)。

总结:
 kNN的时间复杂度和空间复杂度都是O(n);(测试集有多少个)
 kNN是一种懒惰的学习方法,无需训练;
 kNN算法隐含的假设是:一个实例的分类与它在欧式空间中附近的实例的分类相同
 KNN是一种“非参数模型”,非参数不是说没有参数的意思,而是说参数很多,多到和样本一样多!

每日小常识:

定义中所说的最邻近是如何度量呢?也就是说,何为最近呢?这里就会引出我们几种度量俩个点之间距离的标准------也就是那几个范数,常用l2范数(欧式范数)

d = ∑ k = 1 n ( x 1 − x 2 ) 2 d=\sqrt{\sum^n_{k=1}(x_1-x_2)^2}d=k=1n(x1x2)2

具体方法:

首先这里有训练集和测试集(用于交叉验证求k),是手写数字集合。
是矩阵的欧式范数怎么做呢?相当复杂,要求特征值的,而且网上全部都是压成一行。这样就可以用普通的欧式范数了。


版权声明:本文为HeroIsUseless原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。