k近邻算法python解读_K-近邻算法(python)

K-近邻算法

优点:精度高、对异常值不敏感、无数据输入假定。

缺点:计算复杂度高、空间复杂度高。

适用范围:数值型和离散型(标称型)。

工作原理:

存在一个样本数据集合,也称训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最邻近)的分类标签。一般来说,我们只选择样本集中前K个最相似的数据,这就是K-近邻算法中K的出处,通常K是不大于20的整数。最后,选择K个最相似数据中出现次数最多的分类,最为新数据的分类。

对预测的每条数据依次执行以下操作:

(1)计算已知类别数据集中的点与当前点之间的距离

(2)按照距离递增依次排序

(3)选取与当前点距离最小的K个点

(4)确定前K个点所在的类别出现的频率

(5)返回前K个点出现频率最高的类别作为当前点的预测分类。

sklearn中KNeighborsClassifier的介绍

class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights=‘uniform’, algorithm=‘auto’, leaf_size=30, p=2, metric=‘minkowski’, metric_params=None, n_jobs=None, **kwargs)

n_neighbors: int, 可选参数(默认为 5)

用于kneighbors查询的默认邻居的数量

weights(权重): str or callable(自定义类型), 可选参数(默认为 ‘uniform’)

用于预测的权重函数。可选参数如下:

‘uniform’ : 统一的权重. 在每一个邻居区域里的点的权重都是一样的。

‘distance’ : 权重点等于他们距离的倒数。使用此函数,更近的邻居对于所预测的点的影响更大。

[callable] : 一个用户自定义的方法,此方法接收一个距离的数组,然后返回一个相同形状并且包含权重的数组。

algorithm(算法): {‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}, 可选参数(默认为 ‘auto’)

计算最近邻居用的算法:

‘ball_tree’ 使用算法BallTree

‘kd_tree’ 使用算法KDTree

‘brute’ 使用暴力搜索.

‘auto’ 会基于传入fit方法的内容,选择最合适的算法。

注意 : 如果传入fit方法的输入是稀疏的,将会重载参数设置,直接使用暴力搜索。

leaf_size(叶子数量): int, 可选参数(默认为 30)

传入BallTree或者KDTree算法的叶子数量。此参数会影响构建、查询BallTree或者KDTree的速度,以及存储BallTree或者KDTree所需要的内存大小。 此可选参数根据是否是问题所需选择性使用。

p: integer, 可选参数(默认为 2)

用于Minkowski metric(闵可夫斯基空间)的超参数。p = 1, 相当于使用曼哈顿距离 (l1),p = 2, 相当于使用欧几里得距离(l2)  对于任何 p ,使用的是闵可夫斯基空间(l_p)

metric(矩阵): string or callable, 默认为 ‘minkowski’

用于树的距离矩阵。默认为闵可夫斯基空间,如果和p=2一块使用相当于使用标准欧几里得矩阵. 所有可用的矩阵列表请查询 DistanceMetric 的文档。

metric_params(矩阵参数): dict, 可选参数(默认为 None)

给矩阵方法使用的其他的关键词参数。

n_jobs: int, 可选参数(默认为 1)

用于搜索邻居的,可并行运行的任务数量。如果为-1, 任务数量设置为CPU核的数量。不会影响fit方法。

KNeighborsClassifier的方法(官方文译)

K值选择

如果选择较小的K值,就相当于用较小的领域中的训练实例进行预测,“学习”近似误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是“学习”的估计误差会增大,换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合;

如果选择较大的K值,就相当于用较大领域中的训练实例进行预测,其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时候,与输入实例较远(不相似的)训练实例也会对预测启作用,使预测发生错误,且K值的增大就意味着整体的模型变得简单。

K=N,则完全不足取,因为此时无论输入实例是什么,都只是简单的预测它属于在训练实例中最多的类,模型过于简单,忽略了训练实例中大量有用信息。

在实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法(简单来说,就是一部分样本做训练集,一部分做测试集)来选择最优的K值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值