首页 > 编程语言 >k-近邻算法的初步研究

k-近邻算法的初步研究

时间:2022-12-09 23:34:24浏览次数:61  
标签:分类 近邻 样本 距离 初步 算法 邻居 类别


k-近邻算法

目录

​​k-近邻算法    1 ​​

​​1    算法介绍    2​​

​​2    适用场景    2​​

​​3    方法步骤(案例)    2​​

​​3.1    首先我们事先定下k值    3​​

​​3.2    根据事先确定的距离度量公式(如:欧氏距离),得出待分类数据点和所有已知类别的样本点中,距离最近的k个样本。    3​​

​​3.3    统计这k个样本点中,各个类别的数量。    3​​

​​3.4    手写识别系统的实现    4​​

​​4    代码实现    5​​

​​5    发展    5​​

​​6    不足    6​​

​​6.1    寻找适当的训练数据集    6​​

​​6.2    确定距离函数    6​​

​​6.3    决定K的取值    6​​

​​7    参考    7​​

 

 

 

算法介绍

K最近邻(k-Nearest Neighbour,KNN)分类算法,是最简单的机器学习算法之一。

该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别(相同类别的案例,彼此的相似度高,而可以借由计算与已知类别案例之相似度,来评估未知类别案例可能的分类。),通常,k是不大于20的整数。

KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。

适用场景

由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。

KNN算法不仅可以用于分类,还可以用于回归。通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成反比( 较近邻居的权重比较远邻居的权重大。)(一种常见的加权方案是给每个邻居权重赋值为1/ d,其中d是到邻居的距离。这个方案是一个线性插值的推广。)

K近邻算法也适用于​连续变量​估计,比如适用反距离加权平均多个K近邻点确定测试点的值。该算法的功能有:

从目标区域抽样计算欧式或马氏距离;

在交叉验证后的RMSE基础上选择启发式最优的K邻域;

计算多元k-最近邻居的距离倒数加权平均。

方法步骤(案例)

我们考虑样本为二维的情况下,利用knn方法进行二分类的问题。图中三角形和方形是已知类别的样本点,这里我们假设三角形为正类,方形为负类。图中圆形点是未知类别的数据,我们要利用这些已知类别的样本对它进行分类。

首先我们事先定下k值

(就是指k近邻方法的k的大小,代表对于一个待分类的数据点,我们要寻找几个它的邻居)。这边为了说明问题,我们取两个k值,分别为3和9;

根据事先确定的距离度量公式(如:​​欧氏距离​​),得出待分类数据点和所有已知类别的样本点中,距离最近的k个样本。

统计这k个样本点中,各个类别的数量。

如上图,如果我们选定k值为3,则正类样本(三角形)有1个,负类样本(圆形)有2个,那么我们就把这个方形数据点定为负类;而如果我们选择k值为9,则正类样本(三角形)有5个,负类样本(圆形)有4个,那么我们这个数据点定为正类。即,根据k个样本中,数量最多的样本是什么类别,我们就把这个数据点定为什么类别。

训练样本是多维特征空间向量,其中每个训练样本带有一个类别标签。算法的训练阶段只包含存储的特征向量和训练样本的标签。 在分类阶段,k是一个用户定义的常数。一个没有类别标签的向量 (查询或测试点)将被归类为最接近该点的K个样本点中最频繁使用的一类。 一般情况下,将欧氏距离作为距离度量,但是这是只适用于连续变量。在文本分类这种非连续变量情况下,另一个度量——重叠度量(或海明距离)可以用来作为度量。通常情况下,如果运用一些特殊的算法来计算度量的话,K近邻分类精度可显著提高,如运用大边缘最近邻法或者近邻成分分析法。

输入:训练数据集D={(Xi,Yi),1≤i≤N},其中Xi是第i个样本的条件属性,Yi是类别,新样本X,距离函数d。 

输出:X的类别Y。 for i=1 to N do 

计算X和Xi之间的距离d(Xi,X); end for 

对距离排序,得到d(X,Xi1) ≤d(X,Xi2) ≤… ≤d(X,XiN); 选择前K个样本:S={(Xi1,Yi1)…(XiK,YiK)}; 统计S中每个类别出现的次数,确定X的类别Y 。

手写识别系统的实现

原始图片(举例):

经过转换后的向量图(举例):

 

假定识别数字0-9,(实际情况可能为识别车牌号、验证码,总之为有限个(且不是非常多)符号),具体实现步骤为:

收集数据(采集数字图片)

采集手写数字图片,每个数字约定采集样本数据为200张,共2000张数字图片,同时另外采集200张数字图片作为测试数据。

准备数据(将图像转换为测试向量)

将32*32的二进制图像矩阵格式化为1*1024的向量(数组),存储方式为Map<Integer,byte[]>

Byte数组大小为1024,存储0或1(表示该单元格有被写入或未被写入),Map大小为2000,同时设定k为1(取相似度最高的一个)。

测试数据

将测试图片200张转换为向量数据,依次传入算法中,每张测试图片需计算2000次,找出与byte数组中匹配最大的值,取出其Map中的KEY,即为转换后的数字,计算误差率,并调整K值,分析K值对错误率的影响。

代码实现

发展

然而k最近邻居法因为计算量相当的大,所以相当的耗时,Ko与Seo提出一算法TCFP(text categorization using feature projection),尝试利用特征投影法来降低与分类无关的特征对于系统的影响,并借此提升系统效能,其实实验结果显示其分类效果与k最近邻居法相近,但其运算所需时间仅需k最近邻居法运算时间的五十分之一。

除了针对文件分类的效率,尚有研究针对如何促进k最近邻居法在文件分类方面的效果,如Han等人于2002年尝试利用贪心法,针对文件分类实做可调整权重的k最近邻居法WAkNN (weighted adjusted k nearest neighbor),以促进分类效果;而Li等人于2004年提出由于不同分类的文件本身有数量上有差异,因此也应该依照训练集合中各种分类的文件数量,选取不同数目的最近邻居,来参与分类。

不足


  1. 寻找适当的训练数据集


算法要求对选取的样本数据必须要尽可能的对历史数据的一个很好的覆盖,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。 该算法只计算"最近的"邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进;另外一点是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。

确定距离函数

距离函数决定了哪些样本是待分类本的K个最近邻居,它的选取取决于实际的数据和决策问题。如果样本是空间中点,最常用的是欧几里德距离。其它常用的距离函是由绝对距离、平方差和标准差

欧几里德距离:

点 x = (x1,...,xn) 和 y = (y1,...,yn) 之间的距离为

向量 

 的自然长度,即该点到原点的距离为

.

它是一个纯数值。在欧几里得度量下,两点之间直线最短。

 

决定K的取值 

邻居的个数对分类的结果有一定的影响,一般先确定一个初始值,再进行调整,直到找到合适的值为止。

如何选择一个最佳的K值取决于数据。一般情况下,在分类时较大的K值能够减小噪声的影响。但会使类别之间的界限变得模糊。一个较好的K值能通过各种启发式技术来获取,比如,交叉验证。

噪声和非相关性特征向量的存在会使K近邻算法的准确性减小。对于选择特征向量进行分类已经作了很多研究。一个普遍的做法是利用进化算法优化功能扩展,还有一种较普遍的方法是利用训练样本的互信息进行选择特征。

 

参考

百度百科:k近邻算法 http://baike.baidu.com/view/8349300.htm

Wiki百科:最近邻居算法 https://zh.wikipedia.org/wiki/%E6%9C%80%E8%BF%91%E9%84%B0%E5%B1%85%E6%B3%95

百度文库:http://wenku.baidu.com/view/e1eb70d4b9f3f90f76c61be9.html

《机器学习实战》 k近邻算法

标签:分类,近邻,样本,距离,初步,算法,邻居,类别
From: https://blog.51cto.com/u_5488952/5926681

相关文章

  • 使用ESPRIT,LS-ESPRIT,Music以及Root-Music四种算法进行角度估计matlab仿真
    目录一、理论基础二、核心程序三、测试结果一、理论基础ESPRIT算法全称为:EstimationofSignalParametersusingRotationalInvarianceTechniques.与Root_MUSIC算......
  • 数据挖掘算法—K-Means算法
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • 算法学习笔记(3)——二分
    二分二分法用于解决这样一类问题:一个区间能分成左右两部分,左半部分满足性质\(A\),右半部分不满足性质\(A\)。问题的目标是求解这两部分的分界点。所以二分法和区间里有......
  • 算法学习笔记(4)——高精度
    高精度高精度高精度加法高精度减法高精度乘法高精度除法高精度加法题目链接:AcWing791.高精度加法题目描述给定两个正整数(不含前导0),计算它们的和。输入......
  • 算法学习笔记(5)——前缀和与差分
    前缀和与差分前缀和与差分一维前缀和差分一维前缀和前缀和可以用于快速计算一个序列的区间和,也有很多问题里不是直接用前缀和,但是借用了前缀和的思想。用\(s[i......
  • 算法学习笔记(2)——归并排序
    归并排序归并排序的思想是基于分治法,其思路是:将待排序区间平分成左右两半,左右两侧分别递归地做归并排序。将这两个有序的区间合并(每次落一个较小的下来),就将这个区间排......
  • 算法学习笔记(1)——快速排序
    快速排序算法思想快排的思想是基于分治法,其思路是:确定分界点:给定要排序的数组q,先在数组中找一个数作为分界点值x,分界点可以取左边界值x=q[l],可以取右边界值x=q[r],......
  • crypto-gmsm国密算法库
    crypto-gmsm国密算法库一、开发背景crypto-gmsm国密算法库是国密商密算法(SM2,SM3,SM4)工具类封装,国产密码算法(国密算法)是指国家密码局认定的国产商用密码算法,目前主要使用......
  • 代码随想录算法训练营第三天 | 203.移除链表元素、707.设计链表、206.反转链表
    203. 移除链表元素tag:#链表leetcode地址:203. 移除链表元素代码:functionremoveElements(head:ListNode|null,val:number):ListNode|null{constnewH......
  • hutools密码算法库
    hutool密码算法库一、开发背景Hutool针对BouncyCastle做了简化包装,用于实现国密算法中的SM2、SM3、SM4。国密算法工具封装包括:非对称加密和签名:SM2摘要签名算法:SM3......