美文网首页
KNN:如何对手写数字进行识别?

KNN:如何对手写数字进行识别?

作者: 疯狂的小强_94ee | 来源:发表于2019-04-24 22:17 被阅读0次

    KNN 的英文叫 K-Nearest Neighbor,应该算是数据挖掘算法中最简单的一种。

    1.  KNN的工作原理

    “近朱者赤,近墨者黑”可以说是 KNN 的工作原理。整个计算过程分为三步:

    (1)计算待分类物体与其他物体之间的距离;

    (2)统计距离最近的 K 个邻居;

    (3)对于 K 个最近的邻居,它们属于哪个分类最多,待分类物体就属于哪一类。

    2.  K 值如何选择

    K 值的选择还是很重要的,那么K 值选择多少是适合的呢?

    (1)如果 K 值比较小,就相当于未分类物体与它的邻居非常接近才行。这样产生的一个问题就是,如果邻居点是个噪声点,那么未分类物体的分类也会产生误差,这样 KNN 分类就会产生过拟合。

    (2)如果 K 值比较大,相当于距离过远的点也会对未知物体的分类产生影响,虽然这种情况的好处是鲁棒性强,但是不足也很明显,会产生欠拟合情况,也就是没有把未分类物体真正分类出来。

    所以 K 值应该是个实践出来的结果,并不是事先而定的。在工程上,一般采用交叉验证的方式选取 K 值。

    3.  距离

    在 KNN 算法中,还有一个重要的计算就是关于距离的度量。两个样本点之间的距离代表了这两个样本之间的相似度。距离越大,差异性越大;距离越小,相似度越大。

    距离的计算方式有下面五种方式:

    (1)欧氏距离; 

    (2)曼哈顿距离;

    (3)闵可夫斯基距离; 

    (4)切比雪夫距离;

    (5)余弦距离。

    其中前三种距离是 KNN 中最常用的距离。

    4.   KD 树

    KNN 的计算过程是大量计算样本点之间的距离。为了减少计算距离次数,提升 KNN 的搜索效率,人们提出了 KD 树(K-Dimensional 的缩写)。

    KD 树是对数据点在 K 维空间中划分的一种数据结构。在 KD 树的构造中,每个节点都是 k 维数值点的二叉树。

    5 KNN 做回归

    对于一个新点,找出k个最近邻居,将他们的属性加权平均赋给改点。

    6  KNN分类

    构造函数 KNeighborsClassifier(n_neighbors=5, weights=‘uniform’, algorithm=‘auto’, leaf_size=30)

    (1)n_neighbors:即 KNN 中的 K 值,代表的是邻居的数量。K 值如果比较小,会造成过拟合。如果 K 值比较大,无法将未知物体分类出来。一般我们使用默认值 5。

      (2) weights:是用来确定邻居的权重,有三种方式:

           weights=uniform,代表所有邻居的权重相同;

           weights=distance,代表权重是距离的倒数,即与距离成反比;

           自定义函数,你可以自定义不同距离所对应的权重。大部分情况下不需要自己定义函数。

      (3) algorithm:用来规定计算邻居的方法,它有四种方式:

        algorithm=auto,根据数据的情况自动选择适合的算法,默认情况选择 auto;

        algorithm=kd_tree,也叫作 KD 树,是多维空间的数据结构,方便对关键数据进行检索,不过 KD 树   适用于维度少的情况,一般维数不超过 20,如果维数大于 20 之后,效率反而会下降;

        algorithm=ball_tree,也叫作球树,它和 KD 树一样都是多维空间的数据结果,不同于 KD树,球树更适用于维度大的情况;

        algorithm=brute,也叫作暴力搜索,它和 KD 树不同的地方是在于采用的是线性扫描,而不

    是通过构造树结构进行快速检索。当训练集大的时候,效率很低。

     (4)leaf_size:代表构造 KD 树或球树时的叶子数,默认是 30,调整 leaf_size 会影响到树的构造和搜索速度。

    代码: https://github.com/gzhold/DataAnalysis/tree/master/sklearn/knn

    相关文章

      网友评论

          本文标题:KNN:如何对手写数字进行识别?

          本文链接:https://www.haomeiwen.com/subject/pumigqtx.html