PCA是一种数据降维的方法。当我们在处理一些高维且冗余数据时,可以使用PCA对数据进行降维,去除冗余信息,提高运行速度。如上图所示,左边3D图像,存在大量冗余数据,我们把这样的数据转移到2D可以更加清晰的观察数据本身,同时降低计算复杂度。
1.PCA原理详解
如果我们要对上图二维空间的特征点做特征降维,那怎样的降维结果对我们来说是好的呢?其实,二维特征降维就是找坐标系投影,如图可以看到红色箭头与黄色箭头两个坐标轴。如果我们将特征映射到黄色轴,二维特征点将会大量重叠在黄色轴上,损失大量原始信息是我们不想见到的。而映射到红色轴上,相较于其他坐标轴,这个特征压缩过程可以将信息损失降低到最小。
总结来说,我们希望投影后的数据点尽可能地分散,这种分散程度在数学上可以用方差来表示。同时,为了减少特征的冗余信息,我们希望降维后的特征互不相关,而不相关性可以用协方差来衡量。因此,我们可以先求出原始数据的协方差矩阵,协方差矩阵对角线元素是数据的方差,其他元素是特征之间的相关系数,我们希望降维后的方差尽量大,相关系数为0,那么利用正交变换将此协方差矩阵变换成对角阵,并提取前K个特征值对应的特征向量,即可完成转移矩阵。
2.PCA具体步骤
以X为例,我们用PCA将其降维到一维。
1)求协方差矩阵
2)求协方差矩阵的特征值与特征向量
求解后的特征值为
对应的特征向量为
3)选k个最大的特征值对应的特征向量形成转移局正,获得降维后的表示
结果如图所示
3.python实现
##Python实现PCA
import numpy as np
def pca(X,k):#k is the components you want
#mean of each feature
n_samples, n_features = X.shape
mean=np.array([np.mean(X[:,i]) for i in range(n_features)])
#normalization
norm_X=X-mean
#scatter matrix
scatter_matrix=np.dot(np.transpose(norm_X),norm_X)
#Calculate the eigenvectors and eigenvalues
eig_val, eig_vec = np.linalg.eig(scatter_matrix)
eig_pairs = [(np.abs(eig_val[i]), eig_vec[:,i]) for i in range(n_features)]
# sort eig_vec based on eig_val from highest to lowest
eig_pairs.sort(reverse=True)
# select the top k eig_vec
feature=np.array([ele[1] for ele in eig_pairs[:k]])
#get new data
data=np.dot(norm_X,np.transpose(feature))
return data
X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
print(pca(X,1))