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算法的过程

  1. 选择一种距离计算方式, 通过数据所有的特征计算新数据与已知类别数据集中数据点的距离;
  2. 按照距离递增次序进行排序, 选取与当前距离最小的 k 个点;
  3. 对于离散分类, 返回 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

时间: 2024-10-13 10:40:02

K-NN算法 学习总结的相关文章

机器学习2—K近邻算法学习笔记

Python3.6.3下修改代码中def classify0(inX,dataSet,labels,k)函数的classCount.iteritems()为classCount.items(),另外print在Python新版本下是函数,print后面需加上一对括号,否则执行会报错.第二章代码修改如下. from numpy import * import operator from os import listdir def classify0(inX, dataSet, labels, k)

02-16 k近邻算法

[TOC] 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/nickchen121/ k近邻算法 k近邻算法(k-nearest neighbors,KNN)是一种基本的分类和回归方法,本文只探讨分类问题中的k近邻算法,回归问题通常是得出最近的$k$个实例的标记值,然后取这$k$实例标记值的平均数或中位数. k近邻算法经常被人们应用于生活当中,比如傅玄曾说过"近朱者赤近墨者黑&quo

《机器学习实战》学习笔记一K邻近算法

 一. K邻近算法思想:存在一个样本数据集合,称为训练样本集,并且每个数据都存在标签,即我们知道样本集中每一数据(这里的数据是一组数据,可以是n维向量)与所属分类的对应关系.输入没有标签的新数据后,将新数据的每个特征(向量的每个元素)与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似的的分类标签.由于样本集可以很大,我们选取前k个最相似数据,然后统计k个数据中出现频率最高的标签为新数据的标签. K邻近算法的一般流程: (1)收集数据:可以是本地数据,也可以从网页抓取. (2)准备数

R语言学习笔记—K近邻算法

K近邻算法(KNN)是指一个样本如果在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性.即每个样本都可以用它最接近的k个邻居来代表.KNN算法适合分类,也适合回归.KNN算法广泛应用在推荐系统.语义搜索.异常检测. KNN算法分类原理图: 图中绿色的圆点是归属在红色三角还是蓝色方块一类?如果K=5(离绿色圆点最近的5个邻居,虚线圈内),则有3个蓝色方块是绿色圆点的"最近邻居",比例为3/5,因此绿色圆点应当划归到蓝色方块一类:如果

《统计学习方法》:第三章 K 近邻算法

k -- NN k--NN 是一种基本分类和回归方法.对新实例进行分类时,通过已经训练的数据求出 k 个最近实例,通过多数表决进行分类.故 k 邻近算法具有不显式的学习过程. 三个基本要素:k 值选择,距离度量,分类决策规则. 1. k 近邻算法 原理:给定一个训练集,对于新输入的实例,在训练集中找到与其相似的 k 个实例,这 k 个实例的多数属于某一类,就将该实例归属到这一类. 输入:训练数据集 \(T = \{(x_1,y_1),(x_2,y_2),...,(x_3,y_3)\}\) 其中,

我的算法学习之路

关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口--况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程.然而这门课程并没有让我入门--当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾--反正最后考试划个重点也能过,于是这门整个计算机专业本

周总结(2017.2.16):第一周算法学习。

周总结:算法学习总结之DFS和BFS 一:DFS算法 目的:达到被搜索结构的叶节点. 定义:假定给定图G的初态是所有的定点都没有访问过,在G中任选一定点V为初始出发点,首先访问出发点并标记,然后依次从V出发搜索V的每个相邻点W,若W未曾出现过,则对W进行深度优先遍历(DFS),知道所有和V有路径相通的定点被访问. 如果从V0开始寻找一条长度为4的路径的话: 思路步骤: 先寻找V0的所有相邻点:dis{v1,v2,v3},V1没有访问过,所以对V1进行深度遍历并将V1标记为访问过,此时路径长度为1

最短路径算法学习总结

Dijkstra最短路径算法: dijkstra 算法的优点在于可以求出从一点到所有其他点的最短距离: input: 5 71 2 101 3 201 5 302 5 102 3 54 5 204 3 30 output: 0 10 15 40 20//这是求的在这颗树中,1到所有点的最短距离 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int N=1100; 5 const int

K 近邻算法

声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结,不得用作商用,欢迎转载,但请注明出处(即:本帖地址). 2,因为本人在学习初始时有非常多数学知识都已忘记,所以为了弄懂当中的内容查阅了非常多资料.所以里面应该会有引用其它帖子的小部分内容,假设原作者看到能够私信我,我会将您的帖子的地址付到以下. 3.假设有内容错误或不准确欢迎大家指正. 4.假设能帮到你.那真是太好了. 描写叙述 给定一个训练数据集,对新的输入实例.在训练数据集中找到与该实例最邻近的K个实例,若这K个实

从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经网络:3.编程艺术第28章.你看到,blog内的文章与你于别处所见的任何都不同.于是,等啊等,等一台电脑,只好等待..”.得益于田,借了我一台电脑(借他电脑的时候,我连表示感谢,他说“能找到工作全靠你的博客,这点儿小忙还说,不地道”,有的时候,稍许感受到受人信任也是一种压力,愿我不辜负大家对我的信任)