K近邻法(k-nearest neighbors,KNN)是一种基本分类与回归的方法,其基本做法是:给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的k个实例,这k个实例的多数属于某个类,就把该输入实例分为这个类。
与决策树算法相同既可以做分类也可以做回归,主要区别在于最后做预测时候的决策方式。
k近邻法不具有显式的学习过程,其实际上是基于训练数据集对特征空间的一个划分,当训练集、距离度量、k值及分类决策规则确定后,对于任何一个新的输入实例,它所属的类唯一地确定。
特征空间中,对每个训练实例点,距离该点比其他点更近的所有点组成一个区域,叫作单元(cell)。每个训练实例点拥有一个单元,所有训练实例点的单元构成对特征空间的一个划分。最近邻法将实例的类作为其单元中所有点的类标记(class label)。这样,每个单元的实例点的类别是确定的。
k近邻法的模型对应特征空间的一个划分
KNN算法主要考虑三个重要的要素:k值的选取,距离度量的方式和分类决策规则,分类决策规则一般使用多数表决法,所以重点是关注距离的度量方式和k值的选择(在考虑KNN算法超参数时还可以考虑距离的权重,比如:距离输入样本点近的点更有发言权,所以如果考虑距离权重的话会在多数表决时使用距离的倒数乘以距离,得分高着获胜)。
特征空间中两个实例点的距离是两个实例点相似程度的反映。对距离度量有很多种方式,但是最常用的是欧式距离,即对于两个n维向量x和y,两者的欧式距离定义为:
当然我们也可以用他的距离度量方式。比如曼哈顿距离,定义为:
更加通用点,比如闵可夫斯基距离(Minkowski Distance),定义为:
可以看出,欧式距离是闵可夫斯基距离距离在p=2时的特例,而曼哈顿距离是p=1时的特例,在使用闵可夫斯基进行学习时将会多一个超参数P。
对于k值的选择,没有一个固定的经验,一般根据样本的分布,选择一个较小的值,反映了对近似误差与估计误差之间的权衡,通常由交叉验证选择最优的k。
要找到k个最近的邻居来做预测,只需要计算预测样本和所有训练集中的样本的距离,然后找到与预测样本距离最近的k个训练样本即可,再使用多数表决做出预测。这个方法的确简单直接,在样本量少,样本特征少的时候有效。但是在实际运用中很多时候用不上,因为我们经常碰到样本的特征数有上千以上,样本量有几十万以上,这时要计算输入实例与每一个训练实例的距离,算法的时间效率很成问题。因此,这个方法我们一般称之为蛮力实现。比较适合于少量样本的简单模型的时候用。
为解决线性扫描实现在特征多,样本多的时候的局限性,可以考虑使用特殊的结构存储训练数据,以减少计算距离的次数。其中有两种常用的解决办法:KD树实现,球树实现。
k近邻法的实现需要考虑如何快速搜索k个最近邻点。所谓的KD树就是K个特征维度的树,它是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。kd树是二叉树,表示对k维空间的一个划分(partition)。构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分,构成一系列的k维超矩形区域。kd树的每个结点对应于一个k维超矩形区域。利用kd树可以省去对大部分数据点的搜索,从而减少搜索的计算量。
KD树算法没有一开始就尝试对测试样本分类,而是先对训练集建模,建立的模型就是KD树,建好了模型再对测试集做预测。注意这里的K和KNN中的K的意思不同。KNN中的K代表最近的K个样本,KD树中的K代表样本特征的维数。为了防止混淆,后面我们称特征维数为n。
KD树算法包括三步,第一步是建树,第二部是搜索最近邻,最后一步是预测。
建树的方法:KD树建树采用的是从m个样本的n维特征中,分别计算n个特征的取值的方差,用方差最大的第k维特征nk来作为根节点。对于这个特征,我们选择特征nk的取值的中位数nkv对应的样本作为划分点,对于所有第k维特征的取值小于nkv的样本,我们划入左子树,对于第k维特征的取值大于等于nkv的样本,我们划入右子树,对于左子树和右子树,我们采用和刚才同样的办法来找方差最大的特征来做更节点,递归的生成KD树。
具体流程如下图:
比如我们有二维样本6个,{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},构建kd树的具体步骤为:
最后得到的KD树如下:
对于一个目标点,我们首先在KD树里面找到包含目标点的叶子节点。以目标点为圆心,以目标点到叶子节点样本实例的距离为半径,得到一个超球体,最近邻的点一定在这个超球体内部。然后返回叶子节点的父节点,检查另一个子节点包含的超矩形体是否和超球体相交,如果相交就到这个子节点寻找是否有更加近的近邻,有的话就更新最近邻。如果不相交那就简单了,我们直接返回父节点的父节点,在另一个子树继续搜索最近邻。当回溯到根节点时,算法结束,此时保存的最近邻节点就是最终的最近邻。
从上面的描述可以看出,KD树划分后可以大大减少无效的最近邻搜索,很多样本点由于所在的超矩形体和超球体不相交,根本不需要计算距离。大大节省了计算时间。
我们用3.1建立的KD树,来看对点(2,4.5)找最近邻的过程。
先进行二叉查找,先从(7,2)查找到(5,4)节点,在进行查找时是由y = 4为分割超平面的,由于查找点为y值为4.5,因此进入右子空间查找到(4,7),形成搜索路径<(7,2),(5,4),(4,7)>,但 (4,7)与目标查找点的距离为3.202,而(5,4)与查找点之间的距离为3.041,所以(5,4)为查询点的最近点; 以(2,4.5)为圆心,以3.041为半径作圆,如下图所示。可见该圆和y = 4超平面交割,所以需要进入(5,4)左子空间进行查找,也就是将(2,3)节点加入搜索路径中得<(7,2),(2,3)>;于是接着搜索至(2,3)叶子节点,(2,3)距离(2,4.5)比(5,4)要近,所以最近邻点更新为(2,3),最近距离更新为1.5;回溯查找至(5,4),直到最后回溯到根结点(7,2)的时候,以(2,4.5)为圆心1.5为半径作圆,并不和x = 7分割超平面交割,如下图所示。至此,搜索路径回溯完,返回最近邻点(2,3),最近距离1.5。
对应的图如下:
在KD树搜索最近邻的基础上,我们选择到了第一个最近邻样本,就把它置为已选。在第二轮中,忽略置为已选的样本,重新选择最近邻,这样跑k次,就得到了目标的K个最近邻,然后根据多数表决法,如果是KNN分类,预测为K个最近邻里面有最多类别数的类别。如果是KNN回归,用K个最近邻样本输出的平均值作为回归预测值。
KD树算法虽然提高了KNN搜索的效率,但是在某些时候效率并不高,比如当处理不均匀分布的数据集时,不管是近似方形,还是矩形,甚至正方形,都不是最好的使用形状,因为他们都有角。一个例子如下图:
如果黑色的实例点离目标点星点再远一点,那么虚线圆会如红线所示那样扩大,导致与左上方矩形的右下角相交,既然相 交了,那么就要检查这个左上方矩形,而实际上,最近的点离星点的距离很近,检查左上方矩形区域已是多余。于此我们看见,KD树把二维平面划分成一个一个矩形,但矩形区域的角却是个难以处理的问题。
球树可以优化超矩形体导致搜索效率的问题。下面介绍球树建树和搜索最近邻的算法。
球树就是每个分割块都是超球体,而不是KD树里面的超矩形体。
具体的建树流程:
可以看出KD树和球树类似,主要区别在于球树得到的是节点样本组成的最小超球体,而KD得到的是节点样本组成的超矩形体,这个超球体要与对应的KD树的超矩形体小,这样在做最近邻搜索的时候,可以避免一些无谓的搜索。
使用球树找出给定目标点的最近邻方法是首先自上而下贯穿整棵树找出包含目标点所在的叶子,并在这个球里找出与目标点最邻近的点,这将确定出目标点距离它的最近邻点的一个上限值,然后跟KD树查找一样,检查兄弟结点,如果目标点到兄弟结点中心的距离超过兄弟结点的半径与当前的上限值之和,那么兄弟结点里不可能存在一个更近的点;否则的话,必须进一步检查位于兄弟结点以下的子树。
检查完兄弟节点后,我们向父节点回溯,继续搜索最小邻近值。当回溯到根节点时,此时的最小邻近值就是最终的搜索结果。
从上面的描述可以看出,KD树在搜索路径优化时使用的是两点之间的距离来判断,而球树使用的是两边之和大于第三边来判断,相对来说球树的判断更加复杂,但是却避免了更多的搜索,这是一个权衡。
有时候我们会遇到这样的问题,即样本中某系类别的样本非常的少,甚至少于K,这导致稀有类别样本在找K个最近邻的时候,会把距离其实较远的其他样本考虑进来,而导致预测不准确。为了解决这个问题,我们限定最近邻的一个最大距离,也就是说,我们只在一个距离范围内搜索所有的最近邻,这避免了上述问题。这个距离我们一般称为限定半径。
接着我们再讨论下另一种扩展,最近质心算法。这个算法比KNN还简单。它首先把样本按输出类别归类。对于第 L类的ClCl个样本。它会对这ClCl个样本的n维特征中每一维特征求平均值,最终该类别所有维度的n个平均值形成所谓的质心点。对于样本中的所有出现的类别,每个类别会最终得到一个质心点。当我们做预测时,仅仅需要比较预测样本和这些质心的距离,最小的距离对于的质心类别即为预测的类别。这个算法通常用在文本分类处理上。
KNN的主要优点有:
KNN的主要缺点有:
线性回归是寻找一条直线,最大程度的“拟合”样本特征与样本标签之间的关系,其思想简单但却是许多强大的非线性模型的基础,如:多项式回归,逻辑回归,SVM,而且线性回归的结果具有很好的可解释性。
如果我们使用线性回归模型对其进行拟合并预测的话,我们的模型可以是:
用矩阵形式表达:
线性回归一般使用均方误差作为损失函数(真实误差求和会出现正负抵消的情况,绝对误差不处处可导求解不方便)。
损失函数的代数法表示如下:
对于线性回归的损失函数J(θ)的求解,常用的有两种方法来求损失函数最小化时候的θ参数:一种是梯度下降法,一种是最小二乘法。
多项式回归中,加入了特征的更高次方(例如平方项或立方项),相当于增加了模型的自由度,用来捕获数据中非线性的变化。由于添加了特征的高阶项,增加了模型的复杂度,提高模型的表达能力,可以用线性模型解决非线性问题。
随着模型的容量以及拟合数据的能力增加,可以进一步降低训练误差,导致过拟合的风险也随之增加。
多元线性回归是对简单线性回归样本特征做了推广。现在对标签y做推广,比如我们的输出Y不满足和X的线性关系,但通过联系函数使Y 和X满足线性关系,如:满足g(y)= 的模型称为广义线性模型,其中单调可微函数g(·)称为联系函数。
如:对数线性回归其示例所对应的输出标记是在指数尺度上变化,那就可将输出标记的对数作为线性模型逼近的目标,即 (1),它实际上是在试图让 逼近y,式(1)形式上仍是线性回归,但实质上已是在求取输入空间到输出空间的非线性函数映射,如下图。这里的对数函数起到了将线性回归模型的预测值与真实标记联系起来的作用。
对数线性回归示意图
为了防止模型的过拟合,在建立线性模型的时候经常需要加入正则化项。一般有L1正则化和L2正则化。
线性回归的L1正则化通常称为Lasso回归,它和一般线性回归的区别是在损失函数上增加了一个L1正则化的项,L1正则化的项有一个常数系数α来调节损失函数的均方差项和正则化项的权重,具体Lasso回归的损失函数表达式如下:
Lasso回归可以使得一些特征的系数θ变小,曲线不会那么陡峭(平缓一些),增强模型的泛化能力。此时θ从1开始,θ0只代表曲线的高低,不代表曲线的陡峭与缓和。
线性回归的L2正则化通常称为Ridge回归,它和一般线性回归的区别是在损失函数上增加了一个L2正则化的项,和Lasso回归的区别是Ridge回归的正则化项是L2范数,而Lasso回归的正则化项是L1范数。具体Ridge回归的损失函数表达式如下:
Ridge回归在不抛弃任何一个特征的情况下,缩小了回归系数,使得模型相对比较的稳定,但和Lasso回归比,这会使模型的特征留的特别多,模型解释性差。
L1正则化与L2正则化都有助于降低过拟合风险,但L1正则化还会带来额外的好处,它比L2正则化更易使一些无关的特征参数变为0,所以可以将其用于特征选择。
易混淆概念对比:
主成分分析(Principal components analysis,PCA)是一种无监督线性降维方法,它将数据从原来的坐标系转换到了新的坐标系,新坐标系的选择是由数据本身决定的,第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴的选择和第一个坐标轴正交且具有最大方差的方向(找到一个轴,使得样本空间的所有点映射到这个轴后,方差最大,求出第一主成分之后,对数据进行改变,将数据在第一个主成分上的分量去掉,在新的数据上求第一主成分,相当于原数据的第二主成分)。该过程一直重复,重复次数为原始数据中特征的数目,大部分方差都包含在最前面的几个新的坐标轴中,可以忽略余下的坐标轴,即对数据进行了降维处理。
PCA算法的核心思想是将原始高维空间中众多的相关变量通过线性变换转换为维数较少且相互独立的变量。降维之后的变量虽不相关,但却尽可能多的表示了原始变量所包含的主要信息。
在正交属性空间中的样本点,如果有一个超平面可以对所有样本进行恰当的表达那么该超平面应该有这样的性质:
最近重构性:样本点到超平面的距离都足够近;最大可分性:样本点在超平面上的投影能尽可能分开。基于最近重构性和最大可分性,能分别得到主成分分析的两种等价推导。基于最近重构性的最小投影距离推导的优化目标,与基于最大投影方差的优化目标完全一样,只是一个是加负号的最小化,一个是最大化
对样本进行中心化的目的是移动坐标轴,使样本空间中每一个维度均值均为0,方便方差的计算。
核主成分分析KPCA介绍
实践中长通过对X进行奇异值分解来代替协方差矩阵的特征值分解。
将降维后的数据映射到原数据维度:
由于降维会丢失一些信息,所以再重新升维到原数据维度时是与原数据样本不一样的,此时只是低维样本在高维空间的一种表示(缺失维度填充0)
PCA算法的主要缺点有:
线性判别分析(LDA)是一种有监督的线性降维方法。与PCA不考虑样本类别输出不同,LDA数据集每个样本是有类别输出的。其核心思想就是“投影后类内方差最小,类间方差最大”。给定训练数据集,设法将样本投影到一条直线上,使得同类样本的投影点尽可能接近、异类样本投影点间的距离尽可能远;在对新样本进行分类时,将其投影到同样的这条直线上,再根据投影点的位置来确定新样本的类别。
将红色和蓝色两类数据投影到一条直线上,让每个类别数据的投影点尽可能的接近,而红色和蓝色数据中心之间的距离尽可能的远。
LDA算法既可以用来降维,又可以用来分类,LDA用于分类的基本思想是:假设各个类别的样本数据符合高斯分布,利用LDA进行投影后,可以利用极大似然估计计算各个类别投影数据的均值和方差,进而得到该类别高斯分布的概率密度函数。当一个新的样本到来后,对其投影,然后将投影后的样本特征分别带入各个类别的高斯分布概率密度函数,计算它属于这个类别的概率,最大的概率对应的类别即为预测类别。
LDA算法流程
LDA算法的优缺点
LDA算法的主要优点有:
LDA算法的主要缺点有:
LDA与PCA的异同
相同点:
不同点:
K-Means是一种常用的无监督的聚类算法。它的基本思想是:对于给定的样本集,按照样本间的距离大小,将样本集划分为K个簇,使簇内点的距离尽可能近,而让簇间的距离尽量的远。通过迭代方式寻找K个簇的一种划分,使得聚类结果对应的代价函数最小(各个样本距离所属簇中心点的误差平方和)。
如果直接求上式的最小值并不容易,这是一个NP难的问题,因此只能采用启发式的方法,使用贪心策略,通过迭代优化来近似求解。
图a为初始数据集,假设k=2;在图b中,随机选择了两个k类所对应的类别质心,然后分别求样本中所有点到这两个质心的距离,并标记每个样本的类别为与该样本距离最小质心的类别,如图c;经过计算样本和红色质心与蓝色质心的距离,可以得到所有样本点第一轮迭代后的类别。此时对当前标记为红色和蓝色的点分别求其新的质心,新的红色质心和蓝色质心的位置已经发生了变动如图d;图e和图f重复了图c和图d的过程,即将所有点的类别标记为距离最近的质心的类别并求新的质心。最终得到的两个类别如图f。在实际K-Mean算法中,一般会多次运行图c和图d,才能达到最终的比较优的类别。
K-Means算法流程
为避免运行时间过长,通常设置一个最大运行轮数或最小调整幅度阈值。若达到最大轮数或调整幅度小于阈值,则停止运行。
采用核函数进行优化:
传统的欧式距离度量方式使得K均值算法本质上假设了各个数据簇的数据具有一样的先验概率,并呈现球形或者高维球形分布,这种分布在实际生活中并不常见。面对非凸的数据分布形状时,可能需要引入核函数来优化,这时算法又称为核K均值算法。核聚类方法的主要思想是通过一个非线性映射,将输入空间中的数据点映射到高维的特征空间中,并在新的特征空间中进行聚类。非线性映射增加了数据点线性可分的概率,从而在经典的聚类算法失效的情况下,通过引入核函数可以达到更为准确的聚类结果。
K-Means与KNN的异同
不同点:
相同点:
两者都利用了最近邻(nearest neighbors)的思想,找出和某一个点最近的点。
K-Means的优缺点总结:
优点:
缺点:
基于平方误差最小化来进行模型求解的方法称为“最小二乘法”。在线性回归中,最小二乘法就是试图找到一条直线,使所有样本到直线上的欧氏距离之和最小。
这样我们得到一个N+1元一次方程组,这个方程组有N+1个方程,求解这个方程,就可以得到所有的N+1个未知的θ。
该方法很容易推广到多个样本特征的非线性拟合。原理和上面的一样,都是用损失函数对各个参数求导取0,然后求解方程组得到参数值。
矩阵法比代数法要简洁,且矩阵运算可以取代循环,所以现在很多书和机器学习库都是用的矩阵法来做最小二乘法。
这里用上面的多元线性回归例子来描述矩阵法解法。
最小二乘法局限性:
在微积分里,对多元函数的参数求偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。从几何意义上讲,梯度是函数值变化最快的地方。沿着梯度向量的方向,函数值增加最快,更加容易找到函数的最大值。沿着梯度向量相反的方向,函数值减少最快,更加容易找到函数的最小值。
梯度下降法(gradient descent)是求解无约束最优化问题的一种最常用的方法。它是一种迭代算法,由于负梯度方向是使函数下降最快的方向,对于迭代的每一步需要求解目标函数的梯度向量:选取适当的初值θ0,以负梯度方向迭代更新θ的值,进行目标函数的极小化,直到收敛。在机器学习算法中,在最小化损失函数时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值(不同参数对应不同的损失,找到最佳参数使损失最小)。最优化效用函数时可以使用梯度上升法进行迭代。
在线性回归例子中,损失函数不除以m,随着样本数的增多,损失函数越来越大,除以m是为了去除样本数对损失函数的影响;除以2是求导后可以约去。
批量梯度下降法(Batch Gradient Descent)是梯度下降法最常用的形式,具体做法是在更新参数时使用所有的样本来进行更新,这个方法对应于前面的线性回归的梯度下降算法。
由于我们有m个样本,这里求梯度的时候就用了所有m个样本的梯度数据。
随机梯度下降法(Stochastic Gradient Descent)和批量梯度下降法原理类似,区别在与求梯度时没有用所有的m个样本的数据,而是仅仅选取一个样本j来求梯度。对应的更新公式是:
随机梯度下降法和批量梯度下降法是两个极端,一个用一个样本来梯度下降,一个采用所有数据来梯度下降。可以从三个方面进行对比:
小批量梯度下降法(Mini-batch Gradient Descent)是批量梯度下降法和随机梯度下降法的折衷,也就是对于m个样本,采用x个样本来迭代,1 在机器学习中的无约束优化算法,除了梯度下降以外,还有最小二乘法,牛顿法和拟牛顿法。 梯度下降法和最小二乘法相比:梯度下降法是迭代求解需要选择步长,最小二乘法是计算解析解。如果样本量不算很大,且存在解析解,最小二乘法比梯度下降法计算速度很快。但是如果样本量很大,用最小二乘法由于需要求一个超级大的逆矩阵,求解析解较慢,使用迭代的梯度下降法比较有优势。 梯度下降法和牛顿法/拟牛顿法相比,两者都是迭代求解,不过梯度下降法是梯度求解,而牛顿法/拟牛顿法是用二阶的海森矩阵的逆矩阵或伪逆矩阵求解。相对而言,使用牛顿法/拟牛顿法收敛更快。但是每次迭代的时间比梯度下降法长。 适用与所有损失函数,可以在求出解析解之前用于结果的验证。 梯度下降算法调试