机器学习算法——KNN

        K Nearest Neighbor算法又叫KNN算法,是机器学习里面一个经典的算法。其中的K表示最接近自己的K个数据样本就,一般K取奇数,这是为了使投票的时候不会出现平票的情况。

算法直观理解:有一个样本空间里的样本分成很几个类型,然后,给定一个待分类的数据,通过计算接近自己最近的K个样本来判断这个待分类数据属于哪个分类。

简单理解:由那离自己最近的K个点来投票决定待分类数据归为哪一类

先引用Wikipedia上的KNN词条中有一个比较经典的图来说明下KNN算法:


从上图中可以看到,图中的有两个类型的样本数据,一类是蓝色的正方形,另一类是红色的三角形。而那个绿色的圆形是我们待分类的数据。

  • 如果K=3,那么离绿色点最近的有2个红色三角形和1个蓝色的正方形,这3个点投票,于是绿色的这个待分类点属于红色的三角形。
  • 如果K=5,那么离绿色点最近的有2个红色三角形和3个蓝色的正方形,这5个点投票,于是绿色的这个待分类点属于蓝色的正方形。

以上是关于该算法的简单直观的引入和解释,下面开始讲KNN算法的思想:
        KNN是建立一种对函数形式没有假设的分类方法。令输入样本为X=(x1,x2,…xl),方程 y=f(x1,x2,…xl),把因变量(样本的类别标识)和自变量(样本的属性)联系起来,KNN算法所做的唯一假设是:认为函数 F 是一个光滑的函数,也就是说,KNN算法是一个非参数的方法,因为它不涉及在一个假设了函数形式的方程中进行参数估计,这和我们在线性回归中碰到的线性假设和系数求解完全不同。



KNN距离度量

距离函数的定义:D( , )是距离函数,满足如下四个性质:

(1)非负性:D(X,X)>=0 

(2) z自反性: D(X,Z)=0 当且仅当 X=Z

(3)对称性:D(X,Z)=D(Z,X) 

(4)三角不等式:D(X,Z)<=D(X,V)+D(V,Z) 

通常d维空间里的欧几里得距离能满足上述性质,而且我们常用此来计算,但务必注意:这样得到的距离值未必总是有意义的。例如,对每一个坐标轴乘以一个任意常数,虽然只是改变了每一个属性的单位,但是变换后的距离关系和原来的可能完全不同。


上图中,将x轴变为原来的1/3,这时原来(a)中黑点是最近的,在(b)中变成了灰色点。


KNN算法步骤:

step.1---初始化距离为最大值

step.2---计算未知样本和每个训练样本的距离dist

step.3---得到目前K个最临近样本中的最大距离maxdist

step.4---如果dist小于maxdist,则将该训练样本作为K-最近邻样本

step.5---重复步骤2、3、4,直到未知样本和所有训练样本的距离都算完

step.6---统计K-最近邻样本中每个类标号出现的次数

step.7---选择出现频率最大的类标号作为未知样本的类标号


时间复杂度计算:

       假设属性空间的维数为l,训练样本数目为n。

        KNN算法要做的就是寻找距离测试点 X 最近的 k 个训练样本,在最简单的 1-NN 方法中,需要搜索每一个训练样本点,找出距离X最近的那一个。假设采用的是欧几里得距离,计算测试点与一个训练样本的距离其复杂度为 O(l),因此这样的搜索方法总的计算复杂度为 O(l * n^2)。当训练数据集的规模很大,维数较多时,利用最邻近进行分类的时间比较长。

为了降低KNN的搜索复杂度,有3种通用的方法:1、降维法;2、预建结构法;3、训练集裁剪法。


K值的选取:

      如果k足够大,能够覆盖所有训练样本,则变成了朴素贝叶斯模型,即哪一类的训练样本多(也就是出现的频率高),就判断为哪一类。结果会非常不准确。

      如果k数值过小,决策边界将会变得很不稳定。训练样本的小变化将会导致分类结果的大变化。(例如去掉了距离 x 最近的一个样本的话,分类可能会完全变成另一个分类)。

      实际当中k数值没有很好地选择方法,只能从另一方面来确定,即错误率的大小。将训练集分成两部分,训练集和验证集。对不同的k,使用验证集来检测错误率。选择错误率最小的k。


实际中的一些问题:

1、某个点刚好处于分界线上,距离两个类的距离是一样的

二类分类时:选择奇数k,可以避免这个问题。

多类分类时:a. 随机选择一类 (既然在边界线上了,选择某一类的成本会是一样的)

                     b. 选择先验概率最大的一类(训练样本中出现次数最多)

                     c. 使用1-NN,选择距离最近的一类。

2、 如何加快KNN算法的速度

                     a.减少矩阵的维度

                     b.不要和所有的训练样本进行比较,通过某种算法找到距离最近的一些,对这些进行运算。


K-Means 和 KNN的相似与区别:

之前有篇文章说过 K-Means 算法,点这里

相似点:都包含这样的过程,给定一个点,在数据集中找离它最近的点。即二者都用到了NN(Nears Neighbor)算法,一般用KD树来实现NN。

区别:

KNN

K-Means

1.KNN是分类算法

2.监督学习

3.喂给它的数据集是带label的数据,已经是完全正确的数据

1.K-Means是聚类算法

2.非监督学习

3.喂给它的数据集是无label的数据,是杂乱无章的,经过聚类后才变得有点顺序,先无序,后有序

没有明显的前期训练过程,属于memory-based learning 有明显的前期训练过程
K的含义:来了一个样本x,要给它分类,即求出它的y,就从数据集中,在x附近找离它最近的K个数据点,这K个数据点,类别c占的个数最多,就把x的label设为c K的含义:K是人工固定好的数字,假设数据集合可以分为K个簇,由于是依靠人工定好,需要一点先验知识




关于一些预测、判断和平滑的例子,可以参考一下这篇文章里面的例子,是直接翻译外文的,比较容易懂。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值