可以证明,分类的多数表决和回归的均值回归决策都等价于经验风险最小化。
通过决策规则,我们可以自然地得到 近邻的实现算法(以分类问题为例):
我们最主要解决的问题其实是如何快速得到与测试样本距离最近的训练样本。
一个最容易想到的方法自然就是蛮力法:对每一个训练样本都计算一次与测试样本的距离。
这个方法的确简单直接,在样本量少,样本特征少的时候有效。但是在实际运用中很多时候用不上,因为我们经常碰到样本的特征数有上千以上,样本量有几十万以上,如果我们这要去预测少量的测试集样本,算法的时间效率很成问题。
既然蛮力实现在特征多、样本多的时候很有局限性,那么我们有没有其他的好办法呢?有!
这里我们讲解两种办法,一个是KD树实现,一个是球树实现。
KD树算法没有一开始就尝试对测试样本分类,而是先对训练集建模,建立的模型就是KD树,建好了模型再对测试集做预测。
所谓的KD树就是个特征维度的树,注意这里的 和 KNN 中的 的意思是不同—— KNN中的 代表最近的 个样本,KD 树中的 代表样本特征的维数。为了防止混淆,后面我们记特征维数为。
在scikit-learn 中,与近邻法这一大类相关的类库都在 sklearn.neighbors
模块之中。
KNN分类树:KNeighborsClassifier
;
KNN回归树:KNeighborsRegressor
;
限定半径最近邻分类树:RadiusNeighborsClassifier
;
限定半径最近邻回归树:RadiusNeighborsRegressor
;
最近质心分类算法:NearestCentroid
。
在这些算法中,KNN分类和回归的类参数完全一样。限定半径最近邻法分类和回归的类的主要参数也和KNN基本一样。
比较特别是的最近质心分类算法,由于它是直接选择最近质心来分类,所以仅有两个参数,距离度量和特征选择距离阈值,比较简单,因此后面就不再专门讲述最近质心分类算法的参数。
另外几个在 sklearn.neighbors
模块中,但不是用来做分类回归预测的类也值得关注:
kneighbors_graph
类:返回用 KNN 时和每个样本最近的 个训练集样本的位置radius_neighbors_graph
返回用限定半径最近邻法时和每个样本在限定半径内的训练集样本的位置。NearestNeighbors
是个大杂烩,它即可以返回用KNN时和每个样本最近的K个训练集样本的位置,也可以返回用限定半径最近邻法时和每个样本最近的训练集样本的位置,常常用在聚类模型中。