KNN分类算法及改进
来源:互联网 发布:淘宝设置信用卡支付 编辑:程序博客网 时间:2024/06/07 14:39
k近邻算法是一种基于实例的算法,即学习过程只是简单的存储已知的训练数据,遇到新的查询实例时,从训练集中取出相似的实例,因此它是一种懒惰(lazy)学习方法。可以为不同的待分类查询实例建立不同的目标函数进行逼近。
k近邻算法原理:
令D为训练数据集,当测试集d出现时,将d与D中所有的样本进行比较,计算他们之间的相似度(或者距离)。从D中选出前k个最相似的样本,则d的类别由k个最近邻的样本中出现最多的类别决定。
k近邻算法关键部分是距离(相似度)函数,对于关系型数据,经常使用欧氏距离,对于文本数据,经常采用余弦相似度。k的选择是通过在训练集上交叉检验,交叉验证一般分为三类:double-fold CV即经常所说的2折交叉;10-fold交叉和LOO(leave one out)CV即留一法交叉。
参考http://blog.163.com/leo666@126/blog/static/1194684712011113085410814/
2折:将原始数据集DataSet均分为两份:一份作为训练集,即trainingSet,一份作为测试集,即testingSet,然后用训练集去做训练,用测试集去验证;之后再将训练集作为测试集,测试集作为训练集进行迭代一次,将两次所得的误差经行处理作为总体数据的预测误差。(注:这里强调一点,就是数据集一定要均分为两份,理由是:作为训练集,数据量一定要不小于测试集,所以在迭代的过程中,使得数据不出现错误情况,必须均分。)
K-折:(在这里说下K-折)是在将数据集分成K个子集,K个子集中得一个作为测试集,而其余的K-1个数据集作为训练集,最后对K个数据子集的错误计算均值,K次迭代验证是对监督学习算法的结果进行评估的方法,数据集的划分一般采用等均分或者随机划分。【来自邵峰晶等编著《数据挖掘原理与算法》中国水利水电出版社】
LOO:这个方法是K折的一种特列,就是把数据分为N份,其实每一份都是一个样本,这样迭代N次,计算最后的误差来作为预测误差。
k近邻的问题:
k近邻简单直接,有效,健壮,在很多情况下可以和复杂的算法性能相同。但是k近邻有三个缺点:
(1)需要更精确的距离函数代替欧氏距离
(2)搜索一个最优的近邻大小代替k
(3)找出更精确的类别概率估计代替简单的投票方法。
针对上述三种问题,提出了三中改进思路:
1.改进距离函数
由于它基于假设测试实例在欧式空间中最相似于近邻的实例的类别。由于实例间距离计算基于实例的所有属性,然而我们搜索的是实例包括不相关属性,标准的欧氏距离将会变得不准确。当出现许多不相关属性时称为维数灾难,kNN对此特别敏感。
解决方法:(1)消除不相关属性即特征选择。Kohavietal提出了一种缠绕法(wrapper)除此外还有贪婪搜索和遗传搜索。
(2)属性加权。w是属性a的权重
‘
当所有的属性不均衡时,属性加权距离函数定义为
Ip (Ai;C)是属性A和类别C的互信息
除此之外,还有一种基于频率的距离函数,称之为相异性度量。与卡方距离相似
值差分度量(VDM)是标称属性的距离函数
C是输出的类别数量,P是输入属性A时输出C的条件概率,VDM在度量连续属性时需要将连续属性映射为标称属性
2.改进近邻距离大小
KNN分类准确率对K值敏感,通过交叉验证方法确定最优的K值。一旦在训练时学习了最优的K值,可以在分类时对所有的测试集使用。DKNN即动态确定K值,所有的算法都需要确定K近邻,为此,在KDTree和NBTree中,实例存储在叶节点上,邻近实例存储在相同或者相近的叶节点上。树的内部节点通过测试选择属性的相关性对测试实例进行排序
3.改进类别概率估计
KNN的实例邻近的类别被认为相同。所以改进算法需要根据他们到测试实例的距离进行加权。
另外一种非常有效的方法是基于概率的局部分类模型,即结合NB算法,这种算法在数据较小的时候表现很好。有研究者发现保持紧邻k很小将减少对于NB强依赖的机会,然而NB的类别估计概率不可信。
- KNN分类算法及改进
- KNN分类算法及其改进
- 文本分类KNN算法
- KNN分类算法
- 分类算法-----KNN
- KNN分类算法详解
- 分类算法之KNN
- 分类算法:kNN
- KNN & NaiveBayes 分类算法
- 分类算法:kNN
- KNN分类算法
- 2.4 分类算法:KNN
- KNN分类算法优缺点
- kNN分类算法
- kNN分类算法
- 【python 编程】文本分类KNN算法实现及结果输出
- KNN分类算法及MATLAB程序与结果
- Hadoop/MapReduce 及 Spark KNN分类算法实现
- Linux学习笔记1
- 【转】Google Maps 图标
- IOS中的UIView
- 简单控制台程序启动过程
- AndroidStudio删除RecentProjects(最近项目)
- KNN分类算法及改进
- x86架构综述
- AngularJs ng-options 无法设置value的问题
- 谷歌浏览器插件 离线安装 AXURE RP EXTENSION For Chrome
- Controller角色和选举
- js中split函数的使用方法说明
- Android触摸事件
- AspNet MVC4 教学-11:Asp.Net MVC4 默认Authorize及自定义Authorize快速Demo
- sqlite3 not found的解决办法