1.6.2最近邻分类
基于邻居的分类是一类基于实例的非生成学习:它不试图去构建一个通用的模型,而只是简单的存储训练数据的实例。分类决策简单的由最近邻多数表决得到。
scikit-learn实现了两种不同的最近邻分类
器:KNeighborsClassifier(well kown of KNN),
RadiusNeighborsClassifier
中基于训练样本点的曲率半径(由用户决定的浮点数)固定。
knn:k值的最优解高度依赖于数据。通常情况下,越大的k值越能够压制噪声的影响,但是会使分类边界不明显。
在数据不是均匀采样的情况下,RadiusNeighborsClassifier中的基于曲率半径的邻居分类算法can be a better choice。用户指定固定的radius ,,以至于邻居稀疏的点会使用更少的邻居用于分类。
基本的最近邻分类使用均匀的权值。但是,在某些情况下,最好给邻居赋以权重,由此更近的邻居对拟合可以有更多的贡献。这可以通过weight关键字来实现。 The default value,weights = 'uniform'
, assigns uniform weights to each neighbor. weights = 'distance'给..
an example of classification using nearest neighbors.
在
1.6.4最近邻算法
1.6.4.1暴力算法
最近邻的快速计算式机器学习领域的一大热点。最朴素的搜索算法实现包括暴力计算数据集中所有点对的距离:对N个D维的样本,算法复杂度达到O[DN^2]。有效的暴力邻居搜索对小数据集来说十分有竞争力。algorithm = 'brute'
1.6.4.2 K-D树
一说到提高计算效率,各种基于树的数据结构就会被提及。一般来说,就是通过有效的编码设计减少所需的计算次数。基本思想就是如果A、B距离远,同时B、C距离近,那么A、C肯定远,就不要再计算A、C之间的距离了。由此,计算复杂度可以减少到O[DNlog(N)],甚至更低。
早期通过KD tree来利用这个特性。algorithm = 'kd_tree'
1.6.4.3 Ball树
为了减少KD树在高纬度的低效率,提出了ball tree。