K近邻 K-nearst neighbors KNN
KNN是一种基本的机器学习算法,所谓K近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的K个邻居来代表
KNN在做回归和分类的主要区别在于最后做预测的时候的决策方式不同
KNN在分类预测时,一般采用多数表决法
KNN在回归预测时,一般采用平均值法
KNN算法原理
- 从训练集合中获取K个离待预测样本距离最近的样本数据
- 根据获取得到的K个样本数据来预测当前待测样本的目标属性值
在KNN算法中,非常重要的主要是三个因素:
- K值选择,对于K值得选择,一般根据样本分布选择一个较小得值,然后通过交叉验证来选择一个比较合适得最终值。当选择比较小的K值的时候,表示使用较小领域中的样本进行预测,训练误差会减少,但是会导致模型变得复杂,容易过拟合;当选择较大的K值得时候,表示使用较大领域中得样本进行预测,训练误差会增大,同时会使模型变得简单,容易导致欠拟合。
- 距离的度量,一般使用欧氏距离(欧几里得距离)
- 决策规则,在分类模型中,主要使用多数表决法或者加权多数表决法;在回归模型中,主要使用平均值法或者加权平均值法
KNN分类预测规则
在KNN分类应用中,一般采用多数表决法或者加权多数表决法
多数表决法:每个邻近样本的权重是一样的,也就是说最终预测的结果为出现类别最多的那个类
加权多数表决法:每个邻近样本的权重是不一样的,一般情况下采用权重和距离成反比的方式来计算
KNN回归预测规则
在KNN回归应用中,一般采用平均值法或者加权平均值法
平均值法:每个邻近样本的权重是一样的,也就是说最终预测的结果为所有邻近样本的目标属性值的均值
加权平均值法:每个邻近样本的权重是不一样的,一般情况下采用权重和距离成反比的方式来计算
KNN算法实现方式
KNN算法的重点在于找出K个最邻近的点,主要的方式有以下几种:
蛮力实现:计算预测样本到所有训练集样本的距离,然后选择最小的K个距离即可得到K个最邻近点。缺点在于当特征数比较多、样本数比较多的时候,算法的执行效率比较低
KD树 KD_TREE:在KD算法中,首先对训练数据进行建模,构建KD树,然后再根据
建好的模型来获取邻近样本数据
KD Tree是KNN算法中用于计算最近邻的快速、便捷构建方式
当样本数据量少的时候,可以使用brute这种暴力方式进行求解最近邻。但是当样本数据量较大的时候,直接计算所有样本的距离,工作量有点大,所以在这种情况下,可以使用KD树来快速的计算
KD树是二叉树
KD Tree构建步骤
- 采用m个样本中的n个属性进行划分
- 分布计算n个属性特征的方差,进行从大到小排序
- 选取方差最大的属性作为划分,选取样本的中位数点nkv,以此样本作点作为根节点,讲该属性特征小于nvk的样本放在左子树上,大于的放在右子树上
- 根据方差的第二大属性进行左右子树划分,同上述过程
- 循环迭代,数据集划分完毕
从根节点出发,依照方差排列的属性顺序递归的向下访问KD树,若当前维的坐标小于切分点的坐标移动到左子节点,否则移动到右子节点,直到子节点为叶节点为止。以此叶节点为当前最近点,记录搜索路径中的切分点x
计算待测点到每个x的距离R
以待测点为圆心,最小的距离R为半径画圆
将园内包含的点增加到搜索路径中,直到没有实点为止