K近邻法(k-nearest neighbors,KNN)是一种很基本的机器学习方法了,在我们平常的生活中也会不自主的应用。比如,我们判断一个人的人品,只需要观察他来往最密切的几个人的人品好坏就可以得出了。这里就运用了KNN的思想。KNN方法既可以做分类,也可以做回归,这点和决策树算法相同。
KNN算法是选择与输入样本在特征空间内最近邻的k个训练样本并根据一定的决策规则,给出输出结果 。KNN算法是很基本的机器学习算法了,它非常容易学习,在维度很高的时候也有很好的分类效率,因此运用也很广泛。
决策规则:
分类任务:输出结果为k个训练样本中占大多数的类 。
回归任务:输出结果为k个训练样本值的平均值 。
如下图的分类任务,输出结果为w1类 。
K值的选择、距离度量和分类决策规则是K近邻算法的三个基本要素。当三个要素确定后,对于任何一个新的输入实例,它所属的Y值也确定了。
KNN算法一般是用多数表决方法,即由输入实例的K个邻近的多数类决定输入实例的类。这种思想也是经验风险最小化的结果。
训练样本为(xi , yi)。当输入实例为 x,标记为c,输入实例下Nk(x)的k近邻训练样本集。
我们定义训练误差率是K近邻训练样本标记与输入标记不一致的比例,误差率表示为:
因此,要使误差率最小化即经验风险最小,就要使以下公式最大
即K近邻的标记值尽可能的与输入标记一致,所以多数表决规则等价于经验风险最小化。
K取值较小时,模型复杂度高,训练误差会减小,泛化能力减弱;K取值较大时,模型复杂度低,训练误差会增大,泛化能力有一定的提高。
KNN模型的复杂度可以通过对噪声的容忍度来理解,若模型对噪声很敏感,则模型的复杂度高;反之,模型的复杂度低。为了更好理解模型复杂度的含义,我们取一个极端,分析K=1和K="样本数"的模型复杂度。
K=1时,模型输出的结果受噪声的影响很大。
由上图可知,样本数等于7,当K=7时,不管输入数据的噪声有多大,输出结果都是绿色类,模型对噪声极不敏感,但是模型太过简单,包含的信息太少,也是不可取的。
通过上面两种极端的K选取结果可知,K值选择应适中,K值一般小于20,建议采用交叉验证的方法选取合适的K值。
KNN算法用距离来度量两个样本间的相似度,常用的距离表示方法:
欧式距离也称欧几里得距离,是最常见的距离度量,衡量的是多维空间中两个点之间的绝对距离表示。
百度百科给出的解释是:
在数学中,欧几里得距离或欧几里得度量是欧几里得空间中两点间“普通”(即直线)距离。使用这个距离,欧氏空间成为度量空间。相关联的范数称为欧几里得范数。较早的文献称之为毕达哥拉斯度量。
二维空间的公式:
三维空间的公式:
N维空间的公式:
对于图像的欧氏距离变换,是指对于一张二值图像(在此我们假定白色为前景色,黑色为背景色),将前景中的像素的值转化为该点到达最近的背景点的距离。
使用在几何度量空间的几何学用语,用以标明两个点在标准坐标系上的绝对轴距总和。参考链接
简言之,游戏中的西洋棋里,车(城堡)是以曼哈顿距离来计算棋盘格上的距离;而王(国王)与后(皇后)使用切比雪夫距离。
即为:
在闵可夫斯基距离公式中,当p=2时,即为欧氏距离;当p=1时,即为曼哈顿距离;当p>>无穷时,即为切比雪夫距离。
马氏距离(Mahalanobis Distance)是一种距离的度量,可以看作是欧氏距离的一种修正,修正了欧式距离中各个维度尺度不一致且相关的问题。参考链接
单个数据点的马氏距离
马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。
如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也可称为正规化的欧氏距离。
对于马氏距离与欧氏距离的比较
另外的,对于本文其他未涉及或者不够详尽的机器学习领域的各种参数和距离描述,可以参考如下:
目录:
1.欧氏距离
2.曼哈顿距离
3. 切比雪夫距离
4. 闵可夫斯基距离
5.标准化欧氏距离
6.马氏距离
7.夹角余弦
8.汉明距离
9.杰卡德距离& 杰卡德相似系数
10.相关系数& 相关距离
11.信息熵
https://download.csdn.net/download/dongbao520/85811347
KNN做回归和分类的主要区别
在于最后做预测时候的决策方式不同。KNN做分类预测时,一般是选择多数表决法,即训练集里和预测的样本特征最近的K个样本,预测为里面有最多类别数的类别。而KNN做回归时,一般是选择平均法,即最近的K个样本的样本输出的平均值作为回归预测值。由于两者区别不大,虽然本文主要是讲解KNN的分类方法,但思想对KNN的回归方法也适用。由于scikit-learn里只使用了蛮力实现(brute-force),KD树实现(KDTree)和球树(BallTree)实现,本文只讨论这几种算法的实现原理。
既然我们要找到k个最近的邻居来做预测,那么我们只需要计算预测样本和所有训练集中的样本的距离,然后计算出最小的k个距离即可,接着多数表决,很容易做出预测。这个方法的确简单直接,在样本量少,样本特征少的时候有效。但是在实际运用中很多时候用不上,为什么呢?因为我们经常碰到样本的特征数有上千以上,样本量有几十万以上,如果我们这要去预测少量的测试集样本,算法的时间效率很成问题。因此,这个方法我们一般称之为蛮力实现。比较适合于少量样本的简单模型的时候用。
**暴力搜索(brute-force search)**是线性扫描输入实例与每一个训练实例的距离并选择前k个最近邻的样本来多数表决,算法简单,系统地枚举解决方案的所有可能的候选项,以及检查每个候选项是否符合问题的描述。但是当训练集或特征维度很大时,计算非常耗时,故这种暴力实现原理是不可行的 。
kd树是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构,构造kd树相当于不断用垂直于坐标轴的超平面将k维空间进行划分,构成一系列的K维超矩形区域,kd树省去了对大部分数据的搜索,大大的较少了计算量。
KD树算法没有一开始就尝试对测试样本分类,而是先对训练集建模,建立的模型就是KD树,建好了模型再对测试集做预测。所谓的KD树就是K个特征维度的树,注意这里的K和KNN中的K的意思不同。KNN中的K代表最近的K个样本,KD树中的K代表样本特征的维数。为了防止混淆,后面我们称特征维数为n。
KD树算法包括三步,第一步是建树,第二部是搜索最近邻,最后一步是预测。
kd树实质是二叉树,其划分思想与cart树一致,即切分使样本复杂度降低最多的特征。kd树认为特征方差越大,则该特征的复杂度亦越大,优先对该特征进行切分 ,切分点是所有实例在该特征的中位数。重复该切分步骤,直到切分后无样本则终止切分,终止时的样本为叶节点。
(1)、搜索路径从根节点到叶节点,在KD树里面找到包含目标点的叶子节点。
(2)、搜索路径从叶节点到根节点,找到距离目标点最近的样本实例点。
每一次搜寻与输入样本最近的样本节点,然后忽略该节点,重复同样步骤K次,找到与输入样本最近邻的K个样本 ,投票法确定输出结果。
简单来讲,就是在KD树搜索最近邻的基础上,我们选择到了第一个最近邻样本,就把它置为已选。在第二轮中,我们忽略置为已选的样本,重新选择最近邻,这样跑k次,就得到了目标的K个最近邻,然后根据多数表决法,如果是KNN分类,预测为K个最近邻里面有最多类别数的类别。如果是KNN回归,用K个最近邻样本输出的平均值作为回归预测值。
样本(类别)样本不平衡(class-imbalance)指的是分类任务中不同类别的训练样例数目差别很大的情况,一般地,样本类别比例(多数类vs少数类)明显大于1:1(如4:1)就可以归为样本不均衡的问题。现实中,样本不平衡是一种常见的现象,详细解读可参考
若正负样本处于不平衡状态,运用投票决策的KNN算法判断输入样本的所属类别:
结果显示输入样本为绿色类 。原因是红色类的个数远远小于绿色样本,导致出现的分类错误 。
(1)若分类决策选择限定半径最近邻法,即以输入样本为圆心,最大半径R的圆内选择出现次数最多的类做为输入样本的类 。如下图,黑色样本的分类结果正确。
2)投票法是默认每个样本的权重相等,我们假定权重与距离成反比,即距离越大,对结果的影响越小,那么该样本的权重也越小,反之,权重则越大,根据权重对输入样本进行分类 。这种思想与adaBoost算法相似,分类性能好的弱分类器给予一个大的权重 。
分类过程:
(1)、选择与输入样本距离X0最近的K个训练样本Xi(i = 1,2,…,K),d(X0,Xi)表示输入样本和训练样本的距离。
(2)、根据距离与样本成反比的性质将距离转化成权重Wi,Wi表示输入样本X0与训练样本Xi的权重。
(3)、我们累加每一类的样本权重,并认为该权重占所有权重和的比例是该类的生成概率,概率最大的类就是输入样本的分类结果。
假设目标是二分类{C1,C2},表达式:
则分类结果为C1类,反之为C2类。
回归过程:
(1)(2)步骤与分类过程一直,第(3)步使用如下表达式得到回归值:
其中,y为输出结果,f(xi)为最近邻样本的值。若权重相同的话,则输出结果为K个训练样本的平均值。
用权重思想重新对上例进行分类,可得输入样本为红色类
部分参考来源
1)算法简单,理论成熟,可用于分类和回归。
2)对异常值不敏感。
3)可用于非线性分类。
4)比较适用于容量较大的训练数据,容量较小的训练数据则很容易出现误分类情况。
5)KNN算法原理是根据邻域的K个样本来确定输出类别,因此对于不同类的样本集有交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为合适。
1)时间复杂度和空间复杂度高。
2)训练样本不平衡,对稀有类别的预测准确率低。
3)相比决策树模型,KNN模型可解释性不强。