第16节 KD树
%matplotlib inline
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.patches import Circle
from sklearn.neighbors import KDTree, BallTree
k-NN算法时间复杂度(Time Complexity of k-NN)
考虑 d d d维空间
训练时:k-NN记录每个数据样本的标签,易知再添加一个数据样本的时间复杂度为 O ( d ) O(d) O(d)。
测试时:需要计算新数据样本与所有训练数据样本间的距离。
n n n表示训练数据样本数,则训练时间复杂度为 O ( d n ) O(dn) O(dn);分类测试样本时间复杂度也为 O ( d n ) O(dn) O(dn)。
为提高精度,需要增大的训练数据集规模( n ≫ 0 n \gg 0 n≫0),这严重制约测试阶段性能。
目标:使k-NN在测试阶段更快。
KD树(k-dimensional Trees)
KD树的核心在于划分特征空间(partition feature space)。由于大部分数据样本所处分区位于 k k k个最近邻样本之外,因此可不予考虑。
- 划分方法:
(1)将数据沿某一特征分成两个分区;
(2)记录每个训练样本所处分区。
- 测试阶段,考虑最近邻情况:
(1)识别测试样本 x t x_t xt所处分区;
(2)查找该分区内 x t x_t xt的最近邻样本(nearest neighbor) x N N x_{NN} xNN;
(3)计算 x t x_t xt与分区边界的距离 d w d_w dw