降维算法之PCA(PrincipalComponent Analysis,主成分分析)
降维是指在保留数据特征的前提下,以少量的变量表示有许多变量的数据,这有助于降低多变量数据分析的复杂度。比如在分析有 100 个变量的数据时,与其直接分析数据,不如使用 5 个变量表示数据,这样可以使后续分析比较容易
1.PCA 的作用:
PCA 是一种用于减少数据中的变量的算法。PCA 可以将相关的多变量数据以主成分简洁地表现出来。
减少数据变量的方法有两种:一种是只选择重要的变量,不使用其余变量;另一种是基于原来的变量构造新的变量。PCA 使用的是后一种方法。
PCA 可发现对象数据的方向和重要度。
方向由构成新变量时对象数据变量的权重决定,而重要度与变量的偏差有关
PCA 采用以下步骤来寻找主成分
1.计算协方差矩阵。
协方差是一个衡量两个随机变量同步变化趋势的指标。如果两个变量同时增大或者同时减小(即同步变化),那么它们的协方差就是正的。如果一个变量增大时另一个变量减小,那么它们的协方差就是负的 对于你的数据,协方差矩阵可以帮助你理解特征之间的关系。如果两个特征的协方差是正的,那么这两个特征可能有正相关关系。如果协方差是负的,那么这两个特征可能有负相关关系。如果协方差接近于0,那么这两个特征可能没有(线性)关系。
在每个数据点取相同值的变量并不重要,但是在每个数据点取不同值的变量能很好地体现数据整体的特点。
2.对协方差矩阵求解特征值问题,求出特征向量和特征值。
特征值问题是指对 n 维方形矩阵 A,寻找使得的 和 的问题。求解协方差矩阵的特征值问题在数学上等同于寻找使方差最大化的正交轴的问题.
分析一下:,左边表示一个矩阵和向量的乘积。
举个例子:
与矩阵相乘后,x1,x2分别变换为 (4, 4) 和 (5,2);
像这个例子一样,矩阵(A)可以变换向量(x1,x2)的大小和方向.
但是 x1=(1,1)通过矩阵A的变换,并没有改变方向,矩阵A的变换 == x1 *常数4
但有的向量并不能通过这种变换改变方向,这样的向量叫作 矩阵A 的特征向量。这时向量的大小在该变换下缩放的比例叫作特征值。
在 PCA 中,矩阵 A 就是协方差矩阵。PCA 对协方差矩阵求解特征值问题,并重复计算出特征值和特征向量的几种组合。这时按特征值大小排序的特征向量分别对应于第一主成分、第二主成分……照此类推。
3.以数据表示各主成分方向。
如果我们使用针对每个主成分计算出的特征值除以特征值的总和,就能够以百分比来表示主成分的重要度,这个比例叫作贡献率,它表示每个主成分对数据的解释能力。从第一主成分开始依次相加,得到的贡献率叫作累计贡献率。
简单来个代码
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
data = load_iris()
n_components = 2 # 将减少后的维度设置为2
model = PCA(n_components=n_components)
model = model.fit(data.data)
print(model.transform(data.data)) # 变换后的数据
[[-2.68420713 0.32660731]
[-2.71539062 -0.16955685]
[-2.88981954 -0.13734561]
~ 略~
[ 1.76404594 0.07851919]
[ 1.90162908 0.11587675]
[ 1.38966613 -0.28288671]]
主成分在各个数据集上的累计贡献率
图中的横轴为主成分,纵轴为累计贡献率
其中 A 为变量之间存在相关性的数据的PCA 结果。这时的累计贡献率分别为 0.36、0.55。。。。。。
而 B 是对变量之间没有相关性的数据进行 PCA的结果,从图中可以看出,各个主成分的贡献率 几乎相同。可以说这样的数据不适合用 PCA 进行降维。
本质上讲,因子相关性比较高的时候,适合用pca降维