PCA过程的实现:(1)numpy可以模拟 (2)sklearn可以实现
1.1、使用numpy模拟PCA过程import numpy as np
A=np.array([[3,2000],
[2,3000],
[4,5000],
[5,8000],
[1,2000]],dtype='float')
#使用numpy模拟PCA过程
#数据降维
#1、数据归一化
mean=np.mean(A,axis=0)#axis=0所有行
norm=A-mean
#2、数据缩放 因为两个特征不是一个数量级
scope=np.max(norm,axis=0)-np.min(norm,axis=0)
norm=norm/scope
#3、对协方差矩阵进行奇异值分解,求解其特征向量
U,S,V=np.linalg.svd(np.dot(norm.T,norm))
#4、因为需要将二维数据降为一维,因此取特征矩阵的第一列来构造主成分矩阵
U_reduce=U[:,0].reshape(2,1)#提取1列,却返回了1行,所以需要再转换成1列
#5、开始降维
R=np.dot(norm,U_reduce)
#降维数据还原
#1、升维
Z=np.dot(R,U_reduce.T)
#2、数据缩放和归一化还原
A_restore=np.multiply(Z,scope)+mean#np.multiply是矩阵的点乘运算
与原始矩阵A相比,恢复后的A_restore存在失真,但这是不可避免的
输出R:
1.2、使用sklearn进行PCA过程#使用sklearn进行PCA过程
from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import MinMaxScaler
def std_PCA(**argv):
scaler=MinMaxScaler()
pca=PCA(**argv)
pipeline=Pipeline([('scaler',scaler),('pca',pca)])
return pipeline
pca=std_PCA(n_components=1)
R2=pca.fit_transform(A)
输出R2:
sklearn降维输出的数值和numpy降维输出的数值符号相反,这不是错误,是降维选择的坐标方向不同而已。
降维数据还原如下:
R2_restore=pca.inverse_transform(R2)#先进行PCA还原,再进行预处理的逆运算
还原的数据:
原来的数据A:
2、PCA的物理含义方形点:原始数据经过预处理后(归一化、缩放)的数据。
圆形点:一维恢复到二维后的数据。
u(1)、u(2):主成分特征向量。
结论:
(1)圆形点实际上就是方形点在向量 U(1)所在的直线上的投射点,降维就是方形点在主成分特征向量U(1)上的投影。
(2)PCA数据恢复,不是真正的恢复,只是把降维后的坐标转换为原坐标系中的坐标而已。
(3)主成分特征的向量U(1)、U(2)是相互垂直的
(4)方形点和圆形点之间的距离是PCA数据降维后的误差



