K-NN算法 学习总结
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算法 学习总结的更多相关文章
- 机器学习2—K近邻算法学习笔记
Python3.6.3下修改代码中def classify0(inX,dataSet,labels,k)函数的classCount.iteritems()为classCount.items(),另外p ...
- 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算法适 ...
- [Machine-Learning] K临近算法-简单例子
k-临近算法 算法步骤 k 临近算法的伪代码,对位置类别属性的数据集中的每个点依次执行以下操作: 计算已知类别数据集中的每个点与当前点之间的距离: 按照距离递增次序排序: 选取与当前点距离最小的k个点 ...
- 基本分类方法——KNN(K近邻)算法
在这篇文章 http://www.cnblogs.com/charlesblc/p/6193867.html 讲SVM的过程中,提到了KNN算法.有点熟悉,上网一查,居然就是K近邻算法,机器学习的入门 ...
- 从K近邻算法谈到KD树、SIFT+BBF算法
转自 http://blog.csdn.net/v_july_v/article/details/8203674 ,感谢july的辛勤劳动 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章 ...
- Python之路,Day21 - 常用算法学习
Python之路,Day21 - 常用算法学习 本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的 ...
- 机器学习——KNN算法(k近邻算法)
一 KNN算法 1. KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分 ...
随机推荐
- 极客技术专题【011期】:EasyUI初级教程
来源:GBin1.com 技术专题:EasyUI初级教程 分享人:极客标签技术编辑 - html580(请站内关注分享人) 资深Web前端工程师,HTML580创始人,目前就职于广州一间软件公司.多年 ...
- POJ 2976 Dropping tests (最大化平均值)
题目链接:click here~~ [题目大意]给你n个分数的值,要求最小不选k个,使得最后分数相加结果平均值最大 [解题思路]:最大化平均值:參见:click here~~ 代码: #include ...
- Sublime Text 如何一个代码双屏显示代码上下部分?
Sublime Text 如何一个代码双屏显示代码上下部分? sublime text如何一个代码双屏显示代码上下部分 先显示2行实图 把想要分屏显示的文件,打开新窗口,然后再拖过去就可以了. 快捷操 ...
- Unity 使用 Stripping Level == Use micro mscorlib 导致 MD5.Create() 返回NULL
这几天在弄资源更新,昨天导出Android APK 到手机上測试,发现MD5 校验的时候一直出错.打出Log 又一次导包測试发现 MD5.Create() 返回NULL 可是在电脑上是好好的,在手机上 ...
- ubuntu卸载第三方库
下面以pcl和opencv为例进行说明. 参考资料: https://www.cnblogs.com/txg198955/p/5990295.html ubuntu卸载opencv并重装opencv ...
- 【微信小程序】转载:微信小程序实战篇-下拉刷新与加载更多
下拉刷新 实现下拉刷新目前能想到的有两种方式 1. 调用系统的API,系统有提供下拉刷新的API接口 当然,你可以直接在全局变量app.json的window里面配置上面这个属性,这样整个项目都允许下 ...
- hibernate3和4中 HibernateSessionFactory中不同之处 The method applySettings(Map) from the type ServiceRegistryBuilder is deprecated - The type ServiceRegistryBuilder is deprecated
hibernate3和4中 HibernateSessionFactory中不同之处 //serviceRegistry = new ServiceRegistryBuilder().applySet ...
- Linux常用指令总结
概述 因为平时不是经常使用Linux系统,每次用到都需要重新温习一遍,这里对自己平时经常使用到的指令做个小结,方便后面直接查阅. 常用指令 登陆root指令 sudo su - 安装软件及卸载指令 d ...
- java基础讲解04-----数据类型和运算符
1.java的基本数据类型 1.数值型 { 整数型 byte , short ,int ,long 浮点型 float , double } 2.字符型 3.布尔型 2.运算符 1.赋 ...
- 微信小程序 异步请求拿数据+使用外部js库
信小程序(与js)通过requirejs引用外部js文件 var modelSearch = require('../../utils/modelSearch.js') 这是一个构建数据请求筛选条件的 ...