宏斌PKUCIS

在数学的王国里,自由地编程

导航

机器学习PR:k近邻法分类

k近邻法是一种基本分类与回归方法。本章只讨论k近邻分类,回归方法将在随后专题中进行。

它可以进行多类分类,分类时根据在样本集合中其k个最近邻点的类别,通过多数表决等方式进行预测,因此不具有显式的学习过程。其本质是利用训练数据集对特征向量空间进行划分,并作为其分类的模型。k值选择、距离度量以及分类决策规则是其三个基本要素。

 

一、模型:

      特征空间中,对每个训练点,距离该点比其他点更近的所有点组成一个区域(单元),每个训练点拥有一个区域(单元),所有训练点的区域(单元)构成对特征空间的一个划分。最近邻法将该点的类别作为所在单元中所有点的类标记。

二、距离度量

特征空间中两个点的距离反映了两个点的相似程度,可选距离包括Lp距离如欧式距离、曼哈顿距离,以及闵可夫斯基距离等。

三、k值选择

如果k值较小,以为着用较小的邻域中的训练样本进行预测,学习的近似误差会减小,但学习的估计误差会增大,预测结果对近邻点非常敏感。如果近邻点恰巧是噪声,预测就会出错,导致过拟合现象。如果k值较大,相当于用较大的领域中的训练样本进行预测,这样估计误差会减小,但学习的近似误差会增大。在实际应用中,通常采用交叉验证法来选取最有的k值。

四、分类决策规则

一般采用多数表决规则,等价于经验风险最小化。对给定的点x,如果涵盖*其最近邻的k个训练点构成的集合*的区域的类别是cj,那么误分类率是:

要是误分类率最小即经验风险最小,就要使得表决支持最多。

五、算法实现:kd树

k近邻算法要求快速对训练数据进行k近邻搜索,在特征空间维数大、训练样本容量大时尤为必要。k近邻算法的最简单实现方法是线性扫描,这时要计算输入实例与每一个训练实例的距离,显然当训练集很大时,计算是不可行的。为了提高搜索效率,可以考虑采用特殊的结构存储训练数据,以减少计算距离的次数,如kd树。

构造kd树:

kd树是一种对k维空间中的点进行存储以便于对其进行快速检索的树形数据结构。kd树是二叉树,表示对k维kj的一个划分。构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分,构成一系列的k维超矩形区域,kd树的每一个结点对应于k维超矩形区域。

       

搜索kd树:

评价:

如果点是随机分布的,kd树搜索的平均计算复杂度为O(logN),N是训练样本数,kd树更适合于训练实例树远大于空间维数时的k近邻搜索,当空间维数接近训练实例树时,它的效率会迅速下降,几乎接近线性扫描。

 

【测试数据: sample.dat,test.dat】

【算法1: test.cpp, knn-kd.a,  knn-kd.so】

【算法2: test.cpp, knn-kd.a,  knn-kd.so】

posted on 2016-11-30 17:51  宏斌PKUCIS  阅读(302)  评论(0编辑  收藏  举报