knn算法介绍与参数调优
k近邻算法(K-Nearest Neighbors,KNN)是一种基本的机器学习方法,在生活中也经常应用。例如,判断一个人的品德,只需要观察他最密切的人品好的坏就可以得出结论,这里就运用了KNN的思想。KNN方法既可以做分类,也可以做回归,这点和决策树算法相同。
KNN算法的三要素是k值的选取、距离度量的方式和分类决策规则。对于分类决策规则,一般都是使用多数表决法。所以我们重点是关注与k值的选择和距离的度量方式。对于k值的选择,没有一个固定的经验, 一般根据样本的分布,选择一个较小的值,可以通过交叉验证选择一个合适的k值。
选择较小的k值,就相当于用较小的领域中的训练实例进行预测,训练误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是泛化误差会增大,换句话说,k值的减小就意味着整体模型变得复杂,容易发生过拟合;选择较大的k值,就相当于用较大领域中的训练实例进行预测,其优点是可以减少泛化误差,但缺点是训练误差会增大。
对于距离的度量,我们有很多的距离度量方式,但是最常用的是欧式距离,即对于两个n维向量x和y,两者的欧式距离定义为:大多数情况下,欧式距离可以满足我们的需求,我们不需要再去操心距离的度量。当然我们也可以用他的距离度量方式。比如曼哈顿距离,定义为:更加通用点,比如闵可夫斯基距离(Minkowski Distance),定义为:可以看出,欧式距离是闵可夫斯基距离在p=2时的特例,而曼哈顿距离是p=1时的特例。
KNN算法的实现方式有多种,蛮力实现是其中一种。蛮力实现的思想是计算预测样本和所有训练集中的样本的距离,然后计算出最小的k个距离即可,接着多数表决,很容易做出预测。这个方法的确简单直接,在样本量少,样本特征少的时候有效。但是在实际运用中很多时候用不上,为什么呢?因为我们经常碰到样本的特征数有上千以上,样本量有几十万以上,如果我们这要去预测少量的测试集样本,算法的时间效率很成问题。
因此,我们需要其他的实现方式,KD树实现和球树实现是其中两种。KD树算法没有一开始就尝试对测试样本分类,而是先对训练集建模,建立的模型就是KD树,建好了模型再对测试集做预测。KD树算法包括三步,第一步是建树,第二步是搜索最近邻,最后一步是预测。
KD树的建立是通过计算m个样本的n维特征中,分别计算n个特征的取值的方差,用方差最大的第k维特征来作为根节点。对于这个特征,我们选择特征的取值的中位数对应的样本作为划分点,对于所有第k维特征的取值小于的样本,我们划入左子树,对于第k维特征的取值大于等于的样本,我们划入右子树,对于左子树和右子树,我们采用和刚才同样的办法来找方差最大的特征来做更节点,递归的生成KD树。
KD树的搜索最近邻是通过对测试样本的特征值,在KD树中搜索最近的k个邻居,最后一步是预测,通过多数表决来预测测试样本的类别。KD树实现可以大大提高算法的时间效率,适合于样本特征多,样本量大的情况。
KNN算法是一种基本的机器学习方法,通过选择合适的k值和距离度量方式,可以提高算法的准确性和时间效率。KD树实现和球树实现是KNN算法的两种高效实现方式,适合于样本特征多,样本量大的情况。