数据降维方法的分类
- 线性/非线性
线性降维是指通过降维所得到的低维数据能保持高维数据点之间的线性关系,主要包括PCA,LDA,LPP
非线性降维一类是基于核的,如KPCA,另一类是流形学习:从高维数据中恢复出低维流形结构(假设数据是均匀采样于一个高维欧氏空间中的低维流形),即找到高维空间中的低维流形,并求出相应的嵌入映射,有lsomap、LLE、Laplacian Eigenmaps、LTSA、MVU
线性方法计算快,复杂度低,但对复杂数据降维效果差
传统的线性技术主要想让不相似的点在低维表示中分开,非线性技术主要保持数据的局部结构
- 监督/非监督
主要区别在于数据样本是否存在类别信息
非监督降维方法的目标是在降维时使信息损失最小,如PCA、LPP、Lsomap、LLE、Laplacian Eigenmaos、LTSA、MVU
监督式降维方法的目标是最大化类别间的辨别信,如LDA
- 全局/局部
局部方法仅考虑样本集合的局部信息,即数据点与临近点之间的关系。局部方法以LLE为代表,还包括Laplacian Eigenmaps、LPP、LTSA。
全局方法不仅考虑样本几何的局部信息,和考虑样本集合的全局信息,及样本点与非临近点之间的关系。全局算法有PCA、LDA、Isomap、MVU。
把一组三维数据(900样本)降到一维,应用八种算法的时间对比:
- 降维的基本作用:
1. 缓解维数灾难。即提高样本密度,以及使基于欧氏距离的算法重新生效。
2. 数据预处理。对数据去冗余、降低信噪比。
3. 方便可视化
线性映射
1. PCA 主成分分析算法
- 期望在所在投影的维度上数据的方差最大,以此使用较少的数据维度,同时保留较多的原数据点特性
- 最优的W是由数据协方差矩阵
前k个最大
的特征值对应的特征向量作为列向量构成的,这些特征向量形成一组正交基并且很好地保留了数据中的信息 - PCA追求的是在降维之后能够最大化保持数据的内在信息,并通过衡量在投影方向上的数据方差的大小来衡量该方向的重要性。
- 无监督
- PCA的优缺点
优点
:1.最小误差 2.提取了主要信息缺点
: PCA将所有的样本(特征向量集合)作为一个整体对待,去寻找一个均方误差最小意义下的最优线性映射投影,而忽略了类别属性,而它所忽略的投影方向可能刚好包含了重要的可分性信息 - 总结PCA算法步骤:
设有 m 条 n 维数据
- 将原始数据按列组成 n 行 m 列矩阵 X;
- 将 X 的每一行进行零均值化,即减去这一行的均值;
- 求出协方差矩阵
4. 求出协方差矩阵的特征值及对应的特征向量;
5. 将特征向量按对应特征值大小从上到下按行排列成矩阵,取前 k 行组成矩阵 P;
6. Y=PX即为降维到 k 维后的数据。
- 在Python中,主成分的函数位于Scikit-Learn下: sklearn.decomposition.PCA(n_components=None, copy=Ture, whiten=False)
参数说明:
n_compontents
-意义:PCA算法中所要保留的主成分个数n,也即保留下来的特征个数,也可以设置成解释 变量的比例。如:pca = PCA(n_components = .98)
-类型:int或者string,缺省时默认为None,所有成分保留。赋值为int,比如n_components=1,将把原始数据降到一个维度。赋值为string,比如n_components='mle',将自动选取特征个数n,使得满足所要求的方差百分比
copy
-类型:bool, Ture或者False,缺省时默认为Ture
-意义:表示是否在运行算法时,将原始数据复制一份。如果为Ture,则运行PCA算法后,原始数据的值不会有任何改变。因为是在原始数据的副本上进行运算的
whiten
-类型:bool,缺省时默认为False
-意义:白化,使得每个特征具有相同的方差
Examples:
from sklearn.decomposition import PCA
import numpy as np
import pandas as pd
data=np.random.randn(10,4)
pca=PCA()
pca.fit(data)
pca.components_ #返回模型的各个特征向量
pca.explained_variance_ratio_ #返回各个成分各自的方差百分比(贡献率)
通过计算累计贡献率,可以确定找到一个合适的n值,比如累计达到97%时,是前3的值,那么下一步去降维时,确定n_components=3。那么,这3维数据占了原始数据95%以上的信息。下面,再重新建立PCA模型。
pca=PCA(3)
pca.fit(data)
low_d=pca.transform(data) #用这个方法来降低维度
pd.DataFrame(low_d).to_excel('result.xlsx') #保存结果
pca.inverse_transform(low_d) #必要时,可以用这个函数来复原数据。
2. LDA 线性判别分析
- 使类内方差最小的同时,使类间方差最大
- 有监督
- 被提出来解决人脸识别问题
非线性映射
核方法(核+线性)、二维化和张量化(二维+线性)、流形学习(ISOMap,LLE,LPP)
t-SNE
- 集降维与可视化于一体的技术,基于SNE可视化的改进,解决了SNE在可视化后样本分布拥挤、边界不明显的特点,是目前最好的降维可视化手段。本质是一种嵌入模型,能够将高维空间中的数据映射到低维空间中,并保留数据集的局部特性。
- 我们想要对高维数据进行分类,又不清楚这个数据集有没有很好的可分性(即同类之间间隔小,异类之间间隔大),可以通过t-SNE投影到2维或者3维的空间中观察一下。如果在低维空间中具有可分性,则数据是可分的;如果在高维空间中不具有可分性,可能数据不可分,也可能仅仅是因为不能投影到低维空间
- 原理概述:
t-SNE将数据点之间的相似度转化为条件概率,原始空间数据点的相似度由高斯联合分布表示,嵌入空间中的数据点的相似度由student-t分布表示。
通过原始空间和嵌入空间的联合概率的Kullback-Leibler(KL)散度来评估可视化效果的好坏,也就是说用有关KL散度的函数作为loss函数,然后通过梯度下降最小化loss函数,最终获得收敛结果。tips:该loss函数不是凸函数,即具有不同初始值的多次运行将收敛于KL散度函数的局部最小值中,以致获得不同的结果。因此,尝试不同的随机数种子(Python可以通过设置seed来获得不同的随机分布)有时候是有用的,并选择具有最低KL散度值的结果。
- t-SNE精华所在:
如果想象在一个三维的球里面有均匀分布的点,不难想象,如果把这些点投影到一个二维的圆上一定会有很多点是重合的。所以,为了在二维的圆上想尽可能表达出三维里的点的信息,Hinton采取的方法: 把由于投影所重合的点用不同的距离(差别很小)表示。 这样就会占用原来在那些距离上的点,原来那些点会被赶到更远一点的地方。
t分布是长尾的,意味着距离更远的点依然能给出和高斯分布下距离小的点相同的概率值,从而达到高维空间和低维空间对应的点概率相同的目的。
- 缺点:
1. 计算复杂度很高,占内存大,运行时间长
2. Barnes-Hut t-SNE方法限于二维和三维嵌入
3. 算法是随机的,具有不同seed的多次实验可以产生不同的结果。虽然选择loss最小的结果就行,但可能需要多次实验以选择超参数 - 4.全局结构未明确保留,这个问题可以通过PCA初始化点(使用init = ‘pca')来缓解
- 参数说明 形象展示t-SNE优化技巧的网站: How to Use t-SNE Effectively