01KNN方法简介

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

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

时间: 2024-08-29 17:55:50

01KNN方法简介的相关文章

C#——Marshal.StructureToPtr方法简介

目录 MarshalStructureToPtr方法简介 功能及位置 语法 参数说明 异常 备注 举例 本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一.小鱼)相关研究.学习内容所做的笔记,欢 迎广大朋友指正! 具体可以参考http://msdn.microsoft.com. Marshal.StructureToPtr方法简介 1. 功能及位置 将数据从托管对象封送到非托管内存块,属于.NET Framework 类库命名空间:System.

Datatable的Select()方法简介

DataTable是我们在进行开发时经常用到的一个类,并且经常需要对DataTable中的数据进行筛选等操作,下面就介绍一下Datatable中经常用到的一个方法——Select,微软提供了四个函数的重载,分别是 Select() Select(string filterExpression) Select(string filterExpression, string sort) Select(string filterExpression,string sort, DataViewRowSt

$.getJSON( )的使用方法简介

JSON(JavaScript Object Notation)即JavaScript对象表示法,是一种轻量级的数据交换格式.它非常便于编程人员对数据的处理,也便于机器对数据的解析和生成,应用非常广泛. json文件可以保存为"test.json"这样的文件,json数据的一般格式如下("{ }"中的为对象,"[ ]"中的为数组): {"total":3,"rows":[{"userId"

Level Set方法简介

originate from: http://www.cnblogs.com/tabatabaye/articles/891232.html Level Set方法简介: Level Set方法是由Sethian和Osher于1988年提出,最近十几年得到广泛的推广与应用.简单的说来,Level Set方法把低维的一些计算上升到更高一维,把N维的描述看成是N+1维的一个水平.举个例子来说,一个二维平面的圆,如x^2+y^2=1可以看成是二元函数f(x,y)=x^2+y^2的1水平,因此,计算这个

iOS中常用的四种数据持久化方法简介

iOS中常用的四种数据持久化方法简介 iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data 1.属性列表涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults standardUserDefaults]就够用了 @interface User : NSObject <NSCoding>@property (nonatomic, assign) NSInteger userID;@property (nonatomic,

苍狼敏捷需求用例分析方法简介并讲义下载

作者:张克强    作者微博:张克强-敏捷307 用例分析方法已经有不短的历史,发展出了多种用例分析方法.笔者花费了大量时间,对用例分析的各个方面进行实践和分析,得到如下系列文章: 需求用例分析之一:异常流 需求用例分析之二:级别设置需求用例分析之三:补充规约 需求用例分析之四:业务规则 需求用例分析之五:业务用例之Rational系 需求用例分析之六:业务用例之科伯恩系 需求用例分析之七:业务用例之小结 需求用例分析之八:用例颗粒度 在这些分析的基础上与及笔者的实践,总结整理得到"苍狼敏捷需求

ATAM 方法简介

ATAM  方法简介 1.ATAM 是啥 ATAM 是一种基于场景评估方式,英文全称 Architecture TradeOff Analysis Method ATAM(架构权衡分析法) 2.ATAM评估方法 ATAM 方法对软件架构进行评估的目的主要是 根据系统质量属性和业务需求评估决策结果,ATAM希望揭示出架构满足质量目标,架构设计者能够更清楚的认识到质量目标之间的联系.即如何权衡多个目标 3.ATAM的参与者 开发人员,领域专家,测试人员,客户代表,用户等 4.如何展开评估活动 这里将

xtrabackup使用方法简介

关于xtrabackup的简介就不再赘述,百度一堆,使用方法也说明也很多.感觉还是只有自己试过之后才能有更深刻的认识,以下的使用说明基于官方文档及自己试验过程,记录下备查. 安装: 去percona-xtrabackup官网上下载,有rpm包.tar包,也有解压直接可用的二进制包.我试验采用的二进制包. 由于里面的innobackupx命令实际上是用perl语言封装了xtrabackupx而成,所以使用innobackupx命令要先检查perl包以及其依赖包的安装情况. 可以执行yum inst

delphi fastMM 使用方法简介

delphi fastMM 使用方法简介 在 http://sourceforge.net/projects/fastmm 中可以下载到最新 stable 的 FastMM,当前推荐的是 4.62,主要特点包括: 1.彻底实现了 Borland 的内存管理器,可以完全取代现有的内存管理器("取代"就是第一个 uses FastMM4,that is all ...) 2.实现了内存管理器共享机制,Exe 和 Dll 间共享内存管理器不需要任何 Dll 支持 3.集成了内存泄漏检测功能