k近邻法
1、k近邻算法
输入: 训练集数据
T={(x1,y1),(x2,y2),...,(xN,yN)}T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\}T={(x1,y1),(x2,y2),...,(xN,yN)}
其中,xi∈X⊆Rnx_i \in X \subseteq R^nxi∈X⊆Rn 是实例的特征向量,yi∈Y={c1,c2,...,cK}y_i \in Y = \{c_1,c_2,...,c_K\}yi∈Y={c1,c2,...,cK} 是实例的类别,i=1,2,...,Ni=1,2,...,Ni=1,2,...,N
输出:实例 xxx 所属的类 yyy。
(1)根据给定的距离度量,在训练集 TTT 中找出与 xxx 最邻近的 kkk 个点,涵盖这 kkk 个点的 xxx 的邻域记作 Nk(x)N_k(x)Nk(x);
(2)在 Nk(x)N_k(x)Nk(x) 中根据分类决策规则决定(如多数表决) xxx 的类别 yyy:
y=arg maxcj∑xi∈Nk(x)I(yi=cj), i=1,2,...,N;j=1,2,...,Ky= \underset{c_j}{arg\ max} \sum_{x_i \in N_k(x)} I(y_i=c_j),\ i=1,2,...,N; j=1,2,...,Ky=cjarg maxxi∈Nk(x)∑I(yi=cj), i=1,2,...,N;j=1,2,...,K
其中 III 是指示函数,当 yi=cjy_i=c_jyi=cj 时 III 为1,否则 III 是0。
2、k近邻模型
模型三要素:度量距离、k值、分类决策规则。
- 距离度量
距离反应了两个实例点之间相似程度。常见距离有 LpL_pLp 距离、Minkowski距离、欧式距离。
XXX 是 n 维实数向量空间 RnR^nRn,xi=(xi(1),xi(2),...,xi(n))Tx_i=(x_i^{(1)},x_i^{(2)},...,x_i^{(n)})^Txi=(xi(1),xi(2),...,xi(n))T- LpL_pLp距离定义为:
Lp(xi,xj)=(∑l=1n∣xi(l)−xj(l)∣p)1p L_p(x_i,x_j)=(\sum_{l=1}^{n}|x_i^{(l)}-x_j^{(l)}|^p)^{\frac{1}{p}} Lp(xi,xj)=(l=1∑n∣xi(l)−xj(l)∣p)p1 - 曼哈顿距离,上式中 p=1p=1p=1
- 欧式距离,上式中 p=2p=2p=2
- 当 p=∞p=\inftyp=∞ 时是各个坐标距离的最大值,即
L∞(xi,xj)=maxl∣xi(l)−xj(l)∣L_{\infty}(x_i,x_j)=\underset{l}{max}|x_i^{(l)}-x_j^{(l)}|L∞(xi,xj)=lmax∣xi(l)−xj(l)∣
- LpL_pLp距离定义为:
- k值选择
k值的选择对结果产生重大影响
注: 近似误差,可以理解训练集的训练误差。估计误差,可以理解为对测试集的测试误差。k值 近似误差 估计误差 模型复杂度 说明 k值较小 减小 增大 模型复杂化 对近邻点敏感,容易过拟合 k值较大 增大 减小 模型简单化 邻域中不相似的点干扰分类结果
在应用中一般 kkk 选择较小的值,使用交叉验证法选取最优值。 - 分类决策规则
多数表决规则(等价于经验最小化)
3、k近邻的实现:kd 树
平衡 kd 树构造算法:
输入:k 维空间数据集 T={x1,x2,...,xN}T=\{x_1,x_2,...,x_N\}T={x1,x2,...,xN}
输出:kd 树
(1)开始构造根节点,根节点包含所有样例点的超矩形;选择 x(1)x^{(1)}x(1) 为坐标轴,以 T 中所有实例 x(1)x^{(1)}x(1) 的中位数为切分点,将根节点对应的超矩形切分为两个子区域。切分由过 x(1)x^{(1)}x(1) 中位数的点且垂直于 x(1)x^{(1)}x(1) 轴的超平面实现。
以根节点生成深度为1的左、右结点:左子树对应 x(1)x^{(1)}x(1) 的坐标小于切分点的子区域,右子树对应 x(1)x^{(1)}x(1) 大于切分点的子区域。
将落在超平面上的点放在根节点中。
(2)重复:深度的为 j 的结点,选择 xlx_{l}xl 为切分的坐标轴,其中 l=j mod k +1l=j\ mod\ k\ + 1l=j mod k +1 。选择 x(l)x^{(l)}x(l) 的中位数作为切分点。
(3)直到两个顶点之间没有实例存在时停止,从而形成 kd 树。
kd 树邻近搜索
输入:kd 树;目标点 x
输出:x 的最近邻点
(1)在 kd 树中搜索包含 x 的叶子结点;
(2)以此叶结点为当前最近叶结点;
(3)递归回退,进行如下操作:
(a)若该结点保存的实例比当前最近结点更靠近目标点,则以该实例为“当前最近点”;
(b)当前最近点一定存在于该结点一个子结点对应的区域内。检查该结点的父结点的另一个子结点对应的区域是否有更近的点。具体来说就是检出另一个结点对应的区域是否与以目标点为中心、目标点到“当前最近点”间的距离为半径的超球体相交。
若相交则移动到另一个结点,接着递归搜索最近邻搜索。
(4)当回退到根节点,搜素结束。