PCA(主成分分析法)python
1. PCA(最大化方差定义或者最小化投影偏差定义)是一种无监督算法,也就是咱们不须要标签也能对数据作降维,这就使得其应用范围更加普遍了。那么PCA的核心思想是什么呢?算法
2. PCA存在的问题:函数
3. PCA的做用:优化
4. 方差的做用:我们能够想象一下,若是一群人都堆叠在一块儿,咱们想区分他们是否是比较困难,可是若是这群人站在马路两侧,咱们就能够很清晰的判断出来应该这是两伙人。因此基于方差咱们能够作的就是让方差来去判断我们数据的拥挤程度,在这里咱们认为方差大的应该辨识度更高一些,由于分的比较开(一条马路给隔开啦)。方差能够度量数值型数据的离散程度,数据如果想要区分开来,他那他们的离散程度就须要比较大,也就是方差比较大。spa
5. 协方差的做用:code
6. 计算过程:(下图为采用特征值分解的计算过程,若采用SVM算法,则无需计算协方差矩阵!)component
为何咱们须要协方差矩阵?咱们最主要的目的是但愿能把方差和协方差统一到一个矩阵里,方便后面的计算。orm
假设咱们只有 a 和 b 两个变量,那么咱们将它们按行组成矩阵 X:(与matlab不一样的是,在numpy中每一列表示每一个样本的数据,每一行表示一个变量。好比矩阵X,该矩阵表示的意义为:有m个样本点,每一个样本点由两个变量组成!)
blog
而后:排序
咱们能够看到这个矩阵对角线上的分别是两个变量的方差,而其它元素是 a 和 b 的协方差。二者被统一到了一个矩阵里。
7. 特征值与特征向量的计算方法-----特征值分解与奇异值分解法(SVD)(有关特征值与奇异值可见个人博文!)
(1) 特征值分解的求解过程较为简单,如下图为例子
(2) 特征值分解存在的缺点:
(3) SVD算法(奇异值分解)的提出克服这些缺点,目前几乎全部封装好的PCA算法内部采用的都是SVD算法进行特征值、特征向量以及K值的求解。
(4) SVD算法的计算过程:(numpy中已经将SVD进行了封装,因此只须要调用便可)
能够发现,采用SVD算法无需计算协方差矩阵,这样在数据量很是大的时候能够下降消耗。
利用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])
运行结果图:与上文采用特征值分解所获得的降维结果一致!
8.PCA的重建
众所周知,PCA能够将高维数据压缩为较少维度的数据,因为维度有所减小,因此PCA属于有损压缩,也就是,压缩后的数据没有保持原来数据的所有信息,根据压缩数据没法重建本来的高维数据,可是能够看做本来高维数据的一种近似。
还原的近似数据矩阵Q = 降维后的矩阵G * Ureduce.T
9.采用sklearn封装好的PCA实现数据降维(采用的是SVD算法):
1 import numpy as np 2 from sklearn.decomposition import PCA 3 # 利用sklearn进行PCA降维处理的时候,数据矩阵A的行数表示数据的个数,数据矩阵A的列数表示每条数据的维度。这与numpy中是相反的! 4 # A = np.mat([[-1, -1, 0, 2, 0], [-2, 0, 0, 1, 1]]).T 5 A = np.mat([[-1, -2], [-1, 0], [0, 0], [2, 1], [0, 1]]) 6 pca = PCA(n_components = 1) 7 pca.fit(A) 8 # 投影后的特征维度的方差比例 9 print(pca.explained_variance_ratio_) 10 # 投影后的特征维度的方差 11 print(pca.explained_variance_) 12 print(pca.transform(A))
能够发现,采用sklearn封装的方法实现PCA与上文的方法达到的结果一致!
10.如何肯定主成分数量(针对于Sklearn封装的PCA方法而言)
PCA算法将D维数据降至K维,显然K是须要选择的参数,表示要保持信息的主成分数量。咱们但愿可以找到一个K值,既能大幅下降维度,又能最大限度地保持原有数据内部的结构信息。实现的过程是经过SVD方法获得的S矩阵进行操做求解,
11.sklearn中封装的PCA方法的使用介绍。
PCA的函数原型
(1)主要参数介绍
n_components
copy
whiten
(2)主要方法介绍:
fit(X,y=None) :用训练数据X训练模型,因为PCA是无监督降维,所以y=None。
transform(X,y=None) :对X进行降维。
fit_transform(X) :用训练数据X训练模型,并对X进行降维。至关于先用fit(X),再用transform(X)。
inverse_transform(X) :将降维后的数据转换成原始数据。(PCA的重建)
(3)主要属性介绍:
components:array, shape (n_components, n_features) ,降维后各主成分方向,并按照各主成分的方差值大小排序。
explained_variance:array, shape (n_components,) ,降维后各主成分的方差值,方差值越大,越主要。
explained_variance_ratio:array, shape (n_components,) ,降维后的各主成分的方差值占总方差值的比例,比例越大,则越主要。
singular_values:array, shape (n_components,) ,奇异值分解获得的前n_components个最大的奇异值。
参考资料:https://zhuanlan.zhihu.com/p/77151308?utm_source=qq&utm_medium=social&utm_oi=1095998405318430720