在现实高维数据情况下,会有数据样本稀疏、距离计算困难等问题,被称为维数灾难。
解决的方法就是降维,也称之为“维数约简”,即通过某种数据方法将原始高维属性空间转成一个低维“子空间”。在这个子空间中,样本密度大大提高,将高维空间中的一个低维“嵌入”。
数据降维主要是有两个动机:
上图解释:
降维能够帮助我们进行数据的可视化工作。
上面图的解释:
在PCA中,要做的是找到一个方向向量(Vector direction),当把所有的数据都投射到该向量上时,PCA的关键点就是找到一个投影平面使得投影误差最小化。
方向向量是一个经过原点的向量,而投射误差是从特征向量向该方向向量作垂线的长度。
主成分分析中,首先对给定数据进行规范化,使得数据每一变量的平均值为0,方差为1。 之后对数据进行正交变换,用来由线性相关表示的数据,通过正交变换变成若干个线性无关的新变量表示的数据。 新变量是可能的正交变换中变量的方差和(信息保存)最大的,方差表示在新变量上信息的大小。将新变量一次成为第一主成分,第二主成分等。通过主成分分析,可以利用主成分近似地表示原始数据,便是对数据降维。
PCA算法中从n维到k维的过程是
在西瓜书中的描述为
关于PCA算法中主成分个数k的确定,一般是根据公式:
不等式右边的0.01可以是0.05,或者0.1等,都是比较常见的。当为0.01的时候,表示保留了99%的方差数据,即大部分的数据特征被保留了。
当给定了个数k,协方差矩阵S中求解出来的各个特征值满足公式:
也就是满足:
这个和上面的公式是等价的。
重建的压缩表示Reconstruction from Compressed Representation指的是将数据从低维还原到高维的过程。
将指定的点位置映射到一个三维曲面,反解前面的方程:
利用numpy、pandas、matplotlib库实现PCA算法
Linear dimensionality reduction using Singular Value Decomposition of the data to project it to a lower dimensional space. The input data is centered but not scaled for each feature before applying the SVD.
用sklearn学习PCA:
https://www.cnblogs.com/pinard/p/6243025.html
在scikit-learn中,与PCA相关的类都在sklearn.decomposition包中。最常用的PCA类就是sklearn.decomposition.PCA。
白化:对降维后的数据的每个特征进行归一化,让方差都为1
class sklearn.decomposition.PCA(n_components=None, # 降维后的特征数目,直接指定一个整数
copy=True,
whiten=False, # 判断是否进行白化,默认是不白化
svd_solver='auto', # 指定奇异值分解SVD的方法
tol=0.0,
iterated_power='auto',
random_state=None)
在这里讲解一个例子,利用PCA算法来进行IRIS数据的分类