1、基本思想
给定一个训练数据集(这些数据集是已知类别的),对新输入的要对其进行分类的实例,从训练数据中找出与该实例最近的k个实例,这k个实例的多数属于某个类(类似于这k个实例对新数据投票),就把该输入实例分为这个类。
2、数学理论
2.1 算法描述
输入:训练数据集
T={(x1,y1),(x2,y2),...,(xN,yN))}
其中,
xi∈X⊆Rn
为实例的特征向量,
yi∈Y={c1,c2,...,cK}
为实例的类别,
i=1,2,...,N
;新输入的实例表示为
x
;
输出:实例
分类步骤:
- 根据给定的距离度量,在训练集
T 中找出与 x 最邻近的k个点,涵盖这k个点的x 的领域记作 Nk(x)- 在
Nk(x)
中根据分类决策规则(如多数表决)决定
x
的类别
y :
y=argmax∑xi∈Nk(x)I(yi=cj),i=1,2,...,N;j=1,2,...,K
上式中, I 为指示函数,即当yi=cj 时 I 为1,否则I 为0。 2.2 距离度量
k近邻分类模型的空间一般是n维实数向量空间 Rn . 使用的距离通常是欧氏距离,但也可以是其它距离,如: Lp 距离或Minkowsk距离。
2.3 算法举例
例题:假设有6个二维数据点{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},数据点位于二维空间内,如下图所示。为了能有效的找到最近邻,k-d树采用分而治之的思想,即将整个空间划分为几个小部分,首先,粗黑线将空间一分为二,然后在两个子空间中,细黑直线又将整个空间划分为四部分,最后虚黑直线将这四部分进一步划分。
6个二维数据点{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}构建kd树的具体步骤为:- 确定:split域=x。具体是:6个数据点在x,y维度上的数据方差分别为39,28.63,所以在x轴上方差更大,故split域值为x;
- 确定:Node-data = (7,2)。具体是:根据x维上的值将数据排序,6个数据的中值(所谓中值,即中间大小的值)为7,所以Node-data域位数据点(7,2)。这样,该节点的分割超平面就是通过(7,2)并垂直于:split=x轴的直线x=7;
- 确定:左子空间和右子空间。具体是:分割超平面x=7将整个空间分为两部分:x<=7的部分为左子空间,包含3个节点={(2,3),(5,4),(4,7)};另一部分为右子空间,包含2个节点={(9,6),(8,1)};
- 如上算法所述,kd树的构建是一个递归过程,我们对左子空间和右子空间内的数据重复根节点的过程就可以得到一级子节点(5,4)和(9,6),同时将空间和数据集进一步细分,如此往复直到空间中只包含一个数据点。
3、算法Python实现
- 在
Nk(x)
中根据分类决策规则(如多数表决)决定
x
的类别
本文详细介绍了K近邻算法的基本思想与数学理论,并通过一个具体的例子展示了如何使用k-d树来加速查找最近邻的过程。此外,还提供了算法的Python实现代码。
428

被折叠的 条评论
为什么被折叠?



