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

KNN分类算法,是理论上比较成熟的方法,也是最简单的机器学习算法之一。

该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

一个对于KNN算法解释最清楚的图如下所示:

蓝方块和红三角均是已有分类数据,当前的任务是将绿色圆块进行分类判断,判断是属于蓝方块或者红三角。

当然这里的分类还跟K值是有关的:

如果K=3(实线圈),红三角占比2/3,则判断为红三角;

如果K=5(虚线圈),蓝方块占比3/5,则判断为蓝方块。

由此可以看出knn算法实际上根本就不用进行训练,而是直接进行计算的,训练时间为0,计算时间为训练集规模n。

knn算法的基本要素大致有3个:

  1、K 值的选择

  2、距离的度量

  3、分类决策规则



使用方式:(转载)

  1. K 值会对算法的结果产生重大影响。K值较小意味着只有与输入实例较近的训练实例才会对预测结果起作用,容易发生过拟合;如果 K 值较大,优点是可以减少学习的估计误差,缺点是学习的近似误差增大,这时与输入实例较远的训练实例也会对预测起作用,是预测发生错误。在实际应用中,K 值一般选择一个较小的数值,通常采用交叉验证的方法来选择最有的 K 值。随着训练实例数目趋向于无穷和 K=1 时,误差率不会超过贝叶斯误差率的2倍,如果K也趋向于无穷,则误差率趋向于贝叶斯误差率。
  2. 算法中的分类决策规则往往是多数表决,即由输入实例的 K 个最临近的训练实例中的多数类决定输入实例的类别
  3. 距离度量一般采用 Lp 距离,当p=2时,即为欧氏距离,在度量之前,应该将每个属性的值规范化,这样有助于防止具有较大初始值域的属性比具有较小初始值域的属性的权重过大。


knn算法在分类时主要的不足是,当样本不平衡时,如果一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的 K 个邻居中大容量类的样本占多数。

算法伪代码:

 1 搜索k近邻的算法:kNN(A[n],k)
 2
 3 #输入:A[n]为N个训练样本在空间中的坐标,k为近邻数
 4 #输出:x所属的类别
 5
 6 取A[1]~A[k]作为x的初始近邻,计算与测试样本x间的欧式距离d(x,A[i]),i=1,2,.....,k;
 7 按d(x,A[i])升序排序;
 8 取最远样本距离D = max{d(x,a[j]) | j=1,2,...,k};
 9
10 for(i=k+1;i<=n;i++)#继续计算剩下的n-k个数据的欧氏距离
11       计算a[i]与x间的距离d(x,A[i]);
12       if(d(x,A[i]))<D
13                then 用A[i]代替最远样本#将后面计算的数据直接进行插入即可
14
15  最后的K个数据是有大小顺序的,再进行K个样本的统计即可
16  计算前k个样本A[i]),i=1,2,..,k所属类别的概率;
17  具有最大概率的类别即为样本x的类

python 函数:

 1 #knn-k-最临近算法
 2 #inX为待分类向量,dataSet为训练数据集
 3 #labels为训练集对应分类,k最邻近算法
 4 def classify0(inX, dataSet, labels, k):
 5     dataSetSize = dataSet.shape[0]#获得dataSet的行数
 6
 7     diffMat = np.tile(inX, (dataSetSize,1)) - dataSet#对应的差值
 8     sqDiffMat = diffMat**2                           #差的平方
 9     sqDistances = sqDiffMat.sum(axis=1)              #差的平方的和
10     distances = sqDistances**0.5                     #差的平方的和的平方根
11     #计算待分类向量与每一个训练数据集的欧氏距离
12
13     sortedDistIndicies = distances.argsort() #排序后,统计前面K个数据的分类情况
14
15     classCount={}#字典
16     for i in range(k):
17         voteIlabel = labels[sortedDistIndicies[i]]#labels得是字典才可以如此
18         classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
19
20     sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)#再次排序
21
22     return sortedClassCount[0][0]#第一个就是最多的类别

最后针对于K值的选取,做最后的总结:

时间: 2024-12-27 07:55:16

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

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

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

k邻近算法

3.1k邻近算法 给定一个训练数据集,对于新的输入实例,在训练数据集中找到该实例最近的K 的实例,这k个实例的多数属于某个类,酒吧该输入实例分为这个类. 算法3.1 输入:训练数据集 其中xi为实例的特征向量,yi为实例的类别, 输出:实例x的类y (1)根据给定的距离度量,在训练集T中找出与x最邻近的k个点,涵盖这个K个点的x的邻域记做Nk(x): (2)在Nk(x)中根据分类决策规则(如多数表决决定x的类别y): I为指示函数,当yi=cj时,I为1,否则I为0. k邻近算法的特殊情况是k=

基本分类方法——KNN(K近邻)算法

在这篇文章 http://www.cnblogs.com/charlesblc/p/6193867.html 讲SVM的过程中,提到了KNN算法.有点熟悉,上网一查,居然就是K近邻算法,机器学习的入门算法. 参考内容如下:http://www.cnblogs.com/charlesblc/p/6193867.html 1.kNN算法又称为k近邻分类(k-nearest neighbor classification)算法. 最简单平凡的分类器也许是那种死记硬背式的分类器,记住所有的训练数据,对于

KNN K~近邻算法笔记

K~近邻算法是最简单的机器学习算法.工作原理就是:将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似的数据的分类标签.一般来说,只提取样本数据集中前K个最相似的数据.通常K不大于20,最后选择K个最相似数据中出现次数最多的分类,最为新的数据分类. 但是K~近邻算法必须保存全部的数据集,如果训练数据集很大,必须使用打量的存储空间.此外,由于必须对数据集中每个数据集计算距离值,实际使用起来会非常耗时间.

【机器学习】K均值算法(II)

k聚类算法中如何选择初始化聚类中心所在的位置. 在选择聚类中心时候,如果选择初始化位置不合适,可能不能得出我们想要的局部最优解. 而是会出现一下情况: 为了解决这个问题,我们通常的做法是: 我们选取K<m个聚类中心. 然后随机选择K个训练样本的实例,之后令k个聚类中心分别与k个训练实例相等. 之后我们通常需要多次运行均值算法.每一次都重新初始化,然后在比较多次运行的k均值的结果,选择代价函数较小的结果.这种方法在k较小的时候可能会有效果,但是在K数量较多的时候不会有明显改善. 如何选取聚类数量

web安全之机器学习入门——3.1 KNN/k近邻算法

目录 sklearn.neighbors.NearestNeighbors 参数/方法 基础用法 用于监督学习 检测异常操作(一) 检测异常操作(二) 检测rootkit 检测webshell sklearn.neighbors.NearestNeighbors 参数: 方法: 基础用法 print(__doc__) from sklearn.neighbors import NearestNeighbors import numpy as np X = np.array([[-1, -1],

机器学习之K近邻算法

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

KNN (K近邻算法) - 识别手写数字

KNN项目实战——手写数字识别 1. 介绍 k近邻法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法.它的工作原理是:存在一个样本数据集合,也称作为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系.输入没有标签的新数据后,将新的数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本最相似数据(最近邻)的分类标签.一般来说,我们只选择样本数据集中前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)