KNN(K-Nearest Neighbor)最邻近分类算法的实现原理及模型参数解析

KNN(K-Nearest Neighbor)最邻近分类算法的实现原理及模型参数解析

KNN最邻近分类算法的实现原理:

为了判断未知样本的类别,以所有已知类别的样本作为参照,计算未知样本与所有已知样本的距离,从中选取与未知样本距离最近的K个已知样本,根据少数服从多数的投票法则(majority-voting),将未知样本与K个最邻近样本中所属类别占比较多的归为一类。

KNN算法的关键:

(1) 样本的所有特征都要做可比较的量化
若是样本特征中存在非数值的类型,必须采取手段将其量化为数值。例如样本特征中包含颜色,可通过将颜色转换为灰度值来实现距离计算。

(2) 样本特征要做归一化处理
样本有多个参数,每一个参数都有自己的定义域和取值范围,他们对距离计算的影响不一样,如取值较大的影响力会盖过取值较小的参数。所以样本参数必须做一些 scale 处理,最简单的方式就是所有特征的数值都采取归一化处置。

(3) 需要一个距离函数以计算两个样本之间的距离
通常使用的距离函数有:欧氏距离、余弦距离、汉明距离、曼哈顿距离等,一般选欧氏距离作为距离度量,但是这是只适用于连续变量。在文本分类这种非连续变量情况下,汉明距离可以用来作为度量。通常情况下,如果运用一些特殊的算法来计算度量的话,K近邻分类精度可显著提高,如运用大边缘最近邻法或者近邻成分分析法。

(4) 确定K的值
K值选的太大易引起欠拟合,太小容易过拟合,需交叉验证确定K值。
太大虽然会减少噪声数据对模型的影响,但是会容易忽略重要模式;太小则容易受到噪声数据的影响。经验值 是 3-10 个。

KNN算法的优点:

1.简单,易于理解,易于实现,无需估计参数,无需训练;

2.适合对稀有事件进行分类;

3.特别适合于多分类问题(multi-modal,对象具有多个类别标签), kNN比SVM的表现要好。对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。

KNN算法的缺点:

KNN算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数,如下图所示。该算法只计算最近的邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。

该方法的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。

可理解性差,无法给出像决策树那样的规则。

Skelarn KNN参数概述

def KNeighborsClassifier(n_neighbors = 5,
weights=‘uniform’,
algorithm = ‘’,
leaf_size = ‘30’,
p = 2,
metric = ‘minkowski’,
metric_params = None,
n_jobs = None
)

  • n_neighbors:这个值就是指 KNN 中的 “K”了。前面说到过,通过调整 K 值,算法会有不同的效果。

  • weights(权重):最普遍的 KNN 算法无论距离如何,权重都一样,但有时候我们想搞点特殊化,比如距离更近的点让它更加重要。这时候就需要 weight 这个参数了,这个参数有三个可选参数的值,决定了如何分配权重。参数选项如下:
    • ‘uniform’:不管远近权重都一样,就是最普通的 KNN 算法的形式。
    • ‘distance’:权重和距离成反比,距离预测目标越近具有越高的权重。
    • 自定义函数:自定义一个函数,根据输入的坐标值返回对应的权重,达到自定义权重的目的。

  • algorithm:在 sklearn 中,要构建 KNN 模型有三种构建方式,1. 暴力法,就是直接计算距离存储比较的那种放松。2. 使用 kd 树构建 KNN 模型 3. 使用球树构建。 其中暴力法适合数据较小的方式,否则效率会比较低。如果数据量比较大一般会选择用 KD 树构建 KNN 模型,而当 KD 树也比较慢的时候,则可以试试球树来构建 KNN。参数选项如下:
    • ‘brute’ :蛮力实现
    • ‘kd_tree’:KD 树实现 KNN
    • ‘ball_tree’:球树实现 KNN
    • ‘auto’: 默认参数,自动选择合适的方法构建模型
    不过当数据较小或比较稀疏时,无论选择哪个最后都会使用 ‘brute’

  • leaf_size:如果是选择蛮力实现,那么这个值是可以忽略的,当使用KD树或球树,它就是是停止建子树的叶子节点数量的阈值。默认30,但如果数据量增多这个参数需要增大,否则速度过慢不说,还容易过拟合。

  • p:和metric结合使用的,当metric参数是"minkowski"的时候,p=1为曼哈顿距离, p=2为欧式距离。默认为p=2。

  • metric:指定距离度量方法,一般都是使用欧式距离。
    • ‘euclidean’ :欧式距离
    • ‘manhattan’:曼哈顿距离
    • ‘chebyshev’:切比雪夫距离
    • ‘minkowski’: 闵可夫斯基距离,默认参数

  • n_jobs:指定多少个CPU进行运算,默认是-1,也就是全部都算。

你可能感兴趣的:(分类,机器学习)