机器学习之KNN算法

一、kNN算法

        K近邻算法(k-nearest neighbors)是一种简单的有监督学习算法,其工作机制是:给定测试样本,基于某种距离度量找出训练集中与其最接近的k个样本,基于这k个‘邻居’的信息来进行预测。kNN算法既可以应用于分类也可以应用于回归问题,主要区别在于采取的决策方式不同。

        kNN算法没有显示的训练过程,为lazy learning,即在训练阶段仅仅是把样本保存起来,训练时间开销为零,待收到测试样本后再进行处理;eager learning:在训练阶段就对样本进行学习处理的方法。——周志华 《机器学习》

        优点:K近邻分类器虽然简单,但它的泛化错误率不超过贝叶斯最优分类器的错误率的两倍、精度高,对异常值不敏感,无数据输入假定。特别适合多分类问题,比SVM表现要好。

        缺点:计算复杂度高、空间复杂度高,而且这种算法无法给出任何数据的基础结构信息,无法知晓平均实例样本和典型实例样本具有什么特征。

        KNN算法的改进方法之一是分组快速搜索近邻法。其基本思想是:将样本集按近邻关系分解成组,给出每组质心的位置,以质心作为代表点,和未知样本计算距离,选出距离最近的一个或若干个组,再在组的范围内应用一般的KNN算法。由于并不是将未知样本与所有样本计算距离,故该改进算法可以减少计算量,但并不能减少存储量。

         


    1、kNN算法步骤:

        (1)计算测试数据与各个训练数据之间的距离;

        (2)按照距离递增的顺序进行排序;

        (3)选择距离最近的k个样本数据;

        (4)计算前k个样本所在类别的频率/均值;

        (5)返回前k个样本出现频率最高/(加权)均值作为测试数据的类别/预测值

         

    2、kNN三要素:

        (1)k值的选择

            一般根据样本分布选择一个较小的值(k通常为不大于20的整数),然后通过交叉验证来选择一个比较合适的k值。当选择的k比较小时,训练误差会减小,但容易过拟合;当选择的k值比较大时,训练误差会增大,容易欠拟合。

        (2)距离的度量:一般使用欧氏距离。

            欧式距离: 曼哈顿距离:

         (3)决策规则:

                a) 分类--多数表决法、加权多数表决法

                     多数表决法:每个近邻样本的权重是一样的,最终的预测结果和出现次数最多的类别一致。

                     加权多数表决法:每个近邻样本的权重是不一样的,一般令权重与距离成反比,最终的预测结果和权重最大的类别一致。

                b) 回归--平均值法、加权平均值法

                     平均值法:每个近邻样本的权重是一样的,最终的预测结果为所有近邻样本的目标属性的平均值。

                     加权平均值法:每个近邻样本的权重是不一样的,一般令权重与距离成反比,最终的预测结果为所有近邻样本目标属性的加权平均值。

    3、kNN算法的实现方式:

        (1)蛮力实现(brute)

            计算所有训练样本到预测样本的距离,然后选择距离最小的k个确定预测样本的目标值。缺点是必须保存全部数据集,在于样本量大、特征较多的情况下,算法的开销比较大。

            这里贴出《机器学习实战》中kNN的实现方法作为参考:

             


        (2)KD-Tree

            对训练数据进行建模,构建KD树,根据建好的模型来获取邻近样本数据目标值,是kNN算法的优化版,可以节省大量的计算开销。


        (3)Ball Tree、BBF Tree、MVP Tree等改进KD-Tree的算法

二、KD-Tree算法

            KD树(k-dimensional tree)是一种二叉树,每个节点表示一个空间范围,是分割k维数据空间的数据结构,主要应用于多维空间关键数据的搜索,适用于当样本量较大、使用kNN brute方法计算效率低的时候。

        1、KD-Tree构建方式

            设数据集包含m条数据,每条数据有n个特征,分别计算n个特征取值的方差,用方差最大的第k维特征作nk为根节点,对于这个特征,选择取值的中位数nkv作为样本的划分点,即该特征值小于中位数的样本划分到左子树,大于等于该值的样本划分到右子树。继续此类操作递归即可产生KD树,最终每个叶子节点只包含一个点。

             

        2、KD-Tree查找最近邻

            生成KD树后,就可以用来预测测试集中样本的目标。

            (1)对于一个目标点,首先在KD树里面找到包含目标点的叶子节点,以目标点为圆心,目标点到叶子节点样本实例的距离为半径,得到一个超球体,最近邻的点一定在这个超球体内部,

            (2)返回叶子节点的父节点,检查另一个子节点包含的超矩形体是否和超球体相交,如果相交就到这个子节点寻找是否有更加近的近邻,若存在就更新最近邻;若不相交就直接返回父节点的父节点,在另一个子树继续搜索最近邻。

            (3)当回溯到根节点时,算法结束,此时保存的最近邻节点就是最终的最近邻。

KNN参数说明

         

猜你喜欢

转载自blog.csdn.net/liuy9803/article/details/80541072