K近邻模型 k-nearest neighbor K-NN
解决多分类问题,对每个训练实例点xi,距离该点较近的k个点构成一个区域,叫做cell
文章图片
可以看到距离度量,K值选取,分类规则都会对模型产生较大的影响
距离度量
两个实例点的距离代表了相似程度,一般为欧式距离,但也可以是其他距离
文章图片
要注意,不同距离所得到的最近的k个点是不同的。举个例子
文章图片
K值
近似误差:可以理解为对现有训练集的训练误差。
如果近似误差小了会出现过拟合的现象,对现有的训练集能有很好的预测,但是对未知的测试样本将会出现较大偏差的预测。模型本身不是最接近最佳模型。
估计误差:可以理解为对测试集的测试误差。
估计误差小了说明对未知数据的预测能力好。模型本身最接近最佳模型。
对于KNN来说
如果K取得过小,近似误差小,但估计误差大,模型复杂
一方面过拟合现象
另一方面噪音点会对模型产生很大影响
如果K取得过大,近似误差大,但估计误差减少,模型简单这里我不能理解,难道不是估计误差也大吗?只能理解为现对于K很小的时候,估计误差稍微要小一点
因为许多与不具有相似属性的点也会对预测起作用
分类规则
【kaggle|统计学习方法——第三章(KNN)】通常用多数表决规则,并且该规则等价于经验风险最小化
证明:使用LOSS函数为0-1函数,yi为真实分类,ci为预测分类
则有损失函数
文章图片
注意I指的是I函数,指示函数(indicator function)。
它的含义是:当输入为True的时候,输出为1,输入为False的时候,输出为0。
在这里,如果分类正确yi==ci,那么输入yi!=ci为false输出0
如果分类错误yi!=ci,那么输入yi!=ci为true输出1
又因为有
文章图片
所以我们要让损失函数最小,则让
文章图片
则转化为ci与多数yi相同即可,即多数表决规则
KNN算法的实现——KD树 K近邻搜索,如果使用线性扫描,则时间复杂度过大O(n)
KD树的建立 对于空间数据集T={x1,x2,x3----xn} 其中xi=(xi(1),xi(2),xi(3),xi(4)-----xi(k))^T都是k维度向量
第一步:
文章图片
将x1(i)所有实例xi的第一维度值的中位数作为根,将两个子空间分别作为左右子树
第二步:
接下来就是递归操作,注意紧接着第一步的是对xi的第二维度值进行取中位数,并且进行到第l维度时,l=j(mod k)+1,其中k为向量的维度
文章图片
直到两个子空间没有实例为之
例子:这里明显向上取整
文章图片
KD树的查找
文章图片
文章图片
可以理解:
1:先利用二叉搜索找到包含给定结点的叶结点,则当前结点=叶结点
2:以给定结点为半径,当前结点和给定结点的距离为半径作圆。同时,回溯到父节点,看父节点是否与圆相交即父节点的分割线是否与圆相交,若不想交,执行2。若相交,执行3。若父节点不存在,则当前结点为最近结点即到了根节点,搜索结束
3:分别判断父节点和另一子节点区域是否有离给定结点更近的节点,即结点在圆内,若有,则当前结点为更近节点,若无,执行2
例子:
文章图片