PCA的理解、分析与实现

PCA的理解与分析

(一)降维(Dimensionality Reduction)

降维经常作为解决模型过拟合的手段之一

  1. 过拟合与解决措施

    (1)过拟合:采用了过于复杂的模型,或者特征维度量远远高于可用数据量,或者将数据集本身的扰动也作为因素学习进了模型,造成模型虽然训练误差极低但是泛化误差极高的一种现象。

    (2)解决措施

    ①增加数据集的数量

    ②正则化:常用的有L1和L2正则化,本质就是对参数的增长进行限制

    ③降维

  2. 维度灾难

    维度灾难是在机器学习中用来描述因为维度过高造成的一系列问题的总称。

    (1)直观理解:对于一个用于训练的数据集D,含有m个样本,每个样本为d维,每增加一个维度,那么为了能够覆盖样本空间所需的样本个数(所谓“覆盖”二字的理解就是最少需要的可以代表这个空间的样本数量)的增长是呈现指数型dm

    (2)几何理解:通过以下两张图和极限求解来理解高维空间的伸缩变换与低维空间之间理解的差异,以及体会高维空间中数据的稀疏分布。

    ①以二维平面的正方形及其内切圆为范例左图,可以把它通过增维想象成正方体和内切球,以此类推,想象成更高维的图形空间。

在这里插入图片描述

可以把正方形看成是整个数据空间,而圆形区域看做是数据点的有效分布,那么当这个模型趋向更高维的时候,圆形区域所占空间的体积会逐渐趋向于零。

理解一:可以说在低维空间看起来聚集在一起的点在更高维的视角是一个个散落的点(从而不具有体积,不占有空间)。

理解二:把体积(区域占用的空间)理解为有效点分布的密集情况,在更高维时圆形区域的体积趋向于零,就说明在低维空间密集分布着点的这块区域在高维的时候接近为空的状态,什么都没有,换言之,那些数据点在更高维会更趋向于分布在正方形区域内圆形区域以外的那些边角区。

②高维空间数据点的分布可以看做是人的大脑模型,大量数据点分布在超球体的壳层区域,而超球体的中心大部分区域都是空的(和第一张图的思想相契合)

在这里插入图片描述

这个ε的取值是在(0,1)之间任意小的一个实数,但不管它有多小,最后环带中散布的有效点数量基本上覆盖了整个数据空间。

通过以上两个图和模型关键是要通过这些特例来建立一个更加直观的印象,我们在对高维空间进行抽象和思考的时候,不能再按照低维空间里的定式思维去思考。

  1. 降维的分类

    ①直接降维:如特征选择,正则化的目的就是让属性值稀疏化,从中选出更具有代表性的属性,从而达到降维的目的。

    ②线性降维:PCA,MDS(多维缩放)

    ③非线性降维:流形,ISOMAP,LLE


(二)样本均值和样本方差

  1. 数据矩阵的表示:
    X = ( x 1 , x 2 , . . . x N ) T X=(x_1,x_2,...x_N )^T
    在这里插入图片描述

  2. 数据均值矩阵的表示:

X m = ( 1 / N ) Σ ( i ) X i X_m = (1/N)Σ(i)X_i

X m = ( 1 / N ) ( x 1 , x 2 , x 3 , . . . , x N ) ( 1 , 1 , 1... , 1 ) T = ( 1 / N ) X T 1 N X_m = (1/N)(x_1,x_2,x_3,...,x_N)(1,1,1...,1)^T = (1/N)X^T·1_N

在这里插入图片描述

  1. 数据方差矩阵的表示:

S p . × . p = ( 1 / N ) Σ ( x i x ) ( x i x ) T S_p._×._p = (1/N)Σ(x_i-x)(x_i-x)^T

在这里插入图片描述

S p . × . p = ( 1 / N ) X T H H T X S_p._×._p = (1/N)X^T·H·H^T·X

中心矩阵的几何意义也很好理解,就是对给定的数据集的每一维数据进行去中心化,减去该维度的均值。如果用二维分布的数据来理解,就相当于是把一堆分布的数据平移到以原点为中心。

中心矩阵H有良好的等幂性,根据转置的相关运算,可以得到:
H 2 = H , H n = H H^2 = H, H^n = H

最终可以得到,方差矩阵的表示为:
S p . × . p = ( 1 / N ) X T H X S_p._×._p = (1/N)X^T·H·X


(三)从最大投影方差的角度来理解PCA

“一个中心,两个基本点”来立足PCA

一个中心:PCA无论从哪个角度去理解,它的本质都是把一组可能线性相关的变量通过正交变换,得到一组线性无关的变量。即:对原始特征空间的重构。

基本点一:最大投影方差——找到一个子空间,将数据点进行投影之后,数据的散布的方差最大化

基本点二:最小重构距离——若将数据进行降维之后,希望可以将数据点以最小的代价重构回去。那么肯定是数据分散的越开,那么重合点越少,重构回去的难度也相应更低。

在这里插入图片描述

在上图中,蓝色点表示分布着的数据点,要把二维表示的点找到一个一维方向轴进行投影,对于红线和蓝线的两种选择,荧光笔涂画的分别就是他们的散布程度。散布程度越大,对于PCA来说就是越优的。

1.向量投影的表示

根据下图,中心化之后的点如图一中的红点所示,每一个点实质都是一个源于原点的向量,求投影的时候,只先考虑一个点的求解。

当约定投影轴向量的长度为1时,则某向量在投影轴上的投影长度就等于两个向量的内积。

在这里插入图片描述

2.投影方差的矩阵表示

在这里插入图片描述

3. PCA——优化问题求解

  1. 带约束的优化问题模型

u 1 = a r g m a x ( u 1 . T S u 1 ) u_1 = arg max(u_1.^T·S·u_1)

s . t . u 1 u = 1 s.t.u_1u = 1

  1. 拉格朗日乘子无优化问题模型

L ( u 1 , λ ) = u 1 . T S u 1 + λ ( 1 u 1 . T u ) L(u_1,λ) = u_1.^TS·u_1+λ(1-u_1.^Tu)

  1. 求解与理解

在这里插入图片描述

从上式推导的结果来看,PCA实现降维需要两个步骤;其一,需要对原始的特征空间(p维)进行重构(重构的目标就是将各个维度之间都变成线性不相关的);其二,各个维度都会有一个与之对应的特征值,再从这些维度中择优选择q个维度(q<p),达到降维的目的。


(四)从最小重构代价的角度理解PCA

从本质上来说,最小重构代价和最大投影方差其实是一致的,只不过它们最后转化而成的优化问题是针对同一个模型的不同角度去进行思考和求解。

1.向量坐标的表示

要理解所谓“重构”二字的含义,首先要理解一个向量在一个特征空间的表示,这里涉及到向量的投影和向量的坐标表示。

在这里插入图片描述

由上图可联想到,若对某一个空间中的某一多维向量进行降维表示的时候,只把其中最关键的分量表示出来,那么由这个分量表示再还原回原向量就叫做重构。

又因为在降维表示的时候丢失了部分维度的信息,所以还原回去的向量和原向量之间是存在差异的。PCA的目标就是能够使这个重构回去的代价最小,也就是重构回去的误差最小。

2.重构代价的矩阵表示

在这里插入图片描述

J = Σ q . p ( u k T S u k ) J = Σ_q.^p(u_k^T·S·u_k)

s . t . u k T u k = 1 s.t.u_k^Tu_k = 1

3.理解

①上述优化问题模型中因为从第q维之后一直到第p维都是相互独立不相关的,故可以针对求和式中的每一维进行单独求解。那么理解起来就是每次都求出当前所有维度中投影方差矩阵中最小的那一维

最后选出p-q维(因为p维是总共的,而q维是目标的)进行舍弃。

投影方差矩阵最小的那一维(也就是对应特征值最小)也就等价于重构代价最高的那一维,从几何上理解,将数据点投影在这一维时数据点会十分密集地堆叠在一起,所以方差较小,但是还原回去难度很大,且这一维的信息因为对于各个数据点都趋于相同,所以对于区分这些数据点贡献极低

m i n . J = Σ q . p ( λ i ) min. J = Σ_q.^p(λ_i)

将上述问题模型利用拉格朗日乘子进行转换,可以求解到上面的目标公式。也即目标是选出从q+1维开始到p维的特征值总和最小的那些维度,这些维度是在降维过程中要被舍弃的项。


(五)代码实现

#coding:gbk
import numpy as np

X = np.loadtxt('ColorHistogram.txt')[:,1:]
#print(X.shape)
#  求取均值,给定的数据集为68040 * 32维,针对每一个属性类求解均值
aver_X = np.mean(X,axis = 0)
X_tran = np.subtract(X,aver_X)
#  求取协方差矩阵
C = np.cov(X_tran,rowvar=False)
#  求取协方差矩阵的特征值、特征向量
lamda,phi = np.linalg.eig(C)
#  对特征值从大到小排序
sort_lamda = -np.sort(-lamda)
#  从大到小排序,输出原始序列的索引
sort_index = np.argsort(-lamda)
lamda_sum = np.sum(lamda)

#给定能量比重,求解压缩的维度的数量
def find_space(ratio):
    i = 0
    Sum = 0
    flag = False
    for i in range (X.shape[1]):
        if (Sum/lamda_sum) >= ratio:
            flag  = True
            break
        Sum += sort_lamda[i]
        i += 1
    if flag == True:
        return i+1
    else:
        return -1

a = input("请输入预想的能量比重:")
ratio = float(a)
dim = find_space(ratio)
print(a+"比重的能量比重对应的数据集维度为:"+str(dim))
print("对应的属性列号为:")
#print(sort_index)
print(sort_index[:dim])
#  降到dim维,从大到小选取前dim个特征向量
j = 0
#初始化一个目标的变换矩阵,矩阵维度的运算为  [dim*32]*[[68040 * 32].T].T 最后在行首加上各个属性列的初始索引号
selected_phi = np.empty((dim,32))

for j in range (dim):
    #取出来的每一列特征向量,都按行加入到特征矩阵当中
    curren_phi = phi[:,sort_index[j]].reshape(1,32)
    np.append(selected_phi,curren_phi,axis = 0)

X_final = np.dot(selected_phi ,X.T).T
X_out = np.insert(X_final,0,sort_index[:dim],axis = 0)
np.savetxt('out.txt',X_out)
print(X_out)


后记

本篇博客是针对B站up主[shuhuai008]的《机器学习白板推导系列》中PCA的前几个部分的笔记记录,中间穿插了一点自己的理解。(https://space.bilibili.com/97068901)

还有两节分别从SVD和概率的角度来理解PCA,之后补完特征值分解后再做笔记~

【机器学习】【白板推导系列】【合集 1~23】

猜你喜欢

转载自blog.csdn.net/kodoshinichi/article/details/108294274
今日推荐