机器学习---算法---K-近邻算法

转自:https://www.cnblogs.com/Rosanna/p/3615507.html

K-近邻和最近邻(K=1)是模式识别中常用的分类方法,K-近邻算法思想是找到与当前样本相邻的K个有标签样本,然后通过投票决定此样本的类别。例如下图中如何分类未知的绿色圆圈呢?

例如我们可以取K=3个临近的样本时,通过投票(红色两个大于蓝色一个),从而将绿色圆圈归于红色三角一类。

一.基于实例的学习

K-近邻和局部加权回归就是基于实例的学习。基于实例的学习过程只是简单的存储已知的训练数据,当遇到新的待分类样本时,将从训练数据中挑选出一系列相似的样本,并用来分类新的样本。

与常见的分类算法(如神经网络)不同的是,基于实例的方法可以为不同的待分类样本建立不同的函数逼近。只建立目标函数的局部逼近,而不是建立在整个样本空间都表现良好的逼近。所以,当目标函数很复杂但可以用不太复杂的局部逼近描述时,用基于实例的学习方法会有很大的优势。

同时我们可以看到基于实例的学习方法一个很明显的缺点就是它分类新样本开销很大,因为几乎所有的计算都放生在分类时,而不是第一次遇到训练样本时。另外还有一个缺点就是从训练数据中寻找相似样本时,我们一般都是计算样本的所有属性的距离,当样本只依赖于其中几个属性时,新的待分类样本会离真正相似样本很远,从而发生错误分类。

二.K-近邻算法

假设一个样本的特征向量为{a1(x),a2(x),…,an(x)},ar(x)表示样本x的第r个属性值。那么两个样本xi,xj之间的距离可以表示为

d(xi,xj)=sqrt(sum(ar(xi)-ar(xj))2)   r=1~n

K-紧邻的算法流程很简单:

  • 训练:讲训练样本加入train_set;
  • 分类:对一个新的待分类样本xq
  • 计算train_set中最靠近xq的k个样本,记为x1,x2,...,xk
  • 返回最多的类别信息

关于K值的选择,摘自李航《统计学习方法》:

  • 如果选择较小的K值,就相当于用较小的领域中的训练实例进行预测,“学习”近似误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是“学习”的估计误差会增大,换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合
  • 如果选择较大的K值,就相当于用较大领域中的训练实例进行预测,其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时候,与输入实例较远(不相似的)训练实例也会对预测器作用,使预测发生错误,且K值的增大就意味着整体的模型变得简单
  • K=N,则完全不足取,因为此时无论输入实例是什么,都只是简单的预测它属于在训练实例中最多的累,模型过于简单,忽略了训练实例中大量有用信息。

三.K-近邻算法改进

针对K-近邻算法的不足可以做出几点改进:

1.距离加权

本文一开始的示例图中,若K=5,那么绿色圈圈就会被分类到蓝色方块中。为了解决这个问题,可以对K个近邻的贡献加权,权值为距离平方的倒数:

wi=1/(d(xi,xj)2)

即距离越远,权值越小,距离越近,权值越大。

2.对每个属性加权

并不是样本所有的属性都是有助于分类的,例如一个样本由20个属性描述,但这些属性中只有2个与分类有关。在这种情况下,一个测试样本可能在20维的空间中与它想死的训练样本相距很远,结果导致了错误分类。解决的办法就是给每个属性加权,这相当于按比例缩放欧式空间的坐标轴,缩短不太相关的属性的坐标轴,拉长对应于更相关的属性的坐标轴,可以通过交叉验证自动决定。

3.建立索引

K-近邻推迟了所有的计算,直到来了一个新的测试样本,分类时需要大量计算。一个高效的解决办法就是对存储的训练样本进行索引,在增加一定存储开销的情况下更快速的找到K个临近样本,比如Kd-tree[参考2]。

四.总结

1.KNN的优点:

  • 理论成熟,算法简单;
  • 可用于非线性分类;
  • 对outlier不敏感。

2.KNN的缺点:

  • 不平衡样本效果不好;
  • 预测计算量大;
  • 占用内存多。

参考资料:

1.《机器学习》

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

原文地址:https://www.cnblogs.com/qing1991/p/10163288.html

时间: 2024-11-07 17:33:10

机器学习---算法---K-近邻算法的相关文章

机器学习(四) 机器学习(四) 分类算法--K近邻算法 KNN (下)

六.网格搜索与 K 邻近算法中更多的超参数 七.数据归一化 Feature Scaling 解决方案:将所有的数据映射到同一尺度 八.scikit-learn 中的 Scaler preprocessing.py import numpy as np class StandardScaler: def __init__(self): self.mean_ = None self.scale_ = None def fit(self, X): """根据训练数据集X获得数据的均

机器学习之K近邻算法

K 近邻 (K-nearest neighbor, KNN) 算法直接作用于带标记的样本,属于有监督的算法.它的核心思想基本上就是 近朱者赤,近墨者黑. 它与其他分类算法最大的不同是,它是一种"懒惰"的学习算法 (lazy learning),因为实际上它并没有"训练"的过程,也不产生一个真实意义上的"模型",而只是一字不差地将所有训练样本保存起来,等到需要对新样本进行分类的时候,将新样本与所有训练样本进行比较,找出与其距离最接近的 k 个样本,

机器学习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)

最基础的分类算法-k近邻算法 kNN简介及Jupyter基础实现及Python实现

k-Nearest Neighbors简介 对于该图来说,x轴对应的是肿瘤的大小,y轴对应的是时间,蓝色样本表示恶性肿瘤,红色样本表示良性肿瘤,我们先假设k=3,这个k先不考虑怎么得到,先假设这个k是通过程序员经验得到. 假设此时来了一个新的样本绿色,我们需要预测该样本的数据是良性还是恶性肿瘤.我们从训练样本中选择k=3个离新绿色样本最近的样本,以选取的样本点自己的结果进行投票,如图投票结果为蓝色:红色=3:0,所以预测绿色样本可能也是恶性肿瘤. 再比如 此时来了一个新样本,我们选取离该样本最近

02-16 k近邻算法

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

机器学习实战笔记-K近邻算法1(分类动作片与爱情片)

K近邻算法采用测量不同特征值之间的距离方法进行分类 K近邻算法特点: 优点:精度高.对异常值不敏感.无数据输入假定. 缺点:计算复杂度高.空间复杂度高. 适用数据范围:数值型和标称型. K近邻算法原理: 存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系.输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的 特征进行比较,然后算法提取样本集中特征最相似数据(最近 邻)的分类标签.一般来说,我们只选择样本数据集中前k个最

机器学习实战笔记-K近邻算法2(改进约会网站的配对效果)

案例二.:使用K-近邻算法改进约会网站的配对效果 案例分析: 海伦收集的数据集有三类特征,分别是每年获得的飞行常客里程数.玩视频游戏所耗时间百分比. 每周消费的冰淇淋公升数.我们需要将新数据的每个新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签.一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数.最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类. 流程:在约会网站上使用K

机器学习实战笔记--k近邻算法

1 #encoding:utf-8 2 from numpy import * 3 import operator 4 import matplotlib 5 import matplotlib.pyplot as plt 6 7 from os import listdir 8 9 def makePhoto(returnMat,classLabelVector): #创建散点图 10 fig = plt.figure() 11 ax = fig.add_subplot(111) #例如参数为

机器学习随笔01 - k近邻算法

算法名称: k近邻算法 (kNN: k-Nearest Neighbor) 问题提出: 根据已有对象的归类数据,给新对象(事物)归类. 核心思想: 将对象分解为特征,因为对象的特征决定了事对象的分类. 度量每个特征的程度,将其数字化. 所有特征值构成元组,作为该对象的坐标. 计算待检测对象和所有已知对象的距离,选择距离最接近的k个已知对象 (k近邻中的k来源于此). 这k个对象中出现次数最多的分类就是待检测对象的分类. 重要前提: 需要有一批已经正确归类了的对象存在.也就是通常说的训练数据. 重

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

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