码迷,mamicode.com
首页 > 其他好文 > 详细

KNN

时间:2017-08-18 13:39:17      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:二分查找   维度   分类   部分   计算   指标   居中   特殊   多变量   

分类算法——KNN(k-nearest neighbor classification)

算法:

1、给定测试对象,计算它与训练集中每个对象的距离

2、选择距离最近的k个对象

3、根据k个对象中占优势的类别,判断测试对象的类别

问题点讨论:

1、距离

用距离作为相似度的度量,即距离越远,相似度就越差

距离选择

欧氏距离:

单纯的计算各个维度的绝对距离,每个坐标(维度)对距离的贡献是相等的,没有考虑各维度属性之间的差别,例如身高、体重,当身高单位为cm,体重单位为kg,它们之间的在数值相差很多,这就导致cm轴所占比重会过大,结果也就不准确

因此需要保证各维度指标在相同的刻度级别,即每一维特征单位需要在同一级别,可以对每一维数据进行归一化

马氏距离:

利用协方差矩阵(多变量之间的相关性),考虑到特性之间的关系,不受量纲(单位)的影响,排除变量之间相关性的影响

但协方差矩阵不稳定,有时计算不出;夸大了微小变量的作用

总结:关于距离的选择有很多种,每种距离都有其独特特性,具体的选择需要根据实际需求判断

2、k值选择

k较小时,那么分类结果取决于离测试样本最近的对象,分类精度会受到影响,也可能会导致过拟合

k较大时,模型过于简单,特别是对于整体类别本身较少时,分类结果也会受到影响

采用交叉验证

用某种方式将数据集分成两类,一类训练集,一类测试集,首先利用训练集对分类器进行训练,再利用测试集来测试得到的模型,以此来作为评价分类性能的指标。
一般要尽量满足:
(1)训练集的比例要足够多,一般大于一半
(2)训练集和测试集要均匀抽样

具体的数据集如何分类将在之后的博文中讨论

3、搜索k个邻近点

一般采用线性搜索,即穷举搜索,为了提高搜索的效率,可以考虑使用特殊的结构存储训练数据,以减小计算距离的次数

kd树:储存k维空间实例点,并进行快速搜索(类似二分查找)

若特征维度D,样本数量N,线性搜索时计算复杂度为O(DN),kd数为O(DlogN)

构造:对每一维空间进行划分,构成一系列D维空间区域

选择哪一维空间进行划分:

(1)随机

(2)选择数据较分散的那一维,越分散越不可能属于同一个空间,分散程度:方差

在每一维如何划分数据:中位数

搜索:可以省去对大部分数据点的搜索,从而减少搜索的计算量

具体搜索过程比较复杂,不再赘述

4、缺点:

(1)需要储存全部训练样本

(2)需要不断计算距离,算法时间复杂的高

减少计算方法:事先对已知样本点进行剪辑,事先去除对分类作用不大的样本,但对于样本数本身较小的类域则不太适合

       对数据集每种分类求质心,并计算质心与未知样本的距离,选取距离较近的几组,可以排除一些数据集样本

(3)样本不平衡时,即某一类样本数量过多,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数

可以利用距离加权改善,对距离近的样本赋予较大权重

在不同场景下利用自适应k提高分类结果的准确性(eg:利用贪心法,针对文件分类实做可调整权重的k最近邻居法WAkNN (weighted adjusted k nearest neighbor),以促进分类效果)

总结:

以上就是在学习KNN算法时遇到的问题,还有一些拓展部分将在后续学习中继续深入,关于一些算法的优化和问题,也会在后续进行仿真验证

 

KNN

标签:二分查找   维度   分类   部分   计算   指标   居中   特殊   多变量   

原文地址:http://www.cnblogs.com/unicornlll/p/7388937.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!