PCA
主成分分析(Principal Component Analysis, PCA):通俗理解:就是找出一个最主要的特征,然后进行分析。最大化投影后数据的方差(让数据更分散),如果投影到线上,发现数据越紧密,那么模型越难将这些点区分.
工作原理
1.找出第一个主成分的方向,也就是数据方差最大的方向
2.找出第二个主成分的方向,也就是数据 方差次大
的方向,并且该方向与第一个主成分方向 正交(orthogonal 如果是二维空间就叫垂直)
。
3.通过这种方式计算出所有的主成分方向
4.通过数据集的协方差矩阵及其特征值分析,我们就可以得到这些主成分的值。
5.一旦得到了协方差矩阵的特征值和特征向量,我们就可以保留最大的 N 个特征。这些特征向量也给出了 N 个最重要特征的真实结构,我们就可以通过将数据乘上这 N 个特征向量 从而将它转换到新的空间上。
为什么正交?
- 正交是为了数据有效性损失最小
- 正交的一个原因是特征值的特征向量是正交的
PCA优缺点:
优点:降低数据的复杂性,识别最重要的多个特征
缺点:不一定需要,且可能损失有用信息
- 适合数据类型:数值型数据
去中心化了(中心点为原点),这一步操作可以简单地通过xi=xi−x¯ 来达到,其中x¯是样本的均值,为方便表示,后文的x都是去中心化后的结果。
可以看到PCA所谓的降维操作就是找到一个新的坐标系(旋转的两条直线式垂直的,我们可以用一组标准正交基{uj},j=1,...,n来指示),然后减掉其中一些维度,使误差足够小。
假设我们要找的投影方向是uj (uj是单位向量,即uTjuj=1) ,点xi在该方向上的投影就是(xTiuj)uj,减掉这个维度造成的误差
Jj=1m∑i=1m(xTiuj)2=1m(xTuj)2=1m(xTuj)T(xTuj)=1muTjxxTuj
将1mxxT记作S,假设我们要减去t个维度,则需要最小化
此时使用拉格朗日乘子法使得
最小化上式子,求导有
使其为0则得到
这是标准的特征值的定义,λj就是特征值,uj是对应的特征向量,所以对S进行特征值分解就可求得解,将上式带回到原始的J中,可得
所以要使J最小,就去掉变换后维度中最小的t个特征值对应的维度就好了。
现在,我们再回过头看PCA的流程,就会发现一切都对应上了:
- 对数据去中心化
- 计算XXT,注:这里除或不除样本数量M或M−1其实对求出的特征向量没影响
- 对XXT进行特征分解
- 选取特征值最大的几个维度进行数据映射。(去掉较小的维度)
代码: sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)
参数:
n_components:
意义:PCA算法中所要保留的主成分个数n,也即保留下来的特征个数n
类型:int 或者 string,缺省时默认为None,所有成分被保留。
赋值为int,比如n_components=1,将把原始数据降到一个维度。
赋值为string,比如n_components='mle',将自动选取特征个数n,使得满足所要求的方差百分比。
copy:
类型:bool,True或者False,缺省时默认为True。
意义:表示是否在运行算法时,将原始训练数据复制一份。若为True,则运行PCA算法后,原始训练数据的值不会有任何改变,因为是在原始数据的副本上进行运算;若为False,则运行PCA算法后,原始训练数据的值会改,因为是在原始数据上进行降维计算。
whiten:
类型:bool,缺省时默认为False
意义:白化。
对象属性:
components_:返回具有最大方差的成分。
explained_variance_ratio_:返回 所保留的n个成分各自的方差百分比。
n_components_:返回所保留的成分个数n。
mean_:
noise_variance_:
explainde_variance_ : 返回所保留的n个成分方向的方差
fit_transform(X) :用X来训练PCA模型,同时返回降维后的数据。
newX=pca.fit_transform(X),newX就是降维后的数据。
inverse_transform()
将降维后的数据转换成原始数据,X=pca.inverse_transform(newX)
k维跟原始数据的维没有关系,是原始特征在k维上的投影
假设原始数据是10(行,样例数,y1-y10)*10(列,特征数x1-x10)的(10个样例,每样例对应10个特征)
(1)、分别求各特征(列)的均值并对应减去所求均值。
(2)、求特征协方差矩阵。
![](https://i-blog.csdnimg.cn/blog_migrate/6aba5d292d3b10f039cc4e7aade0a381.png)
![](https://i-blog.csdnimg.cn/blog_migrate/12a17374edde710272795768d6a1c4cb.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e6e474480eebfa3a5eacb17771513717.png)
(3)、求协方差阵的特征值和特征向量。
(4)、将特征值按照从大到小排序,选择其中最大的k个。将其对应的k个特征向量分别作为列向量组成特征向量矩阵。
(5)、将样本点投影到选取的k个特征向量上。这里需要捋一捋,若原始数据中样例数为m,特征数为n,减去均值后的样本矩阵仍为MatrixDATA(m,n); 协方差矩阵是C(n,n);特征向量矩阵为EigenMatrix(n,k); 投影可得: FinalDATA(m,k)=MatrixDATA(m,n) * EigenMatrix(n,k) 。
这样,原始数据就由原来的n维特征变成了k维,而k维跟原始数据的维没有关系,是原始特征在k维上的投影。这k维特征基本上代表了原先的n个特征(牺牲掉所认为不重要个维度的信息,即后n-k个特征向量所代表的维度)。