详解主成分分析 PCA
详解主成分分析 PCAPCA(Principal component analysis)从二维的角度直观理解 PCA如何计算主成分的方向样本矩阵数据处理离散程度度量沿着坐标轴 v 的样本方差最大化某个方向的样本方差如何寻找第二个主方向
PCA 求解步骤第一步:对所有特征进行中心化:去均值第二步:求协方差矩阵C第三步:求协方差矩阵C的特征值和相对应的特征向量第四步:将原始特征投影到选取的特征向量上,得到降维后的新K维特征
原理分析1、为什么样本在(协方差矩阵C的最大K个特征值所对应的特征向量)上的投影就是k维理想特征?2、那为什么协方差矩阵的特征向量可以看做是投影面,相对应的特征值是原始特征投影到这个投影面之后的方差?为什么在计算协方差矩阵之前,要将样本的原始特征进行去均值操作?
PCA优缺点PCA 源码Python实现sklearn中的 PCA
详解主成分分析 PCA
PCA(Principal component analysis)
PCA 是一种基于多变量的降维技术,主要用于降维、可视化、去相关、分类、确定潜在因子、压缩和去噪音等方面。是特征工程中不可缺少的一部分,有利于我们构建更加适合模型的特征。
PCA 旨在找到数据中的主成分,并利用这 些主成分表征原始数据 ,从而达到降维的目的 。
PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。
PCA的工作就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。 第一个新坐标轴选择是原始数据中方差最大的方向,
第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,
第三个轴是与第1,2个轴正交的平面中方差最大的。
依次类推,可以得到n个这样的坐标轴。通过这种方式获得的新的坐标轴,我们发现,大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可以忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。事实上,这相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,实现对数据特征的降维处理。
从二维的角度直观理解 PCA
从最大方差角度
PCA 的目标,即最大化投影方差,也就是让数据在主轴上投影的方差最大 。 从最小平方误差角度
PCA 的目标,要找到 一个 d 维超平面,使得数据点到这个超平面的距离平方和最小。
如何计算主成分的方向
样本矩阵
数据处理
离散程度度量
沿着坐标轴 v 的样本方差
最大化某个方向的样本方差
如何寻找第二个主方向
PCA 求解步骤
1、去除平均值
2、计算协方差矩阵
3、计算协方差矩阵的特征值和特征向量
4、将特征值排序
5、保留前N个最大的特征值对应的特征向量
6、将原始特征转换到上面得到的N个特征向量构建的新空间中(最后两步,实现了特征压缩)
第一步:对所有特征进行中心化:去均值
第二步:求协方差矩阵C
第三步:求协方差矩阵C的特征值和相对应的特征向量
第四步:将原始特征投影到选取的特征向量上,得到降维后的新K维特征
选取最大的前k个特征值和相对应的特征向量,并进行投影的过程,就是降维的过程。
新特征的计算公式如下:
原理分析
1、为什么样本在(协方差矩阵C的最大K个特征值所对应的特征向量)上的投影就是k维理想特征?
原因: 最大方差理论:方差越大,信息量就越大。 协方差矩阵的每一个特征向量就是一个投影面,每一个特征向量所对应的特征值就是原始特征投影到这个投影面之后的方差。由于投影过去之后,我们要尽可能保证信息不丢失,所以要选择具有较大方差的投影面对原始特征进行投影,也就是选择具有较大特征值的特征向量。然后将原始特征投影在这些特征向量上,投影后的值就是新的特征值。每一个投影面生成一个新的特征,k个投影面就生成k个新特征。
2、那为什么协方差矩阵的特征向量可以看做是投影面,相对应的特征值是原始特征投影到这个投影面之后的方差?
为什么在计算协方差矩阵之前,要将样本的原始特征进行去均值操作?
PCA优缺点
优点: 1、以方差衡量信息的无监督学习,不受样本标签限制。 2、由于协方差矩阵对称,因此k个特征向量之间两两正交,也就是各主成分之间正交,正交就肯定线性不相关,可消除原始数据成分间的相互影响 3. 可减少指标选择的工作量 4.用少数指标代替多数指标,利用PCA降维是最常用的算法 4. 计算方法简单,易于在计算机上实现。
缺点: 1、主成分解释其含义往往具有一定的模糊性,不如原始样本完整 2、贡献率小的主成分往往可能含有对样本差异的重要信息,也就是可能对于区分样本的类别(标签)更有用 3、特征值矩阵的正交向量空间是否唯一有待讨论 4、无监督学习
PCA 源码
Python实现
import numpy
as np
def pca(X
,k
):
n_samples
, n_features
= X
.shape
mean
=np
.array
([np
.mean
(X
[:,i
]) for i
in range(n_features
)])
norm_X
=X
-mean
scatter_matrix
=np
.dot
(np
.transpose
(norm_X
),norm_X
)
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
)]
eig_pairs
.sort
(reverse
=True)
feature
=np
.array
([ele
[1] for ele
in eig_pairs
[:k
]])
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)
sklearn中的 PCA
from sklearn
.decomposition
import PCA
import numpy
as np
X
= np
.array
([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca
=PCA
(n_components
=1)
pca
.fit
(X
)
print(pca
.transform
(X
))