机器学习——主成分分析(PCA)

1 从KNN算法到PCA

1.1 KNN算法引入

KNN算法,也称为K近邻算法,是一种非常常用的监督学习方法,其核心思想十分简单,给定某个训测试样本,基于某种距离计算方法来计算与其最近的K个邻居,然后根据K个邻居的分类来决定测试样本的分类。 K近邻算法特点包括以下几个:

  1. 无需进行事先的模型训练。训练的过程就是将训练样本保存起来。
  2. 因为没有训练过程,所以预测的过程要比其他的模型时间更长,复杂度更高。
1.2 简单实现一个KNN
def KNN(D,X,labels,k):
    '''
    D是训练样本集合,包含的是各个训练样本
    X 是测试样本
    labels 是训练样本对应的标签的集合
    k:选定的最近的邻居的个数
    '''
    #首先计算的是测试样本对于各个训练样本的距离
    distance = {}
    for item in D:
        dis = 0.0
        for i in range(len(X)):
            dis += (X[i][0] - item[i][0])*(X[i][0] - item[i][0])
        distance[i]=dis
    sorted(distance,key=lambda x:distance[x],reverse=True)
    #取最近的k个邻居的下标
    label_index = []
    for i in range(k):
        temp = distance.keys()
        temp = list(temp)
        label_index.append(temp[i])
    #获取最近的k个邻居的分类
    label = []
    for i in label_index:
        label.append(labels[i])
    
    label = collections.Counter(label)
    label = label.keys()
    label = list(label)
    return label[0]
1.3 KNN存在的问题

在KNN算法中,我们发现,对于一个测试样本X而言,其包含N个属性值,也就是X=x1,x2,...xNX={x_1,x_2,...x_N}X=x1,x2,...xN,同样对于训练样本集合D中每一个训练样本d而言,其也包含N个属性,那么我们在计算的时候,需要计算X中的每一个属性和d中的每一个属性的距离值,那么问题来了,这种距离计算有两个缺点:

  1. 当N过大,也就是属性值过多的时候,计算的复杂度过高。
  2. 对于X和d中的属性而言,某些属性对于当前的分类并没有作用,甚至于因为计算这些属性,还会引起分类的错误。

那么,当属性过多的时候,我们就需要去掉一些属性,那么我们应该如何减少这些属性呢?这就引出来来的我们下面的算法——主成分分析法(PCA)

2 主成分分析法(PCA)

2.1 PCA算法引入

首先,假设我们有一些样本点,每一个样本点具有两个属性,也就是两个特征,这些样本点在二维平面上的分布如图所示:
在这里插入图片描述
我们现在,想要样本点的特征缩减到一个,也就是将数据的维度从2降到1,最常见的思想,就是直接去掉某一个维度。如下图所示:
在这里插入图片描述
在这里插入图片描述
上面两张图中,我们分别去掉了特征2和特征1.我们比较一下上面的两种降维方案,似乎第一种更好一些,因为方案一中各个点的距离更大,更好区分。那么,有没有一种方案,使得降维之后的各个点能够保持的距离最大,最好区分呢?
在这里插入图片描述
我们看这样的一条直线,当我们把点映射到这条直线的时候,也就是如下图所示:
在这里插入图片描述
我们可以发现,这种映射相对于方案一,各个点的距离更大,更好区分,与原来的样本分布并没有太大的区别。

那么,如何找到使得样本间间距最大的轴?

在统计学中,方差代表的是数据之间得稀疏程度,方差越大,数据越稀疏,方差越小,数据越密集。那么,根据方差的性质,我们可以选择方差最大的情况来衡量降维之后各个样本的点的分布情况,也就是在降维之后,能够使得各个样本点之间方差最大的情况就是我们要找的对应的降维的轴。方差对应的公式为:
Var(Xi)=1p∑i=1p(Xi−Xmean)2Var(X_i)=\frac{1}{p}∑_{i=1}^p(X_i-X_{mean})^2Var(Xi)=p1i=1p(XiXmean)2
其中XmeanX^{mean}Xmean表示样本的均值。在我们的例子中,我们想要确定一个轴在二维平面上的方向(w1,w2)(w_1,w_2)(w1,w2),使我们样本在映射之后的方差最大,用公式表示为:
max(Var(Xinew)=1p∑i=1p∣∣Xinew−Xmeannew∣∣2)max(Var(X_i^{new})=\frac{1}{p}∑_{i=1}^p||X_i^{new}-X_{mean}^{new}||^2)max(Var(Xinew)=p1i=1pXinewXmeannew2)
其中p表示样本的总个数。

2.2 PCA的数学原理
2.1 数据取均值

对于一个样本集合而言,为了便于数据的运算,我们让
X=X−XmeanX=X-X_{mean}X=XXmean
这种类似于归一的操作,其目的是将在向量空间中的向量移动位置,是再次求均值的时候,结果为0,便于计算。并且不会改变向量分布的特点。

2.2 推导过程

通过上面的描述,我们已经能够确定PCA算法的目标以及如何衡量。下面我们将X的属性从2维扩展到N维。根据上面的描述,我们可以知道,PCA的本质就是选择m个方向向量,将N维的数据映射到m维度的空间。我们用数学化的形式来描述一下就是:
Xnew=AX+BX_{new}=AX+BXnew=AX+B
其中X是原始的向量(N ,1),A表示用于降维的的矩阵(N,m),B是一个偏置项(m,1)。通过A矩阵的映射,将p维的X向量映射为m维的XnewX_{new}Xnew向量。下面,我们具体来分析映射矩阵A,将A矩阵展开之后有如下的表示:
A=a11a12...a1Na21a22...a2N...........................am1am2...amNA= \begin{matrix} a_{11}&&a_{12}&&...&&a_{1N}\\ a_{21}&&a_{22}&&...&&a_{2N}\\ ......&&.......&&........&&......\\ a_{m1}&&a_{m2}&&...&&a_{mN}\\ \end{matrix}A=a11a21......am1a12a22.......am2.................a1Na2N......amN
我们将每一行用AiA_iAi来表示有
A=A1A2...AmA= \begin{matrix} A_1\\ \\ A_2\\ \\ ... \\ A_m \end{matrix}A=A1A2...Am

根据矩阵乘法有AiX=XnewiA_iX=X_{new}^iAiX=Xnewi,也就是说,每一行AiA_iAi代表的是将X映射到新空间某一个维度的方向。整体的数学化表示就是:
Y=Y1Y2...Ym=A1(X−Xmean)A2(X−Xmean)...Am(X−Xmean)Y= \begin{matrix} Y_1\\ \\ Y_2\\ \\ ... \\ Y_m \end{matrix}= \begin{matrix} A_1(X-X_{mean})\\ \\ A_2(X-X_{mean})\\ \\ ... \\ A_m(X-X_{mean}) \end{matrix}Y=Y1Y2...Ym=A1(XXmean)A2(XXmean)...Am(XXmean)

其中YiY_iYi表示新样本集合的第i个样本点。YmeanY_{mean}Ymean表示各个样本X在映射为Y之后的,新产生的各个样本点的均值。下面,我们将新样本点i进行展开有:
Yi=A1(Xi−Xmean)A2(Xi−Xmean)...Am(Xi−Xmean)=Yi1Yi2...Yim其中i∈[1,p]Y_i= \begin{matrix} A_1(X_i-X_{mean})\\ \\ A_2(X_i-X_{mean})\\ \\ ... \\ A_m(X_i-X_{mean}) \end{matrix}= \begin{matrix} Y_{i1}\\ \\ Y_{i2}\\ \\ ... \\ Y_{im} \end{matrix} 其中i∈[1,p]Yi=A1(XiXmean)A2(XiXmean)...Am(XiXmean)=Yi1Yi2...Yimi[1,p]
其中XiX_iXi表示原始样本集合的第i个样本点。

根据上面的描述,我们的目标是要保证在映射之后,各个样本的点新坐标的方差最大。那么也就是:
max∑i=1p∣∣Yi−Ymean∣∣2max ∑_{i=1}^p||Y_i-Y_{mean}||^2maxi=1pYiYmean2

YmeanY_{mean}Ymean表示各个样本X在映射为Y之后的均值。我们从新空间的逐个方向来进行展开,首先是A1A_1A1方向,在该方向中,我们要求方差最大,也就是:
max∑i=1p(Yi1−Ymean1)2max ∑_{i=1}^p(Y_{i1}-Y_{mean1})^2maxi=1p(Yi1Ymean1)2
其中Ymean1Y_{mean1}Ymean1表示的是新的样本点集合中的所有样本在第一个方向上的均值。数学化表达就是:
Ymean1=1p∑i=1pYi1=1p∑i=1pA1(Xi−Xmean)=0Y_{mean1}=\frac{1}{p}∑_{i=1}^pY_{i1}=\frac{1}{p}∑_{i=1}^pA_1(X_i-X_{mean})=0Ymean1=p1i=1pYi1=p1i=1pA1(XiXmean)=0
进而推导出:
max∑i=1p(Yi1)2=∑i=1p∣∣A1(Xi−Xmean)∣∣2max ∑_{i=1}^p(Y_{i1})^2=∑_{i=1}^p||A_1(X_i-X_{mean})||^2maxi=1p(Yi1)2=i=1pA1(XiXmean)2
根据矩阵向量乘法有:
∑i=1p∣∣A1(Xi−Xmean)∣∣2=∑i=1p[A1(Xi−Xmean)][A1(Xi−Xmean)]T=∑i=1pA1(Xi−Xmean)(Xi−Xmean)TA1T∑_{i=1}^p||A_1(X_i-X_{mean})||^2=∑_{i=1}^p[A_1(X_i-X_{mean})][A_1(X_i-X_{mean})]^T\\ =∑_{i=1}^pA_1(X_i-X_{mean})(X_i-X_{mean})^TA_1^Ti=1pA1(XiXmean)2=i=1p[A1(XiXmean)][A1(XiXmean)]T=i=1pA1(XiXmean)(XiXmean)TA1T
再进一步,我们们能够发现,对于
ε=(Xi−Xmean)(Xi−Xmean)Tε=(X_i-X_{mean})(X_i-X_{mean})^Tε=(XiXmean)(XiXmean)T
其表示的就是原样本集合的协方差矩阵。这最终原始可以化简为:

max∑i=1p(Yi1)2=∑i=1pA1εA1Tmax ∑_{i=1}^p(Y_{i1})^2=∑_{i=1}^pA_1εA_1^Tmaxi=1p(Yi1)2=i=1pA1εA1T

在之前我们提到过,任意的一个AiA_iAi表示的都是新空间中的一个方向,则为了便于计算,我们将这个表示方向的参数进行归一化。也就是我们约定:
A1A1T=∣∣A1∣∣2=1A_1A_1^T=||A_1||^2=1A1A1T=A12=1

所以,我们可以总结一下对于方向A1A_1A1的目标函数以及其限制条件:
目标函数:max∑i=1p(Yi1)2=∑i=1pA1εA1T限制条件:A1A1T=∣∣A1∣∣2=1目标函数:max ∑_{i=1}^p(Y_{i1})^2=∑_{i=1}^pA_1εA_1^T\\ 限制条件:A_1A_1^T=||A_1||^2=1maxi=1p(Yi1)2=i=1pA1εA1TA1A1T=A12=1

下面我们补充一个数学知识:

  1. 拉格朗日乘子法:设给定函数z=ƒ(x)和附加条件φ(x)=0,为寻找z=ƒ(x)在附加条件下的极值点,先做拉格朗日函数 ,其中λ为参数。
    F(x)=f(x)+λφ(x)F(x)=f(x)+λφ(x)F(x)=f(x)+λφ(x)
    令F(x,λ)对x和y和λ的一阶偏导数等于零,即
    F’(x)=ƒ’x(x)+λφ’x(x)=0
    F’(λ)=φ(x)=0
    由上述方程组解出x,y及λ,如此求得的(x,y),就是函数z=ƒ(x,y)在附加条件φ(x,y)=0下的可能极值点。
    若这样的点只有一个,由实际问题可直接确定此即所求的点。(内容源于百度百科)

根据,我们拉格朗日乘子法以及我们的目标函数,我们可以再次定义我们的目标函数:
E(A1)=A1εA1T−λ1(A1A1T−1)E(A_1)=A_1εA_1^T-λ_1(A_1A_1^T-1)E(A1)=A1εA1Tλ1(A1A1T1)
为了求极值,我们可以对于A1A_1A1进行求导了:
∂E(A1)∂A1=∂(A1εA1T)∂A1−∂(λ1(A1A1T−1))∂A1 \frac{∂E(A_1)}{ ∂A_1}= \frac{∂(A_1εA_1^T)}{∂A_1}-\frac{∂(λ_1(A_1A_1^T-1))}{∂A_1}A1E(A1)=A1(A1εA1T)A1(λ1(A1A1T1))

这个具有的求导过程我就不详细展开了,需要记住一点的就是协方差矩阵ε是对称矩阵。解出式子为:
∂E(A1)∂A1=(2εA1T)T−2λ1A1\frac{∂E(A_1)}{ ∂A_1}=(2εA_1^T)^T-2λ_1A_1A1E(A1)=(2εA1T)T2λ1A1
当导数为0的时候有:
εA1T=λ1A1TεA_1^T=λ_1A_1^TεA1T=λ1A1T

下面,我们再来补充一个数学知识:

特征值与特征向量

设 A 是n阶方阵,如果存在数m和非零n维列向量 x,使得 Ax=mx 成立,则称 m 是矩阵A的一个特征值,而x称为特征向量。(来源:百度百科)

好了,根据数学定义,我们可以知道A1T和λ1A_1^T和λ_1A1Tλ1是ε的特征向量和特征值。在回到我们的最开始的目标函数:
∑i=1pA1εA1T∑_{i=1}^pA_1εA_1^Ti=1pA1εA1T
于是就有了:
∑i=1pA1εA1T=A1(εA1T)=A1λ1A1T=λ1(A1A1T)=λ∑_{i=1}^pA_1εA_1^T=A_1(εA_1^T)=A_1λ_1A_1^T=λ_1(A_1A_1^T)=λi=1pA1εA1T=A1(εA1T)=A1λ1A1T=λ1(A1A1T)=λ

于是,我们就确定了λ1λ_1λ1是ε最大的特征值,A1A_1A1是ε的最大特征向量。且有限制条件为A1A1T=1A_1A_1^T=1A1A1T=1

然后,我们来看第二个方向A2A_2A2,对于方向A2A_2A2,根据之前的过程,我们可以知道其目标函数和限制条件:
目标函数:max∑i=1pA2εA2T限制条件(1):A2A2T=∣∣A2∣∣2=1限制条件(2):A1A2T=A2A1T=0目标函数:max ∑_{i=1}^pA_2εA_2^T\\ 限制条件(1):A_2A_2^T=||A_2||^2=1\\ 限制条件(2): A_1A_2^T= A_2A_1^T=0maxi=1pA2εA2T(1)A2A2T=A22=1(2)A1A2T=A2A1T=0

这里,我解释以下限制条件2,对于原始的样本点Xi=[x1,x2,....xn]X_i=[x_1,x_2,....x_n]Xi=[x1,x2,....xn]而言,其每一个属性值是相对于一个坐标轴而言的,就类似于我们之前给出图示:
在这里插入图片描述
对于每一个特征点,其坐标是根据特征1和特征2的坐标轴而言的。那么对于我们映射之后的样本点YiY_iYi,其每一个特征值也是根据坐标轴来的,对于一个坐标系而言,我们要求改坐标系中的每一个坐标轴之间是垂直的,那么也就是不同坐标轴对应的方向向量的内积为0,这也就是限制条件2产生的原因。

对于A2A_2A2的目标函数,我们也采用拉格朗日乘子法对其进行变换:
E(A2)=E(A1)=A2εA2T−λ2(A2A2T−1)−βA1A2TE(A_2)=E(A_1)=A_2εA_2^T-λ_2(A_2A_2^T-1)-βA_1A_2^TE(A2)=E(A1)=A2εA2Tλ2(A2A2T1)βA1A2T
A2A_2A2求导之后有:
∂E(A2)∂A2=0则有:(2εA2T)T−2λ2A2−βA1=0\frac{∂E(A_2)}{ ∂A_2}=0 则有:(2εA_2^T)^T-2λ_2A_2-βA_1=0A2E(A2)=0(2εA2T)T2λ2A2βA1=0

根据ε是一个对称矩阵,我们继续推导有:
(2εA2T)T−2λ2A2−βA1=0(2εA_2^T)^T-2λ_2A_2-βA_1=0(2εA2T)T2λ2A2βA1=0
(2A2εT−2λ2A2−βA1)A1T=0(2A_2ε^T-2λ_2A_2-βA_1)A_1^T=0(2A2εT2λ2A2βA1)A1T=0
2A2(εA1T)−2λ2(A2A1T)−βA1A1T=02A_2(εA_1^T)-2λ_2(A_2A_1^T)-βA_1A_1^T=02A2(εA1T)2λ2(A2A1T)βA1A1T=0
2A2(λ1A1T)−β=02A_2(λ_1A_1^T)-β=02A2(λ1A1T)β=0
2λ1A2A1T=β2λ_1A_2A_1^T=β2λ1A2A1T=β
则有β=0。则对于原式子有:
(2εA2T)T−2λ2A2−βA1=(2εA2T)T−2λ2A2=0(2εA_2^T)^T-2λ_2A_2-βA_1=(2εA_2^T)^T-2λ_2A_2=0(2εA2T)T2λ2A2βA1=(2εA2T)T2λ2A2=0
则有:
εA2T=λ2A2TεA_2^T=λ_2A_2^TεA2T=λ2A2T
则求解出λ2,A2Tλ_2,A_2^Tλ2,A2T是ε的第二大特征值和对应的特征向量。

进而推导出
λ3,λ4,.....λm,A3T,A4T,....AmTλ_3,λ_4,.....λ_m,A_3^T,A_4^T,....A_m^Tλ3,λ4,.....λmA3T,A4T,....AmT分别是其第3,4,…,m大的特征值和对应特征向量。

2.3 PCA算法流程
  1. 求协方差矩阵ε=∑i=1P(Xi−Xmean)(Xi−Xmean)Tε=∑_{i=1}^P(X_i-X_{mean})(X_i-X_{mean})^Tε=i=1P(XiXmean)(XiXmean)T
  2. 求ε的特征值,并且按照大小进行排序λ1,λ2,λ3,λ4,.....λmλ_1,λ_2,λ_3,λ_4,.....λ_mλ1,λ2,λ3,λ4,.....λm和对应的特征向量A1t,A2T,A3T,A4T,....AmTA_1^t,A_2^T,A_3^T,A_4^T,....A_m^TA1t,A2T,A3T,A4T,....AmT
  3. 归一化所有的AiA_iAi,使得AiAiT=1A_iA_i^T=1AiAiT=1
  4. AiA_iAi组合成对应的A矩阵
  5. 映射X到Y。
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐