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

01KNN方法简介

时间:2016-04-10 14:58:46      阅读:417      评论:0      收藏:0      [点我收藏+]

标签:

以上为中继点老师课堂笔记,请注意版权

KNN 思路


kNN算法又称为k近邻分类(k-nearest neighbor classification)算法。

最简单平凡的分类器就是死记硬背式的分类器,记住所有的训练数据,对于新的数据则直接和训练数据匹配,如果存在相近属性的训练数据,则直接用它的分类来作为新数据的分类。这种方式有一个明显的缺点,那就是很可能一个新数据与训练数据属性值差异很大时,无法找到完全匹配的训练记录。

kNN算法则是从训练集中找到和新数据最接近的k条记录,然后根据他们的主要分类来决定新数据的类别。该算法涉及3个主要因素:训练集、距离或相似的衡量、k的大小。


行业应用
    - 比如文字识别,面部识别
    - 预测某人是否喜欢推荐的电影(Netflix)
    - 基因模式识别,比如用于检测某种疾病
    - 客户流失预测、欺诈侦测等(更适合于稀有事件的分类问题)

KNN应用场景

通常最近邻居分类器适用于特征与目标类之间的关系为比较复杂的数字类型,或者说二者关系难以理解,但是相似类间特征总是相似。kNN算法:

    - 简单有效,对数据分布没有假设,数据训练也很快
    - 但是它没有模型输出,因此限制了对特征间关系的理解
    - 分类阶段也比较慢,耗费内存
    - 对nominal特征以及缺少数据需要预先处理


算法要点


指导思想

kNN算法的指导思想是“近朱者赤,近墨者黑”,根据与待分类数据集中的最近的k个训练集中的分类标签来对决定其类别

    - 算距离:给定测试对象,计算它与训练集中的每个对象的距离
    - 找邻居:圈定距离最近的k个训练对象,作为测试对象的近邻
    - 做分类:根据这k个近邻归属的主要类别,来对测试对象分类

距离或相似度的衡量
    - 什么是合适的距离衡量?距离越近应该意味着这两个点属于一个分类的可能性越大。
    - 距离衡量包括欧式距离、夹角余弦,曼哈顿距离等。
    - 对于文本分类来说,使用余弦(cosine)来计算相似度就比欧式(Euclidean)距离更合适。


欧几里德距离
技术分享


余弦距离

技术分享



为何使用余弦距离

以判断用户的喜欢为例,基于余弦相似度的计算方法就是把用户的喜好作为n-维坐标系中的一个点,通过连接这个点与坐标系的原点构成一条直线(向量),两个用户之间的相似度值就是两条直线(向量)间夹角的余弦值。因为连接代表用户评分的点与原点的直线都会相交于原点,夹角越小代表两个用户越相似,夹角越大代表两个用户的相似度越小。


调和余弦距离

余弦相似度更多的是从方向上区分差异,而对绝对的数值不敏感。因此没法衡量每个维数值的差异,会导致这样一个情况:比如用户对内容评分,5分制,X和Y两个用户对两个内容的评分分别为(1,2)和(4,5),使用余弦相似度得出的结果是0.98,两者极为相似,但从评分上看X似乎不喜欢这2个内容,而Y比较喜欢,余弦相似度对数值的不敏感导致了结果的误差,需要修正这种不合理性,就出现了调整余弦相似度,即所有维度上的数值都减去一个均值,比如X和Y的评分均值都是3,那么调整后为(-2,-1)和(1,2),再用余弦相似度计算,得到-0.8, 相似度为负值并且差异不小,但显然更加符合现实


欧几里德还是余弦距离?

根据欧氏距离和余弦相似度各自的计算方式和衡量特征,分别适用于不同的数据分析模型:

    - 欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异
    - 余弦相似度更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分用户兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦相似度对绝对数值不敏感)


类别的判定
    - 

投票决定:少数服从多数,近邻中哪个类别的点最多就分为该类。

    - 

加权投票法:根据距离的远近,对近邻的投票进行加权,距离越近则权重越大(权重为距离平方的倒数)

技术分享

技术分享

技术分享



优缺点

优点
    - 简单,易于理解,易于实现,无需估计参数,无需训练
    - 适合对稀有事件进行分类(例如当流失率很低时,比如低于0.5%,构造流失预测模型)
    - 特别适合于多分类问题(multi-modal,对象具有多个类别标签),例如根据基因特征来判断其功能分类,kNN比SVM的表现要好

缺点
    - 懒惰算法,对测试样本分类时的计算量大,内存开销大,评分慢
    - 可解释性较差,无法给出决策树那样的规则。


常见问题

k值设定为多大?

很明显k的选择对最终结果大有影响,这就是机器学习中几点的bias与variance取舍问题,鱼和熊掌不可兼得。如果k很大,那么可以减少干扰数据的影响,但是此时就导致了系统性偏差,比如如果取k为总的训练数据数,那么每次投票肯定都是训练数据中多的类别胜利。显然训练数据的系统性偏差会影响结果。而如果k=1,那么某个干扰数据或者异常数据会影响最终结果的准确性,所以我们始终是在bias与variance直接取舍。

技术分享


K取值
    - k通常会在3~10直接取值
    - 或者是k等于训练数据的平方根。比如15个数据,可能会取k=4
    - k取较大值,但是我们在投票时权重不同

类别如何判定最合适?

投票法没有考虑近邻的距离的远近,距离更近的近邻也许更应该决定最终的分类,所以加权投票法更恰当一些。


如何选择合适的距离衡量?
    - 高维度对距离衡量的影响:众所周知当变量数越多,欧式距离的区分能力就越差。
    - 变量值域对距离的影响:值域越大的变量常常会在距离计算中占据主导作用,因此应先对变量进行标准化。


数据的预处理

有了计算距离的方法,也有了k的取值,是否我们就可以开始分类了?简单考虑一下,比如我们度量各个特征的时候刻度单位不同,那么会带来什么问题。特征A取值是从0~1,另一个特征B则是0~10000,这里特征B的1000,不代表是特征A 的1的1000倍,因此我们要对数据进行标准化。传统的是采用最小最大值标准化方法:


技术分享


数据预处理

数据已经标准化了是否就ok了?不是的,欧几里德距离只能用于数字,对于nominal变量(分类变量),无法处理。这个时候我们可以通过dummy(哑元)来处理。比如:

    - 性别为male就取1
    - 其它取0

那如果不止2类,是多个呢?一种方法就是我创建(n-1)个哑元变量,还有一种就是如果你的分类变量是有顺序的,而且每一级间的间隔是固定的那你可以用比如1,2,3来代表冷,温暖,热。不过这时一定要注意这个间隔的问题,比如穷人,中产,富人,显然中产和穷人,富人和中产的差距就不是一样的。


训练样本是否要一视同仁?
    - 在训练集中,有些样本可能是更值得依赖的
    - 可以给不同的样本施加不同的权重,加强依赖样本的权重,降低不可信赖样本的影响。


性能问题
    - kNN是一种懒惰算法,平时不好好学习,考试(对测试样本分类)时才临阵磨枪(临时去找k个近邻)。
    - 懒惰的后果:构造模型很简单,但在对测试样本分类地的系统开销大,因为要扫描全部训练样本并计算距离。
    - 已经有一些方法提高计算的效率,例如压缩训练样本量等。


KNN,LDA,logistic回归:
    - KNN则是非参估计,对分布没有任何假设,灵活性更强,那么在决策边界非线性可分的时候KNN可能会有更好结果。不过KNN不可解释,无法告诉你那个变量更重要
    - 虽然LDA与logistic的区别在于fitting过程不同,然而LDA有observation是有共同协方差矩阵的高斯分布的假设。因此在observation满足这一假设时,LDA会有更好结果,而这一假设不满足时候logistic则会有更好结果
    - QDA,则是在KNN与LDA/logistic之间的折衷。QDA采用二次曲线边界可以比线性方法更好进行划分



案例说明



背景

乳腺癌的早期检测来源对乳腺异常包块的检测。如果存在包块,那么会继续乳腺穿刺取样,之后利用显微镜下的分析来判断是良性还是恶性。如果我们可以用机器学习来完成癌症细胞的自动识别则我们可以为健康系统带来大大好处,比如检测效率的提升。同时自动的筛选系统可以大大减少人工的主观性。



数据准备

使用Breast Cancer Wisconsin Diagnostic数据集:

    - 数据: http://mlr.cs.umass.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data
    - 数据说明 http://mlr.cs.umass.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.names

01KNN方法简介

标签:

原文地址:http://blog.csdn.net/boss111/article/details/51107405

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