1. PCA(Principal Component Analysis)算法流程
设有m条n维数据,其中每条数据有n个特征。
1)转置----将原始数据按列组成n行m列矩阵X
2)中心化----将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
3)求出协方差矩阵M
4)求出协方差矩阵M的特征值及对应的特征向量
5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
6)Y=PX即为降维到k维后的数据
2. 数学思想
PCA 是最常用的线性降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中表示,并期望在所投影的维度上数据的方差最大,以此使用较少的数据维度,同时保留住较多的原数据点的特性。
通俗的理解,如果把所有的点都映射到一起,那么几乎所有的信息(如点和点之间的距离关系)都丢失了,而如果映射后方差尽可能的大,那么数据点则会分散开来,以此来保留更多的信息。
也就是说,方差越大数据的表征能力越强------方差越大,数据越分散,信息保留越多
e.g. 给你两组数据,一组数据基本集中于某个点,另一组数据零零散散的,你认为哪个数据更好?一般都认为后者更好,因为前者可能是数据太少了,数据都集中于某一个点,这样的数据训练出来的模型泛化能力很差,后者的数据可以认为比较样本空间覆盖度高,训练出来的模型泛化能力更强。
3. Python实现
from sklearn.decomposition import PCA
from sklearn import datasets
import matplotlib.pyplot as plt
### 对x需要预处理,即去中心化,在PCA包中没有这一步骤
digits = datasets.load_digits()
### x 为m*n矩阵,每一行有n个特征,在PCA包里有转置,不需要自己转置
x = digits.data
y = digits.target
pca=PCA(n_components=10)
### PCA只针对特征处理,不需要针对target部分
pca.fit(x)
plt.figure()
plt.plot(pca.explained_variance_, 'k', linewidth=2)
plt.xlabel('n_components', fontsize=16)
plt.ylabel('explained_variance_', fontsize=16)
plt.show()
结果:
4. R实现
以后会补上的