type
status
date
slug
summary
tags
category
icon
password
01
常见的降维技术
接触过机器学习的同学都知道,很多机器学习问题会涉及成千上万甚至更多的特征。过多的维度会引起维数灾难,导致很多的问题无法在有限时间内收敛。降维可以帮助我们大幅减少特征的数量,剔除掉部分信息量不大的特征。同时将维度减少后,通过数据可视化可以通过视觉检测模式并直观地传达结论。
两种减少维度的主要方式是投影和流形学习,有兴趣的同学可以自行去学习下。对于常用的降维算法,我们一般按照是否是线性方法进行分类。
- 线性方法:主成分分析(PCA)、线性判别分析(LDA)
- 非线性方法:内核PCA、局部线性嵌入(LLE)、多维缩放(MDS)、t分布随机近邻嵌入(t-SNE)、Isomap
02
不废话,上代码
废话不多说,我们直接上代码来看一下手写数字数据集MNIST应用这些降维算法的耗时和可视化效果。MNIST数据集是一组由美国高中生和人口调查局员工手写的70000张数字图片(代表数字0-9),每张图片由764个像素(28X28)构成。我们可以通过sklearn.datasets或tensorflow.keras.datasets很方便地获取这个数据集。
我们可以把每张图片理解为由764个特征组成的一个实例,面对这么多的特征,如果我们想直接进行可视化通过视觉检测这些数字的模式是不现实的,这时我们就可以运用降维技术将764个特征减少到2维来进行可视化。为了加快计算的时间,我们先将训练集做一个划分,随机选择其中3000个图片进行降维和可视化。同时我们写一个简单的函数来进行降维、计算耗时和可视化。最后我们从sklearn中导入我们要进行测试的降维算法。
接下来就让我们看一下效果,运行时间会视硬件不同而有所差异。
大家可以看到在运算时间(为了对比运行时间我分别在1k和3k数据集上运行了6种算法,下方的可视化仅显示3k数据上的效果)和可视化效果上各个算法会有显著的差异。
运算时间:线性方法PCA的运算速度最快,数据量从1k变成3k,运算时间只从0.02秒增长为0.05秒,基本是随数据集线性增长。而非线性方法MDS的运算时间则提升为原来的10倍以上,可以预见MDS算法是难以运用在大规模数据集和海量特征上的。非线性方法中Kernel PCA具有最快的运算速度。
可视化:tSNE算法在对MNIST数据集降维后取得了最好的效果,可视化告诉我们部分数字(如2)具有与其他数字显著的差异,可以被很好地区分,而数字3和5的模式则非常相似(与我们的直观感受相符),在建模时也许我们可以通过提升数字3和5的权重使模型学习能够更好区分3和5的参数或单独训练可以区分3和5的模型,从而提升整体模型表现。
总结:虽然tSNE算法对MNIST数据集降维后的可视化效果最佳,但并不代表tSNE就是最好的降维算法。其他五种降维技术在特征工程或运用其它算法前的预处理时能发挥出很好的作用。具体的使用我们还要根据我们的数据集、使用的目的来选择最合适的算法。
算法 | 1k数据运行时间 | 3k数据运行时间 | 可视化 |
PCA | 0.02秒 | 0.06秒 | ㅤ |
KernelPCA | 0.03秒 | 0.24秒 | ㅤ |
tSNE | 3.01秒 | 10.82秒 | 最佳 |
LLE | 0.15秒 | 0.82秒 | ㅤ |
MDS | 27.52秒 | 272.54秒 | ㅤ |
Isomap | 0.41秒 | 4.62秒 | ㅤ |
- 作者:cookiepapa
- 链接:https://xuzheblog.com/article/3b6ce8b3-59f0-46d5-8d8a-0786762965fd
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。