PCA降维的原理、方法、以及python实现。 (2)

PCA降维的原理、方法、以及python实现。

(2) 特征值分解存在的缺点:

特征值分解中要求协方差矩阵A必须是方阵,即规模必须为n*n。

后期计算最小投影维度K时,计算量过大。

当样本维度很高时,协方差矩阵计算太慢;

(3) SVD算法(奇异值分解)的提出克服这些缺点,目前几乎所有封装好的PCA算法内部采用的都是SVD算法进行特征值、特征向量以及K值的求解。

奇异值(每个矩阵都有):设A是一个mXn矩阵,称正半定矩阵A‘A的特征值的非负平方根为矩阵A的奇异值,其中A‘表示矩阵A的共扼转置矩阵(实数矩阵的共轭转置矩阵就是转置矩阵,复数矩阵的共轭转置矩阵就是上面所说的行列互换后每个元素取共轭)

只有方阵才有特征值。

(4) SVD算法的计算过程:(numpy中已经将SVD进行了封装,所以只需要调用即可)

PCA降维的原理、方法、以及python实现。

可以发现,采用SVD算法无需计算协方差矩阵,这样在数据量非常大的时候可以降低消耗。

A为数据矩阵,大小为M*N(2*5)

U是一个由与数据点之间具有最小投影误差的方向向量所构成的矩阵,大小为M*M(2*2),假如想要将数据由M维降至K维,只需要从矩阵U中选择前K个列向量,得到一个M*K的矩阵,记为Ureduce。按照下面的公式即可计算降维后的新数据:降维后的数据矩阵G = A.T * Ureduce. 

sigma为一个列向量,其包含的值为矩阵A的奇异值。

VT是一个大小为N*N的矩阵,具体意义我们无需了解。

利用python实现PCA降维(采用SVD的方法):

1 from numpy import linalg as la 2 import numpy as np 3 #1.矩阵A每个变量的均值都为0,所以不用进行“去平均值”处理。倘若矩阵A的每个变量的均值不为0,则首先需要对数据进行预处理 4 # 才可以进行协方差矩阵的求解。 5 #2.与matlab不同的是,在numpy中每一列表示每个样本的数据,每一行表示一个变量。 6 # 比如矩阵A,该矩阵表示的意义为:有5个样本点,每个样本点由两个变量组成! 7 #3.np.mat()函数中矩阵的乘积可以使用 * 或 .dot()函数 8 # array()函数中矩阵的乘积只能使用 .dot()函数。而星号乘(*)则表示矩阵对应位置元素相乘,与numpy.multiply()函数结果相同。 9 A = np.mat([[-1, -1, 0, 2, 0], [-2, 0, 0, 1, 1]]) 10 # A = np.mat([[-1, -2], [-1, 0], [0, 0], [2, 1], [0, 1]]).T 11 U, sigma, VT = la.svd(A) 12 print("U:") 13 print(U) 14 print("sigma:") 15 print(sigma) 16 print("VT:") 17 print(VT) 18 print("-"*30) 19 print("降维前的数据:") 20 print(A.T) 21 print("降维后的数据:") 22 print(A.T * U[:,0])

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyfzgz.html