《统计学习方法》——第三章KNN及C++实现

Input : 特征向量
Output : 实例类别
基本分类回归问题,不具显示学习过程,整个过程有三个学习要素

  1. K值选择 [一般使用交叉验证的方法选择K值,使经验误差最小]
    [K小,模型复杂,容易过拟合,受噪声影响较大;K大,模型简单(K=N)]
  2. 距离度量 [包括各种距离度量公式,p范数,以及各种改进的相似性度量方法]
    [不同的距离测量公式得到的K邻近点是不一样的]
  3. 分类决策准则 (如多数表决)
    决策规则 y = a r g m a x c j x i ϵ N k ( x i ) I ( y i = c j ) y = argmax_{c_j} \sum_{x_i \epsilon N_k(x_i)}I(y_i=cj)

根据上述实现比较简单,关键是如何快速搜索K个邻近点
一般为线性扫描,或者构建数据索引【速度快】
Kd 树 一种树索引结构,使用大顶堆构建,表示对k维空间的一个划分,每个节点对应于k维空间划分中的一个超矩形划分区域,减少搜索的计算量。[这里的k于上面的K邻近不同,指的是特征空间的维**度]
**Kd树的构造 **

 1. 选择切分的坐标轴(维度)
	有很多中方法,其中一种,比如计算每一维度上的方差,		
	如果 方差较大,说明数据分散,可分性较大。
 2. 选择该维度上数据的中位数进行划分
 3. 递归划分,直到最后一个维度

**搜索Kd树 **

 1. 从根节点出发找出包含目标节点x的叶节点
 	A->以特征的第二维度进行划分,向下->以x的第一维度进行划分,		
 	向右->D叶节点
 	设D为当前离x最近的节点
 2. 以D为当前最近的节点,递归向上回退,回退到根节点结束
 	回退时操作
 	D->B(No)->F(No)->A->C(相交)->E

在这里插入图片描述

C++实现,参考A KD-Tree model written in C++(with C and Python interface)
,就不放自己的渣渣代码了。

猜你喜欢

转载自blog.csdn.net/weixin_35479108/article/details/84940178
今日推荐