【转载】K-NN算法 学习总结
声明:作者:会心一击
出处:http://www.cnblogs.com/lijingchn/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
1. K-NN算法简介
K-NN算法 ( K Nearest Neighbor, K近邻算法 ), 是机器学习中的一个经典算法, 比较简单且容易理解. K-NN算法通过计算新数据与训练数据特征值之间的距离, 然后选取 K (K>=1) 个距离最近的邻居进行分类或者回归. 如果K = 1 , 那么新数据将被分配给其近邻的类.
K-NN算法是一种有监督学习, K-NN算法用于分类时, 每个训练数据都有明确的label, 也可以明确的判断出新数据的label, K-NN用于回归时也会根据邻居的值预测出一个明确的值.
2. K-NN算法的过程
- 选择一种距离计算方式, 通过数据所有的特征计算新数据与已知类别数据集中数据点的距离;
- 按照距离递增次序进行排序, 选取与当前距离最小的 k 个点;
- 对于离散分类, 返回 k 个点出现频率最多的类别作为预测分类; 对于回归, 返回 k 个点的加权值作为预测值.
3. K-NN算法的关键
K-NN 算法的理论和过程都很简单, 但有几个关键点需要特别注意.
3.1 数据特征的量化
如果数据特征中存在非数值型的特征, 则需要采取手段将其量化为数值. 举个例子,若样本特征中包含颜色(红黑蓝)特征, 由于颜色之间没有距离可言, 所以可以通过将颜色转换为灰度值来实现距离计算. 另外, 一般样本有多个参数, 每个参数都有自己的定义域和取值范围, 因而它们对距离计算的影响也就不一样. 比如取值范围较大的参数影响力会盖过取值较小的参数. 所以, 为了公平起见, 样本参数必须做一些scale处理, 最简单的方式就是将所有特征的数值都采取归一化处理.
3.2 计算距离的方法
距离的定义有很多种, 如欧氏距离, 余弦距离, 汉明距离, 曼哈顿距离等. 通常情况下,对于连续变量, 选取欧氏距离作为距离度量; 对于文本分类这种非连续变量, 选取汉明距离来作为度量. 通常如果运用一些特殊的算法来作为计算度量, 可以显著提高 K 近邻算法的分类精度, 如运用大边缘最近邻法或者近邻成分分析法.
3.3 确定 K 值
K是一个自定义的常数, 它的值会直接影响最后的预测结果. 一种选择K值的方法是, 使用 cross-validate(交叉验证)误差统计选择法. 交叉验证就是把数据样本的一部分作为训练样本, 另一部分作为测试样本. 比如选择95%作为训练样本, 剩下的用作测试样本, 通过训练数据集训练出一个机器学习模型, 然后利用测试数据测试其误差率. cross-validate(交叉验证)误差统计选择法就是比较不同K值时的交叉验证平均误差率, 选择误差率最小的那个K值. 例如选择K=1, 2, 3, ... , 对每个K = i 做100次交叉验证, 计算出平均误差, 通过比较选出误差最小的那个.
4. K-NN分类与K-NN回归
4.1 K-NN分类
如果训练样本是多维特征空间向量, 其中每个训练样本都有一个类别标签(喜欢或者不喜欢、保留或者删除). 分类算法常采用 " 多数表决 " 决定, 即k个邻居中出现次数最多的那个类作为预测类. “ 多数表决 ” 分类的一个缺点是出现频率较多的样本将会主导测试点的预测结果, 因为它们出现在测试点的K邻域的几率较大, 而测试点的属性又是通过K领域内的样本计算出来的. 解决这个缺点的方法之一是在进行分类时将K个邻居到测试点的距离考虑进去. 例如, 样本到测试点距离为d, 则选1/d为该邻居的权重(也就是得到了该邻居所属类的权重), 然后统计出k个邻居所有类标签的权重和, 值最大的那个就是新数据点的预测类标签。
举例,K=5, 计算出新数据点到最近的五个邻居的举例是(1, 3, 3, 4, 5), 五个邻居的类标签是(yes, no, no, yes, no). 如果按照多数表决法, 则新数据点类别为no(3个no, 2个yes); 若考虑距离权重, 则类别为yes(no:2/3+1/5, yes:1+1/4).
4.2 K-NN回归
数据点的类别标签是连续值时应用K-NN算法就是回归, 与K-NN分类算法过程相同, 区别在于对K个邻居的处理上. K-NN回归是取K个邻居类标签值得加权作为新数据点的预测值. 加权方法有: K个近邻的属性值的平均值(最差), 1/d为权重(有效的衡量邻居的权重, 使较近邻居的权重比较远邻居的权重大), 高斯函数(或者其他适当的减函数).
5. 总结
K-近邻算法是分类数据最简单最有效的算法, 其学习基于实例, 使用算法时我们必须有接近实际数据的训练样本数据. K-近邻算法必须保存全部数据集, 如果训练数据集的很大, 则会占用大量的存储空间. 此外, 由于必须对数据集中的每个数据计算距离值, 实际使用时可能非常耗时. k-近邻算法的另一个缺陷是它无法给出任何数据的基础结构信息, 因此我们也无法知晓平均实例样本和典型实例样本具有什么特征.
参考资料:
K近邻(KNN)算法: http://blog.csdn.net/suipingsp/article/details/41964713
K Nearest Neighbor 算法: http://coolshell.cn/articles/8052.html
【转载】K-NN算法 学习总结的更多相关文章
- 转载:SPFA算法学习
转载地址:http://www.cnblogs.com/scau20110726/archive/2012/11/18/2776124.html 粗略讲讲SPFA算法的原理,SPFA算法是1994年西 ...
- 机器学习2—K近邻算法学习笔记
Python3.6.3下修改代码中def classify0(inX,dataSet,labels,k)函数的classCount.iteritems()为classCount.items(),另外p ...
- <2014 05 09> Lucida:我的算法学习之路
[转载] 我的算法学习之路 关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以 ...
- 02-16 k近邻算法
目录 k近邻算法 一.k近邻算法学习目标 二.k近邻算法引入 三.k近邻算法详解 3.1 k近邻算法三要素 3.1.1 k值的选择 3.1.2 最近邻算法 3.1.3 距离度量的方式 3.1.4 分类 ...
- 《机器学习实战》学习笔记一K邻近算法
一. K邻近算法思想:存在一个样本数据集合,称为训练样本集,并且每个数据都存在标签,即我们知道样本集中每一数据(这里的数据是一组数据,可以是n维向量)与所属分类的对应关系.输入没有标签的新数据后,将 ...
- 机器学习实战 - python3 学习笔记(一) - k近邻算法
一. 使用k近邻算法改进约会网站的配对效果 k-近邻算法的一般流程: 收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据.一般来讲,数据放在txt文本文件中,按照一定的格式进 ...
- R语言学习笔记—K近邻算法
K近邻算法(KNN)是指一个样本如果在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性.即每个样本都可以用它最接近的k个邻居来代表.KNN算法适 ...
- 用Python从零开始实现K近邻算法
KNN算法的定义: KNN通过测量不同样本的特征值之间的距离进行分类.它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.K通 ...
- 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
转载自:http://blog.csdn.net/v_july_v/article/details/8203674/ 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说: ...
随机推荐
- Backpropagation In Convolutional Neural Networks
http://www.jefkine.com/general/2016/09/05/backpropagation-in-convolutional-neural-networks/ http://w ...
- mysql++ Query
mysqlpp:: Query类存储了Connection的指针,可以用它进行SQL语句的增删改查. 连上数据库后,使用mysqlpp::Connection::query()获取Query对象 Qu ...
- 【硅谷问道】Chris Lattner 访谈录(上)
[硅谷问道]Chris Lattner 访谈录(上) 话题 Chris Lattner 是谁? Xcode 的编译器 LLVM 背后有怎样的故事? Swift 诞生的前世今生,封闭的苹果为何要拥抱开源 ...
- 【Web】Tomcat中利用Session识别用户的基本原理
HTTP无状态的特性与Session.Cookie的存在 HTTP有一个特性:无状态的,就是前后两个HTTP事务它们并不知道对方的信息. 而为了维护会话信息或用户信息,一般可用Cookie或Sessi ...
- c与c++相互调用机制分析与实现
c++通常被称为Better c,多数是因为c++程序可以很简单的调用c函数,语法上基本实现兼容.最常用的调用方式就是c++模块调用c实现的dll导出函数,很简单的用法,使用extern " ...
- Windows删除/修改注册表权限不足的解决方法
在注册表的某些关键项(譬如:System.Root),连Administrator都没有权限进行修改,因为只有“system”有权限. [警告]切勿企图进行注册表上层权限覆盖低层权限的方式来使Admi ...
- CISCO、H3C、华为三层交换机端口二三层切换命令对比
很多人都在问H3C是否有像CISCO三层端口切换类似的命令 switchport . 答案是肯定的.有.很多人都不知道. 其实无论是思科还是H3C还是华为他们都有这样的命令.但是在H3C和华为中不经常 ...
- Django Aggregation聚合 django orm 求平均、去重、总和等常用方法
Django Aggregation聚合 在当今根据需求而不断调整而成的应用程序中,通常不仅需要能依常规的字段,如字母顺序或创建日期,来对项目进行排序,还需要按其他某种动态数据对项目进行排序.Djng ...
- Python3回文相关算法小结
[本文出自天外归云的博客园] 总结一下关于回文相关的算法: 判断字符串本身是否是回文 返回字符串中的所有子串 找到字符串中包含的所有回文 判断字符串中是否包含回文 将字符串变成一个不包含回文的字符串 ...
- STM32内部flash存储小数——别样的C语言技巧
今天在进行STM32内部falsh存储的时候,发现固件库历程的函数原型是这样的: 第一个是地址,在我的STM32中是2K一页的,第二个是要写入的数据. 问题就来了,存储一个小数该怎么办呢?固件库给的是 ...