k邻近算法

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),往往在数据缺乏的情况下使用。

时间: 2024-08-06 16:04:56

k邻近算法的相关文章

《机器学习实战》学习笔记一K邻近算法

 一. K邻近算法思想:存在一个样本数据集合,称为训练样本集,并且每个数据都存在标签,即我们知道样本集中每一数据(这里的数据是一组数据,可以是n维向量)与所属分类的对应关系.输入没有标签的新数据后,将新数据的每个特征(向量的每个元素)与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似的的分类标签.由于样本集可以很大,我们选取前k个最相似数据,然后统计k个数据中出现频率最高的标签为新数据的标签. K邻近算法的一般流程: (1)收集数据:可以是本地数据,也可以从网页抓取. (2)准备数

机器学习(四) 机器学习(四) 分类算法--K近邻算法 KNN (下)

六.网格搜索与 K 邻近算法中更多的超参数 七.数据归一化 Feature Scaling 解决方案:将所有的数据映射到同一尺度 八.scikit-learn 中的 Scaler preprocessing.py import numpy as np class StandardScaler: def __init__(self): self.mean_ = None self.scale_ = None def fit(self, X): """根据训练数据集X获得数据的均

《统计学习方法》:第三章 K 近邻算法

k -- NN k--NN 是一种基本分类和回归方法.对新实例进行分类时,通过已经训练的数据求出 k 个最近实例,通过多数表决进行分类.故 k 邻近算法具有不显式的学习过程. 三个基本要素:k 值选择,距离度量,分类决策规则. 1. k 近邻算法 原理:给定一个训练集,对于新输入的实例,在训练集中找到与其相似的 k 个实例,这 k 个实例的多数属于某一类,就将该实例归属到这一类. 输入:训练数据集 \(T = \{(x_1,y_1),(x_2,y_2),...,(x_3,y_3)\}\) 其中,

K 近邻算法

声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结,不得用作商用,欢迎转载,但请注明出处(即:本帖地址). 2,因为本人在学习初始时有非常多数学知识都已忘记,所以为了弄懂当中的内容查阅了非常多资料.所以里面应该会有引用其它帖子的小部分内容,假设原作者看到能够私信我,我会将您的帖子的地址付到以下. 3.假设有内容错误或不准确欢迎大家指正. 4.假设能帮到你.那真是太好了. 描写叙述 给定一个训练数据集,对新的输入实例.在训练数据集中找到与该实例最邻近的K个实例,若这K个实

从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经网络:3.编程艺术第28章.你看到,blog内的文章与你于别处所见的任何都不同.于是,等啊等,等一台电脑,只好等待..”.得益于田,借了我一台电脑(借他电脑的时候,我连表示感谢,他说“能找到工作全靠你的博客,这点儿小忙还说,不地道”,有的时候,稍许感受到受人信任也是一种压力,愿我不辜负大家对我的信任)

K近邻算法

1.1.什么是K近邻算法 何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1时,算法便成了最近邻算法,即寻找最近的那个邻居.为何要找邻居?打个比方来说,假设你来到一个陌生的村庄,现在你要找到与你有着相似特征的人群融入他们,所谓入伙. 用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居),这K个实例的多数属

K近邻算法-KNN

何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1时,算法便成了最近邻算法,即寻找最近的那个邻居.为何要找邻居?打个比方来说,假设你来到一个陌生的村庄,现在你要找到与你有着相似特征的人群融入他们,所谓入伙. 用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居),这K个实例的多数属于某个类,就把该输入实例分

算法入门系列2:k近邻算法

用官方的话来说,所谓K近邻算法(k-Nearest Neighbor,KNN),即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中.这是一个有监督的学习算法 例如下图,红色和蓝色代表已知的训练好的的数据,这个时候来一个示例,也就是图中的绿色圆块,这个绿色圆块属于哪一类呢? 如果K=3,绿色圆点的最近的3个邻居是2个红色小三角形和1个蓝色小正方形,少数从属于多数,基于统计的方法,

R语言学习笔记—K近邻算法

K近邻算法(KNN)是指一个样本如果在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性.即每个样本都可以用它最接近的k个邻居来代表.KNN算法适合分类,也适合回归.KNN算法广泛应用在推荐系统.语义搜索.异常检测. KNN算法分类原理图: 图中绿色的圆点是归属在红色三角还是蓝色方块一类?如果K=5(离绿色圆点最近的5个邻居,虚线圈内),则有3个蓝色方块是绿色圆点的"最近邻居",比例为3/5,因此绿色圆点应当划归到蓝色方块一类:如果