k邻近算法

来源:互联网 发布:2017年美国网络星期一 编辑:程序博客网 时间:2024/04/26 20:58

3.1k邻近算法

      给定一个训练数据集,对于新的输入实例,在训练数据集中找到该实例最近的K 的实例,这k个实例的多数属于某个类,酒吧该输入实例分为这个类。


算法3.1

输入:训练数据集

其中xi为实例的特征向量,yi为实例的类别,

输出:实例x的类y

(1)根据给定的距离度量,在训练集T中找出与x最邻近的k个点,涵盖这个K个点的x的邻域记做Nk(x);

(2)在Nk(x)中根据分类决策规则(如多数表决决定x的类别y):


I为指示函数,当yi=cj时,I为1,否则I为0。

      k邻近算法的特殊情况是k=1的情形,称为最邻近算法,对于输入的实例点x,最邻近算法将数据集中与x最邻近的点的类作为x的类。

      k邻近算法没有显示的学习过程。


3.2k邻近模型

3.2.1模型

     k邻近算法中,当训练量、距离度量、k值以及分类决策规则确定后,对于任何一个新的输入实例,它所属的类别唯一确定。

     特征空间中,对每个训练实例点xi,距离该店比其他店更近的所有点组成一个区域,叫做单元。所有训练实例点的单元构成对特征空间的一个划分。最邻近发将实例xi的类yi作为其单元中所有点的类标记。这样,每个单元的实例点的类别是确定的。



3.2.2距离度量

3.2.3k值的选择

k值过小容易发生过拟合,过大意味着模型变得简单。通常爱去交叉验证法来选取最优的k值

3.2.4分类决策规则

a.多数表决规则

    如果分类的损失函数为0-1损失函数


分类函数为


那么误分类的概率为



3.3k邻近算法的实现:kd树

3.3.1构造kd树

算法3.2 构造kd平衡树

输入:k维空间数据集

其中

输出:kd树

(1)开始:构造根节点,根节点对应于包含T的k维空间的超矩形区域。选择为坐标轴,以T中所有实例的坐标的中位数为切分点,将根节点对应的超矩形区域切分为两个子区域。切分由通过切分点并与坐标轴垂直的超平面实现。

         由根节点生成深度为1的左右节点:左子节点对应坐标小于切分点的子区域,右子节点对应于坐标大于切分点的子区域。

(2)重复:对深度为j的结点,选择为切分的坐标轴,l=j(mod)k+1,以改节点的区域中所有实例的坐标的中位数为切分点,将该节点对应的超巨型区域切分为两份子区域。切分由通过切分点并与坐标轴垂直的超平面实现。

         由该节点生成深度为j+1的左右子节点:左子节点小于切分点的子区域,右子节点对于切分点的子区域。

         将坐在切分超平面上的实例点保存在该节点。

(3)知道两个子区域没有实例存在时停止,从而形成kd树的划分。



eg.的划分如下图



3.3.2搜索kd树

        给定一个目标点,搜索其最近邻。首先找到包含目标点的叶节点;然后从该叶节点出发,以此回退到父节点;不到查找与目标点最邻近的结点,当确定不可能存在更近的结点时终止。

算法3.3 用kd树的最近邻搜索

输入:已构造的kd树:目标点x;

输出:x的最近邻

(1)在kd树中找出包含目标点x的叶节点:从根结点出发,递归向下访问kd数。若目标点x当前维的坐标小于切分点

的坐标,则移动到左子节点,否则移动到右子节点,知道子节点为叶节点为止。

(2)以此叶节点为当前最近点

(3)递归的向上回退,在每个结点进行以下操作:

          a.如果该点保存的实例点比当前最近点距离目标点更近,则以该实例点为“当前最近点”

          b.当前最近点一定存在于该节点一个子节点对应的区域。检查盖子节点的另一子节点对应的区域是否有更近的点。具体地,检查另一子节点对应的区域是否与以目标点为球心、以目标点与当前最近点间的距离为半径的球体相交。如果相交,向上回退

(4)当回到根节点时,搜索结束。最后“当前最近点”即为x的最近点

eg.

上图搜索过程如下:首先在Kd树种找点包含点s的叶节点D,以D作为近似最邻近。真正最近邻一定在以点S为中心通过点D的圆的内部。然后返回节点D的父节点,在结点B的另一子节点F的区域内搜索最近邻。节点F的区域与圆不相交,不可能有最近邻点。继续返回上一级父节点A,在A的另一子节点C的区域内搜索最邻近,节点C的区域与圆相交;该区域在圆内的实例点有E,点E比点D更近,成为新的最近邻似。


补充:

交叉验证:基本思想是重复利用数据,把给定的数据进行切分,将切分的数据集组合成为训练集和测试集,在此基础上反复的进行训练,测试以及模型选择

1.简单交叉验证

   首先随机地将已给数据分为两部分,一部分作为训练集,另一部分作为测试集;然后用训练集在各种条件下(例如不同的参数个数)训练模型,从而得到不同的模型;在测试集上评价各个模型的测试误差,选出测试误差最小的模型。

2.S折交叉验证

    应用最多。方法如下:首先随机将已给数据切分为S个大小相同的子集;然后利用S-1个子集的数据训练模型,利用余下的子集测试模型;将这一过程对可能的S种选择重复进行;最后选出S次评测中平均测试误差最小的模型。

3.留一交叉验证

   S折交叉验证的特殊情形是S=N,称为留一交叉验证(leave-one-out cross validation),往往在数据缺乏的情况下使用。


0 0
原创粉丝点击