第九章 KNN(K最近邻分类算法)

1、惰性学习法

        说到惰性学习法,就要提到急切学习法。

        急切学习法:给定训练集, 在接收待分类的新元祖(如检验元组)之前,就构造泛化(即分类)模型。如:决策树归纳、贝叶斯分类、基于规则的分类、后向传播分类、支持向量机和基于关联规则挖掘的分类等。

        惰性学习法(也称为基于实例的学习法):给定一个训练元组,简单地存储它 (或只是稍加处理) ,一直等到给定一个检验元组。仅当看到检验元组时,它才进行泛化,以便根据存储的训练元组的相似性对该元组进行分类。

        优点:原理简单,实现起来比较方便。支持增量学习。能对超多边形的复杂决策空间建模。

        缺点:计算开销大,需要有效的存储技术和并行硬件的支撑。

        K近邻算法就是惰性学习法的例子。

2、K近邻算法(KNN算法)

        k最近邻分类法是20世纪50年代早期首次引进的。给定大量训练集时,该方法是劳动密集的,直到20世纪60年代计算能力大大增强之后才流行起来。此后被广泛用于模式识别领域。

        工作原理:存在一个样本数据集合(训练样本集),并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据。最后,选择k个最相似数据中出现次数最多的分类,最为新数据的分类。

        例子:下图中,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。

2.1  邻近性的度量方法

        “邻近性”用距离度量,距离越大,表示两个点越不相似。

        计算距离的方法:欧几里得距离、曼哈顿距离或其它距离。但多采用欧几里得距离(简单)。

        例:两个点或元组X1=(x11,x12,...,x1n)和X2=(x21,x22,...,x2n)的欧几里得距离是:

      

        换言之,对于每个数值属性,取元组X1和X2该属性对应值的差,取差的平方并累计。并取累计距离计数的平方根。

2.2  属性的数值规范化

        有助于防止具有较大初始值域的属性(如收入)比具有较小初始值域的属性(如二元属性)的权重过大。

        例如,可以通过计算下式,使用最小—最大规范化将数值属性A的值v变换到[0,1]区间中的v'

        其中minA和maxA分别是属性A的最小值和最大值。

2.3  比较的属性不是数值类型而是分类类型(如颜色),如何计算距离?

        对于分类属性,一种简单的方法是比较元组X1和X2中对应属性的值。如果二者相同(例如,元组X1和X2都是蓝色),则二者之间的差为0。如果二者不同(例如,元组X1是蓝色,而元组X2是红色),则二者之间的差为1。

        其他方法可采用更复杂的方案。(例如,对蓝色和白色赋予比蓝色和黑色更大的差值。)

2.4  缺失值的处理

        解决办法:取最大的可能差。

        对于分类属性,假设每个属性都已经映射到[0,1]区间,如果属性A的一个或两个对应值丢失,则取差值为1;

        如果A是数值属性,若两个比较的元组属性A的值均缺失,则取差值为1,若只有一个缺失,另一个存在并且已经规范化(记作v'),则取差值为|1-v'|和|0-v'|中的最大者。

2.5  确定近邻数k的值

        引用李航博士的书【统计学习方法】中的内容:

        K值的选择会对k近邻法的结果产生重大影响。

        如果选择较小的K值,就相当于用较小的邻域中的训练实例进行预测,“学习”的近似误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用。但缺点是“学习”的估计误差会增大,预测结果会对近邻的实例点非常敏感。如果近邻的实例点恰巧是噪声,预测就会出错。换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合。

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

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

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

        引用【数据挖掘概念与技术】中的内容:

         可以通过实验确定。

         从k=1开始,使用检验集估计分类器的误差率。重复该过程,每次k增值1,允许增加一个近邻。选取产生最小误差率的k。

         一般,训练元组数越多,k的值越大。

2.6  对噪声数据或不相关属性的处理

        最近邻分类法使用基于距离的比较,本质上赋予每个属性相等的权重。因此,当数据存在噪声或不相关属性时,它们的准确率可能会受到影响。

        对属性赋予相关性权重w,w越大说明属性对分类的影响越相关。对噪声数据可以将所在的元组直接cut掉。

2.7  算法流程


2.8 算法的改进策略

        最近邻分类法在对检验元组分类时可能非常慢。如果D是具有|D|个元组的训练数据库,而k=1,则对一个给定的检验元组分类需要O(|D|)次比较。改进如下

3、kd

        上面“算法的改进策略”已经提到了搜索树。

        其实,实现k近邻算法时,考虑的主要问题是如何对训练数据进行快速k近邻搜索。这点在特征空间的维数大及训练数据容量大时尤其重要。

        K近邻法最简单的实现方法是线性扫描。这时要计算输入实例与每一个训练实例的距离。当训练集很大时,计算耗时,这种方法是不可行的。

        为了提高k近邻搜索的效率,可以考虑使用特殊的结构存储训练数据,以减少计算距离的次数。具体方法很多,其中比较常见的是kd方法。

 

        Kd树的详细介绍:

        参见:

        1、李航博士的《统计学习方法》中的章节(k近邻法的实现:kd树)

        2、大牛的博客

 

 

更多文献:可以参见大牛的博客

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值