社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

【机器学习】机器学习中的维度灾难

小白学视觉 • 5 年前 • 395 次点击  

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自 | 深度学习专栏
1
介绍

本篇文章,我们将讨论所谓的“维度灾难”,并解释在设计一个分类器时它为何如此重要。在下面几节中我将对这个概念进行直观的解释,并通过一个由于维度灾难导致的过拟合的例子来讲解。


考虑这样一个例子,我们有一些图片,每张图片描绘的是小猫或者小狗。我们试图构建一个分类器来自动识别图片中是猫还是狗。要做到这一点,我们首先需要考虑猫、狗的量化特征,这样分类器算法才能利用这些特征对图片进行分类。例如我们可以通过毛皮颜色特征对猫狗进行识别,即通过图片的红色程度、绿色程度、蓝色程度不同,设计一个简单的线性分类器:


  1. If 0.5*red+0.3*green+0.2*blue>0.6:

  2.    return cat;

  3. else:

  4.    return dog;

红、绿、蓝三种颜色我们称之为特征Features,但仅仅利用这三个特征,还不能得到一个完美的分类器。因此,我们可以增加更多的特征来描述图片。例如计算图片X和Y方向的平均边缘或者梯度密度。现在总共有5个特征来构建我们的分类器了。

为了得到更好的分类效果,我们可以增加更多特征,例如颜色、纹理分布和统计信息等。也许我们能得到上百个特征,但是分类器的效果会变得更好吗?答案有些令人沮丧:并不能!事实上,特征数量超过一定值的时候,分类器的效果反而下降。图1显示了这种变化趋势,这就是“维度灾难”。

 

图1. 随着维度增加,分类器性能提升;维度增加到某值后,分类器性能下降


下一节我们将解释为什么产生这条曲线并讨论如何避免这种情况发生。


2
维度灾难与过拟合

在之前引入的猫和狗的例子中,我们假设有无穷多的猫和狗的图片,然而,由于时间和处理能力限制,我们只得到10张图片(猫的图片或者狗的图片)。我们的最终目标是基于这10张图片构建一个分类器,能够正确对10个样本之外的无限多的图片进行正确分类


现在,让我们使用一个简单的线性分类器来尝试得到一个好的分类器。如果只使用一个特征,例如使用图片的平均红色程度red。 

图2. 单个特征对训练样本分类效果不佳 


图2展示了只使用一个特征并不能得到一个最佳的分类结果。因此,我们觉得增加第二个特征:图片的平均绿色程度green。 

图3. 增加第二个特征仍然不能线性分割,即不存在一条直线能够将猫和狗完全分开。


最后,我们决定再增加第三个特征:图片的平均蓝色程度,得到了三维特征空间: 

图4. 增加第三个特征实现了线性可分,即存在一个平面完全将猫和狗分开来。 


在三维特征空间,我们可以找到一个平面将猫和狗完全分开。这意味着三个特征的线性组合可以对10个训练样本进行最佳的分类。 

图5. 特征越多,越有可能实现正确分类 


以上的例子似乎证明了不断增加特征数量,直到获得最佳分类效果,是构建一个分类器的最好方法。但是,之前图1中,我们认为情况并非如此。我们需要注意一个问题:随着特征维度的增加,训练样本的在特征空间的密度是如何呈指数型下降的?


在1D空间中(图2所示),10个训练样本完全覆盖了1D特征空间,特征空间宽度为5。因此,1D下的样本密度是10/2=5。而在2D空间中(图3所示),同样是10个训练样本,它构成的2D特征空间面积为5x5=25.因此,2D下的样本密度是10/25=0.4。最后在3D空间中,10个训练样本构成的特征空间大小为5x5x5=125,因此,3D下的样本密度为10/125=0.08。


如果我们继续增加特征,整个特征空间维度增加,并变得越来越稀疏。由于稀疏性,我们更加容易找到一个超平面来实现分类。这是因为随着特征数量变得无限大,训练样本在最佳超平面的错误侧的可能性将会变得无限小。然而,如果我们将高维的分类结果投影到低维空间中,将会出现一个严重的问题: 

图6. 使用太多特征导致过拟合。分类器学习了过多样本数据的异常特征(噪声),而对新数据的泛化能力不好。


图6展示了3D的分类结果投影到2D特征空间的样子。样本数据在3D是线性可分的,但是在2D却并非如此。事实上,增加第三个维度来获得最佳的线性分类效果,等同于在低维特征空间中使用非线性分类器。其结果是,分类器学习了训练数据的噪声和异常,而对样本外的数据拟合效果并不理想,甚至很差。


这个概念称为过拟合,是维度灾难的一个直接后果。图7展示了一个只用2个特征进行分类的线性分类器的二维平面图。 

图7. 尽管训练样本不能全都分类正确,但这个分类器的泛化能力比图5要好。


尽管图7中的简单的线性分类器比图5中的非线性分类器的效果差,但是图7的分类器的泛化能力强。这是因为分类器没有把样本数据的噪声和异常也进行学习。另一方面说,使用更少的特征,维度灾难就能避免,就不会出现对训练样本过拟合的现象。


图8用不同的方式解释上面的内容。假设我们只使用一个特征来训练分类器,1D特征值的范围限定在0到1之间,且每只猫和狗对应的特征值是唯一的。如果我们希望训练样本的特征值占特征值范围的20%,那么训练样本的数量就要达到总体样本数的20%。现在,如果增加第二个特征,也就是从直线变为平面2D特征空间,这种情况下,如果要覆盖特征值范围的20%,那么训练样本数量就要达到总体样本数的45%(0.45*0.45=0.2)。而在3D空间中,如果要覆盖特征值范围的20%,就需要训练样本数量达到总体样本数的58%(0.58*0.58*0.58=0.2)。 

图8. 覆盖特征值范围20%所需的训练样本数量随着维度增加呈指数型增长 


换句话说,如果可用的训练样本数量是固定的,那么如果增加特征维度的话,过拟合就会发生。另一方面,如果增加特征维度,为了覆盖同样的特征值范围、防止过拟合,那么所需的训练样本数量就会成指数型增长。


在上面的例子中,我们展示了维度灾难会引起训练数据的稀疏化。使用的特征越多,数据就会变得越稀疏,从而导致分类器的分类效果就会越差。维度灾难还会造成搜索空间的数据稀疏程度分布不均。事实上,围绕原点的数据(在超立方体的中心)比在搜索空间的角落处的数据要稀疏得多。这可以用下面这个例子来解释:


想象一个单位正方形代表了2D的特征空间,特征空间的平均值位于这个单位正方形的中心处,距中心处单位距离的所有点构成了正方形的内接圆。没有落在单位圆的训练样本距离搜索空间的角落处更距离中心处更近,而这些样本由于特征值差异很大(样本分布在正方形角落处),所有难以分类。因此,如果大部分样本落在单位内接圆里,就会更容易分类。如图9所示: 

图9. 落在单位圆之外的训练样本位于特征空间角落处,比位于特征空间中心处的样本更难进行分类。


一个有趣的问题是当我们增加特征空间的维度时,随着正方形(超立方体)的体积变化,圆形(超球体)的体积是如何变化的?无论维度如何变化,超立方体的体积都是1,而半径为0.5的超球体的体积随着维度d的变化为: 

图10展示了随着维度d的增加,超球面的体积是如何变化的: 

图10. 维度d很大时,超球面的体积趋于零 


这表明了随着维度变得越来越大,超球体的体积趋于零,而超立方体的体积是不变的。这种令人惊讶的反直觉发现部分解释了在分类中维度灾难的问题:在高维空间中,大部分的训练数据分布在定义为特征空间的超立方体的角落处。就像之前提到的,特征空间角落处的样本比超球体内的样本更加难以进行正确分类。图11分别从2D、3D和可视化的8D超立方体(2^8=256个角落)的例子论证了这个结论。

图11. 随着维度增加,大部分数量数据分布在角落处 


对于8维的超球体,大约98%的数据集中在它256个角落处。其结果是,当特征空间的维度变得无限大时,从样本点到质心的最大、最小欧氏距离的差值与其最小欧式距离的比值趋于零: 

因此,距离测量在高维空间中逐渐变得无效。因为分类器是基于这些距离测量的(例如Euclidean距离、Mahalanobis距离、Manhattan距离),所以低维空间特征更少,分类更加容易。同样地,在高维空间的高斯分布会变平坦且尾巴更长。


3
如何避免维度灾难

图1展示了随着维度变得很大,分类器的性能是下降的。那么问题是“很大”意味着什么?过拟合如何避免?很遗憾,在分类问题中,没有固定的规则来指定应该使用多少特征。事实上,这依赖于训练样本的数量、决策边界的复杂性和使用的是哪个分类器。


如果理论上训练样本时无限多的,那么维度灾难不会发生,我们可以使用无限多的特征来获得一个完美的分类器。训练数据越少,使用的特征就要越少。如果N个训练样本覆盖了1D特征空间的范围,那么在2D中,覆盖同样密度就需要N*N个数据,同样在3D中,就需要N*N*N个数据。也就是说,随着维度增加,训练样本的数量要求随指数增加。


此外,那些非线性决策边界的分类器(例如神经网络、KNN分类器、决策树等)分类效果好但是泛化能力差且容易发生过拟合。因此,当使用这些分类器的时候,维度不能太高。如果使用泛化能力好的分类器(例如贝叶斯分类器、线性分类器),可以使用更多的特征,因为分类器模型并不复杂。图6展示了高维中的简单分类器对应于地位空间的复杂分类器。


因此,过拟合只在高维空间中预测相对少的参数和低维空间中预测多参数这两种情况下发生。举个例子,高斯密度函数有两类参数:均值和协方差矩阵。在3D空间中,协方差矩阵是3x3的对称阵,总共有6个值(3个主对角线值和3个非对角线值),还有3个均值,加在一起,一共要求9个参数;而在1D,高斯密度函数只要求2个参数(1个均值,1个方差);在2D中,高斯密度函数要求5个参数(2个均值,3个协方差参数)。我们可以发现,随着维度增加,参数数量呈平方式增长。


在之前的文章里我们发现,如果参数数量增加,那么参数的方差就会增大(前提是估计偏差和训练样本数量保持不变)。这就意味着,如果围度增加,估计的参数方差增大,导致参数估计的质量下降。分类器的方差增大意味着出现过拟合。


另一个有趣的问题是:应该选择哪些特征。如果有N个特征,我们应该如何选取M个特征?一种方法是在图1曲线中找到性能最佳的位置。但是,由于很难对所有的特征组合进行训练和测试,所以有一些其他办法来找到最佳选择。这些方法称之为特征选择算法,经常用启发式方法(例如贪心算法、best-first方法等)来定位最佳的特征组合和数量。


还有一种方法是用M个特征替换N个特征,M个特征由原始特征组合而成。这种通过对原始特征进行优化的线性或非线性组合来减少问题维度的算法称为特征提取。一个著名的维度降低技术是主成分分析法(PCA),它去除不相关维度,对N个原始特征进行线性组合。PCA算法试着找到低维的线性子空间,保持原始数据的最大方差。然而,数据方差最大不一定代表数据最显著的分类信息。


最后,一项非常有用的被用来测试和避免过拟合的技术是交叉验证。交叉验证将原始训练数据分成多个训练样本子集。在分类器进行训练过程中,一个样本子集被用来测试分类器的准确性,其他样本用来进行参数估计。如果交叉验证的结果与训练样本子集得到的结果不一致,那么就表示发生了过拟合。如果训练样本有限,那么可以使用k折法或者留一发进行交叉验证。


4
结论

这篇文章我们讨论了特征选择、特征提取、交叉验证的重要性,以及避免由维度灾难导致的过拟合。通过一个过拟合的简单例子,我们复习了维度灾难的重要影响。


下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/110432