对于送入网络的feature
,希望通过pca
降维的方法,尽可能保留信息的情况下,减少模型参数,以缩短训练和推理时间,甚至有可能减少数据中的噪声?
但pca
为纯线性变换,且没有考虑对目标的优化,进一步可以使用vae
方法
主成分分析法 PCA
理论
简单来说就是把高纬数据,投影到低维,不过肯定会有信息损失,一般保留80%的信息,或者指定保留多少个主成分。
具体的操作老师讲过证明,但是具体推导和证明我不记得了,反正就是对原始矩阵(假设大小为(N,T)
)进行特征分解,得到特征值和特征向量,选取特征值大的对应的特征向量(大小为(N,t)
)作为基,矩阵相乘(结果的大小为(N,t)
)即得到t
个主成分,而这个(N,t)
大小的矩阵,即作为压缩后的特征
python
实现
使用python
实现,这里直接调用sklearn
中的包实现,只不过记录两种方式,一种是全量,一种是增量。
全量方式
直接读取所有数据,然后喂给PCA
,即完成主成分分析,需要注意的点有
- 原始数据的
shape
为(数据点数量,特征个数),一般来说数据点数量 >= 特征个数 - 无需对原始数据做标准化,
sklearn
会帮你做 - 创建
pca
时候,需要指定预期保留的主成分个数,要小于特征个数 - 调用
fit_transform
后返回的是主成分,也就是压缩后的特征 explained_variance_sum
为主成分能够解释的原始数据中的变差占比components
的为拟合出来的一组基,再拿到(N,T)
的数据,直接可以计算得到主成分,$(N,T) * (T,t) \to (N,t)$
1 | import numpy as np |
增量方式
有时候数据量很大,需要分块拟合,也可能是dataloader
的形式,需要一次又一次喂给pca
,这时候需要增量方式,官方文档sklearn.decomposition.IncrementalPCA
如果是挨个喂,这样写
这里只是
fit
,目的是获取基,挨个喂使用的是partial_fit
,而非fit
1 | from sklearn.decomposition import IncrementalPCA |
如果是希望它自己分块
这里只是
fit
,目的是获取基
1 | from sklearn.decomposition import IncrementalPCA |
最后获得主成分、已解释变差、基的方式是一样的
1 | # 主成分 |