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的类别估计概率不可信。

1 0
原创粉丝点击