典型降维算法的探讨与实践
典型降维算法的探讨与实践
降维算法是机器学习和数据挖掘中常用的技术,旨在减少数据集中的特征数量,同时尽可能保留原始数据中的重要信息。本文将探讨两种典型的降维算法:主成分分析(PCA)和t分布随机邻域嵌入(t-SNE),并给出具体的实践案例。
引言
和撰写博文[1]的缘由一样,本文是想要在所创设的专栏[2]里把所谓的十大机器学习算法[3]全部过一遍。 降维算法不解决机器学习中典型的:分类或拟合问题,该算法的定位是作为一个辅助工具,用于解决数据样本的特征冗余问题,通过降低特征数量减小计算和算法的复杂度、减小数据存储成本、加速训练过程、乃至使数据得以可视化。本文的目的在于捋清楚几种典型降维算法的原理、并进行降维实践。
Blog
2024.11.16 博文第一次写作
目录
- 引言
- 目录
- 一、降维算法相关概念
- 二、PCA算法及其实践
- 2.1 PCA算法的基本原理
- 2.2 基于PCA算法进行降维的典型处理流程
- 2.3 基于PCA算法的降维实践
- 三、t-SNE算法及其实践
- 3.1 t-SNE算法的基本原理
- 3.2 基于t-SNE算法的降维实践
- 四、总结
- 五、参考资料
- 六、数据和代码
一、降维算法相关概念
降维算法是机器学习和数据挖掘中常用的技术,旨在减少数据集中的特征数量,同时尽可能保留原始数据中的重要信息。降维的本质就是将高维空间的数据映射到低维空间中,不同的映射方法就对应了不同的实现算法,一般来说我们可以将降维算法分为线性和非线性两种。 主成分分析(principal component analysis, PCA)、线性判别分析(Linear Discriminant Analysis, LDA)、奇异值分解(singular Value Decomposition, SVD)等是典型的线性降维方法;t分布随机邻域嵌入(t-distributed stochastic Neighbor Embedding, t-SNE)、核主成分分析(Kernel PCA)等是典型的非线性降维方法。当然,还有很多其它的降维算法,本文将着眼于PCA和t-SNE。
降维算法的优点包括:通过降低特征数量可以减小计算和算法的复杂度、减小数据存储成本、加速训练过程、提高模型的泛化能力、乃至使数据得以可视化等。但同时,也存在一些可能的问题:包括重要信息丢失的风险、降维后的数据可能难以解释,映射得到的特征其含义可能不再明显、一些复杂的非线性降维算法的计算复杂度高,可能消耗大量计算资源、此外,某些情况下可能导致过拟合。
如引言中所述,本文的目的不是研究降维算法,而是捋清现有几种典型算法的原理以及能跑通降维的实践过程。本文暂不对算法的优劣、以及降维后的效果进行评估,读者可以在本文的基础上,结合本专栏[2]之前探讨过的分类和拟合算法做更进一步的实践与分析。
二、PCA算法及其实践
2.1 PCA算法的基本原理
样本原有的各个特征之间可能存在相关性,PCA算法的基本思想是设法将关系相对紧密的N个特征减少为互不相关的M个特征,这M个特征是在原有的N个特征的基础上重新构造出来的,这M个正交的特征也被称为主成分。 总之,在经过这一操作后,我们期望样本之间更有区分度:比如对于聚类或者分类问题,我们期望所属不同类别的样本之间间隔更远。(某种程度下似乎有降噪的效果?)
在[3]中给出了一个将二维特征一维化的例子,很能说明PCA算法的基本思想,我这里引用一下,假设我们的样本有两个特征:(xi, yi),我们可以将之可视化为:
图2.1 样本原始特征
这里给出三种降维(映射)方法:
图2.2 样本特征往Y轴映射
图2.3 样本特征往X轴映射
图2.4 样本特征往(ax, by)矢量和方向映射
(x、y为单位矢量,a, b为标准化后的值:a^2 + b^2 =1)
按照我们上面对降维所期望达到的效果的说法:在尽量保留样本重要特征信息的基础上,使得样本之间的区分度(间隔)更大。 上面三种降维方法下明显最后一种是最优的(第三种映射方法下,等价于我们构造了新的坐标轴,其方向为ax+by的矢量和方向,对于原始样本点(xi, yi),我们将之降维映射为:z = axi+byi)。
我们如何评价样本间隔? 最直接的方法就是方差值!方差越大说明样本之间越分散。那么问题就变成了如何找到合适的映射轴,将样本特征都往这个轴上进行映射,且经过映射后得到的特征下,样本之间的方差是最大的(至少是变大了)。如果我们找到了M个(M大于等于1,小于N, N为样本的原始特征数)这种映射轴,则就可以将样本特征数从N维降低至M维。(降低到1维理论上是没问题的,但是如前所述,降维的过程也伴随着信息的丢失,降得太凶了也不好… 会带来各种问题,一般我们会使得M = 0.8*N?)
再拓展一下:如果我们得到了(或者说设计了)M个映射轴,那么本质上来说,就是我们以这M个坐标轴构建了一个新的坐标系,并将数据都映射到了这个坐标系下。
2.2 基于PCA算法进行降维的典型处理流程
在文章[4]、[5]中,作者从比较底层的角度给出了有关方差最大映射轴求解的推导,这些内容太细节了,本文暂不做论述,感兴趣的读者可以参看这两篇文章。(简单来说就是:先预设一个映射轴方向为W,然后将样本的数据都往这个轴上映射:Y = W*X,随后对得到的Y求其方差值,并使得到使其取最大值下的W,本质上就是一个类似之前探讨过多次的回归问题中的最优化问题,我们也可以用梯度下降法求解,不过也有数值解。)
总之,我们可以得到的一个结论是:原始样本特征下,所能获得的最大方差对应的是样本特征的协方差矩阵的最大特征值,且此时的最大方差映射轴就是最大特征值对应的特征向量,以此类推:第k大特征值对应的特征向量就是使得映射后样本方差第k大的映射轴… (K小于等于N,N为样本的原始特征数)。
有了上述结论,我们就可以得到基于PCA算法进行降维的求解流程:
图2.5 PCA算法降维处理的典型流程
比如我们假设数据集的大小为:
, N为单个样本的特征数,M为样本数;则求其协方差矩阵后,我们可以得到一个NN大小的矩阵:
对该矩阵做特征值分解,我们可以得到一个由特征向量构成的矩阵
和一个由特征值构成的向量
。此时我们可以选取前K个最大的特征值对应的特征向量构成我们降维用的映射矩阵:
,该矩阵的每一列对应一种坐标轴映射方法,随后,我们将该矩阵和数据集的原始特征相乘,完成降维:
降维后得到的数据集大小为KM,K为新的特征数量,M为样本数量。 再之后,我们就可以用该新的数据集进行聚类、拟合、分类等处理(具体可以参考我在本专栏[2]之前的一些博文)。
2.3 基于PCA算法的降维实践
在前文的指导下,本节对经典的Iris数据集[6]进行降维。该数据集是我专栏[2]中的常客了…,在之前的聚类[7]、分类相关博文中都有用到。有关该数据集的具体介绍读者可以参考博文[7]第2.1节的内容。
该数据集也叫鸢尾花卉数据集,数据集包含150个样本,分三类,每类50个数据,每个数据有4个特征(所以该数据集大小为150*4的矩阵):分别是花萼长度、花萼宽度、花瓣长度、花瓣宽度。 四维的数据是无法可视化的,我在博文[7]中做聚类时,先将之用后一章将要探讨的t-SNE算法降到了二维(那个时候对降维算法还没有多少概念,虽然做聚类其实四维的数据也可以直接做,但是无法可视化,所以我当时把数据先降维了再做的聚类)。
在前述理论的支撑下,依据图2.5的处理流程,我分别将该数据集的四维特征降低为三维、二维、和一维(以使其可视化),得到的结果如下:(我把类别也赋上去了,三种颜色表征三种类别。 降维算法可以辅助我们发现数据的内部结构(比如类别数),无法帮助我们实现聚类!)
图2.6 将数据集降低为3维后的结果
图2.7 将数据集降低为2维后的结果
图2.8 将数据集降低为1维后的结果
图中纵轴没有实际意义,只不过一维下我将数据全部放在了纵坐标为0对应的直线上。
从上面三幅图的结果来看,我们确实可以看到数据有明显的三个类别(不过其中两个挨得比较近)。
三、t-SNE算法及其实践
3.1 t-SNE算法的基本原理
t-SNE算法是一种非线性的降维算法,被比较多地应用于高维数据的降维,特别是可视化!t-SNE算法的基本思想是:在保持数据点之间局部相似性的基础上,将高维数据映射到低维。 【有关该算法实现的细节我在本文不再给出,读者可以参考资料[8]或者其它资料。我这里只给出一个定性的理解,后续实践时我也是直接调用现有的函数实现】
t-SNE算法的实现可以分为三步:
1.计算原始数据集中两两数据之间的相似度,并得到相似度矩阵
,M为数据集的样本数量。该矩阵的每个值:
表示第i个和第j个样本之间的相似度,相似度的计算我们是通过求条件概率P(j|i)实现的:我们以第i个样本为中心,计算高维空间中其它的点到它的距离,并对这些距离构建一个均值为0,方差为σ2 的高斯概率密度分布:其它的点离这个点越近,对应的P(j|i)概率值(相似度)越高。
如此,我们可以构造一个大小为M*M的相似度矩阵。
2.将高维数据随机地映射到某个映射轴(对这个映射轴的理解可以参考第二章的描述)上,类似第一点中的处理,我们对此时的数据重新计算出一个相似度矩阵
,只不过此时我们不是用高斯分布来计算概率,而是用t分布来计算概率(这也是t-SNE中 t的由来,如果这里我们还是用高斯分布来计算相似度,那么算法就叫SNE了,但是这里仍然使用高斯分布会有一些问题:拥挤问题,具体读者可以参考资料[8]),t分布有点类似高斯分布,不过它有比较长的拖尾。
总之,经过处理,我们仍然可以得到一个大小为M*M的相似度矩阵。
3.设计优化算法,改变(移动)第2点中初始化映射下数据点的位置,使得数据点在该一维映射轴上的相似度矩阵F逼近我们在第1点中得到的相似度矩阵S,从而完成数据的降维。
如何设计优化算法?我们会用到K-L散度(相对熵),具体的也请参考[8]或者其它资料的内容。
3.2 基于t-SNE算法的降维实践
Matlab中有内置的tsne函数实现t-SNE算法下的数据降维。本节将直接使用该函数对Iris数据集进行降维,该函数的使用很简单,我们也无需对数据进行标准化处理,这里不做介绍。
类似第二章中的处理,我在本节也将数据集分别降为1维、2维和3维,得到的结果如下:
图3.1 将数据集降低为3维后的结果
图3.2 将数据集降低为2维后的结果
图3.3 将数据集降低为1维后的结果
直观来看,2、3维下的效果比PCA算法下要好一些?这里需要注意的是:t-SNE算法不会保证前后运算的一致性(读者拿我后文提供的代码跑出来的结果和我上面三幅图的结果不一定是一样的)。这是因为如我3.1节对该算法实现步骤的论述中所描述的:我们第二步的映射是随机初始化的,第三步中优化算法的最终收敛得到的结果也可能不一样,那么降维后的结果自然也可能不一样。
此外,Matlab自带的tsne函数中还提供了一些特定参数的设置,通过调整这些参数可能可以得到更好的降维效果,我在本节的仿真中只对降维的最终维度有设置,其它的参数都设置为默认,读者可以参考tsne的help文档做更深入的研究。
四、总结
本文对降维算法做了梳理,首先给出了降维处理的基本概念做了介绍,简要探讨了其基本原理、在机器学习中的定位(必要性)、优缺点、以及典型的降维算法有哪些。
随后,分别以线性降维方法中的PCA算法、非线性降维方法中的t-SNE算法为研究对象,阐述了其基本原理,给出了基于算法的降维实践结果。
此外需要说明的是:
1.降维的目的是为了更好地推进后续的分类、聚类或者拟合的实现,所以评价降维算法好坏的标准除了可以用降维算法自身的计算复杂度等指标外,更重要的还是得基于后续的分类、聚类或者拟合的最终实践结果(是不是相较于不进行降维,或者用其它的降维算法,我们的这个降维算法对数据集降维后模型的训练时长、最终的分类准确率等等指标是否有改善?)。
这一点我没有在本文中做出实践。
2.从第二、三章的实践结果来看,将数据降维并可视化后,可以帮助我们直观地观察数据集的结构!我在这两章的结果中把每个数据的类别标签都赋上去了,试想如果我们事先不知道数据集可以分成几类,这里的降维算法是可以帮助我们直观地观察到数据的类别数!
本文的工作进一步丰富了专栏[2]:机器学习_墨@#≯的博客-CSDN博客的工具箱!为后续更复杂的深度学习等内容的理解和实践打下了基础。
本文的论述暂时只想到这些,后续有更多的实践经验我再补充。
五、参考资料
[1]KNN算法及基于该算法的回归和分类实践-CSDN博客
[2]机器学习_墨@#≯的博客-CSDN博客
[3]Machine Learning: 十大机器学习算法 - 知乎
[4]机器学习笔记(九)——数据降维:主成分分析法(PCA)_主成分分析法是降维算法吗-CSDN博客
[5]一文让你彻底搞懂主成成分分析PCA的原理及代码实现(超详细推导)-CSDN博客
[6]Iris - UCI Machine Learning Repository
[7](毫米波雷达数据处理中的)聚类算法(2) – DBSCAN算法及其实践-CSDN博客
[8]t-SNE算法详解-CSDN博客
六、数据和代码
典型降维算法的探讨与实践博文对应的数据和代码资源-CSDN文库