机器学习(五):深入浅出PCA降维

一.前言

PCA可以说是业界使用的非常频繁的机器学习方法了,今天博主带领大家深入浅出PCA模型,相信看完本文你会对PCA有一个更加深刻的理解。话不多说,请看下文!!!

二.理论介绍

2.1 什么是PCA

PCA的英文全称是Principal Component Analysis,即主成分分析,它是一种常用的数据降维方法。数据降维指的是将高维空间中的数据在低维空间中进行表示,同时尽可能较少信息损失。通过数据降维可以提取合适的特征表示并避免维数灾难,数据降维在可视化方面也有着广泛的应用。

周志华的西瓜书中指出,对于正交属性空间中的样本点,倘若存在一个超平面可以对该空间中的所有样本点进行恰当表示,则该超平面应具备两个性质:

  • 最近重构性:样本点到这个超平面的距离都足够近;
  • 最大可分性:样本点在这超平面的投影尽可能分开。

周志华老师指出,基于这两种假设可以得到PCA的两种等价推导,下面将对此一一介绍。

2.2 基于最近重构性的推导

为方便后续的讨论,先给出符号假设,假设样本空间为 X = { x 1 , x 2 , . . . , x m } X=\{x_1,x_2,...,x_m\} X={x1,x2,...,xm},样本空间的数据已经进行了中心化,即 ∑ i x i = 0 \sum_{i}{x_i}=0 ixi=0。假定投影后的 d d d维新坐标系的基为 W = { w 1 , w 2 , . . . , w d } \mathbf{W}=\{ w_1,w_2,...,w_d \} W={w1,w2,...,wd},即对于任意样本 x i \boldsymbol{x}_i xi,其新坐标为原始坐标在新坐标系的基下的投影,假设样本点在新坐标系下的坐标为 z i \boldsymbol{z}_i zi,则:
z i 1 = w 1 T x i z i 2 = w 2 T x i . . . z i d = w d T x i z_{i1} = w_{1}^{T}x_{i} \\ z_{i2} = w_{2}^{T}x_{i} \\ ... \\ z_{id} = w_{d}^{T}x_{i} zi1=w1Txizi2=w2Txi...zid=wdTxi
其中 z i j z_{ij} zij表示样本 x i \boldsymbol{x}_{i} xi在新坐标系下第 j j j维的坐标,上式用矩阵乘法来表示则为 z i = W T x i \boldsymbol{z}_i = W^{T}\boldsymbol{x}_{i} zi=WTxi

若舍弃新坐标系中的部分坐标将维度降至 d ′   ( d ′ < d ) d'\ (d' < d) d (d<d),则样本 x i \boldsymbol{x}_i xi在低维坐标系的坐标为 z i = ( z i 1 , z i 2 , . . . , z i d ′ ) \boldsymbol{z}_{i}=(z_{i1},z_{i2},...,z_{id'}) zi=(zi1,zi2,...,zid)。然后将低维空间的投影坐标重新投回原来的坐标系,则投影回去的坐标为 x ^ i = ∑ j = 1 d ′ z i j w j \boldsymbol{\hat{x}}_i=\sum_{j=1}^{d'}{z_{ij}w_j} x^i=j=1dzijwj

基于此,我们考虑在整个训练集计算原样本和原样本重新投影回来的坐标间的距离:
∑ i = 1 m ∥ ∑ j = 1 d ′ z i j w j − x i ∥ 2 2 = ∑ i = 1 m z i T z i − 2 ∑ i = 1 m z i T W T x i + c o n s t = ∑ i = 1 m z i T z i − 2 ∑ i = 1 m z i T z i + c o n s t = − Σ i = 1 m z i T z i +  const  = − Σ i = 1 m tr ⁡ ( z i z i T ) +  const  = −  tr  ( Σ i = 1 m z i z i T ) +  const  = −  tr  ( W T ( Σ i = 1 m x i x i T ) W ) +  const  (1) \begin{aligned} \sum_{i=1}^{m}\left\|\sum_{j=1}^{d^{\prime}} z_{i j} \boldsymbol{w}_{j}-\boldsymbol{x}_{i}\right\|_{2}^{2} &=\sum_{i=1}^{m} \boldsymbol{z}_{i}{ }^{\mathrm{T}} \boldsymbol{z}_{i}-2 \sum_{i=1}^{m} \boldsymbol{z}_{i}{ }^{\mathrm{T}} \mathbf{W}^{\mathrm{T}} \boldsymbol{x}_{i}+\mathrm{const} \\ & = \sum_{i=1}^{m} \boldsymbol{z}_{i}{ }^{\mathrm{T}} \boldsymbol{z}_{i}-2 \sum_{i=1}^{m} \boldsymbol{z}_{i}{ }^{\mathrm{T}} \boldsymbol{z}_{i}{ }+\mathrm{const} \\ & =-\Sigma_{i=1}^{m} \boldsymbol{z}_{i}^{T} \boldsymbol{z}_{i}+\text { const } \\ & =-\Sigma_{i=1}^{m} \operatorname{tr}\left(\boldsymbol{z}_{i} \boldsymbol{z}_{i}^{T}\right)+\text { const } \\ & =-\text { tr }\left(\Sigma_{i=1}^{m} \boldsymbol{z}_{i} \boldsymbol{z}_{i}^{T}\right)+\text { const } \\ & =-\text { tr }\left(W^{T}\left(\Sigma_{i=1}^{m} \boldsymbol{x}_{i} \boldsymbol{x}_{i}^{T}\right) W\right)+\text { const } \end{aligned} \tag{1} i=1mj=1dzijwjxi22=i=1mziTzi2i=1mziTWTxi+const=i=1mziTzi2i=1mziTzi+const=Σi=1mziTzi+ const =Σi=1mtr(ziziT)+ const = tr (Σi=1mziziT)+ const = tr (WT(Σi=1mxixiT)W)+ const (1)

const表示常数项,因为所有的样本点都是已知的,该项可以直接求。

由于需要最小化重构距离,因此需要求解式(1)的最小值,忽略常数项并考虑 w j \boldsymbol{w}_{j} wj 是标准正交基, ∑ i x i x i T \sum_{i} \boldsymbol{x}_{i} \boldsymbol{x}_{i}^{\mathrm{T}} ixixiT 是协方差矩阵, 于是有
min ⁡ W − tr ⁡ ( W T X X T W )  s.t.  W T W = I (2) \begin{aligned} &\min _{\mathbf{W}}-\operatorname{tr}\left(\mathbf{W}^{\mathrm{T}} \mathbf{X} \mathbf{X}^{\mathrm{T}} \mathbf{W}\right) \\ &\text { s.t. } \mathbf{W}^{\mathrm{T}} \mathbf{W}=\mathbf{I} \end{aligned} \tag{2} Wmintr(WTXXTW) s.t. WTW=I(2)

2.3 基于最大可分性的推导

根据最大可分性,需要使得投影后的样本点尽可能分离开来,因此需要最大化样本点间的方差(反映一组数据的离散程度),可知样本点在新坐标系下的投影为 W T x i \mathbf{W}^{\mathrm{T}} \boldsymbol{x}_{i} WTxi,因此可得优化目标:
max ⁡ W tr ⁡ ( W T X X T W )  s.t.  W T W = I (3) \begin{aligned} &\max _{\mathbf{W}} \operatorname{tr}\left(\mathbf{W}^{\mathrm{T}} \mathbf{X} \mathbf{X}^{\mathrm{T}} \mathbf{W}\right) \\ &\text { s.t. } \mathbf{W}^{\mathrm{T}} \mathbf{W}=\mathbf{I} \end{aligned} \tag{3} Wmaxtr(WTXXTW) s.t. WTW=I(3)
可知最小化式(3)实际上就是最大化式(4),因此二者等价。

2.4 优化求解

对于上述优化目标,显然可以使用拉格朗日乘子法可得最优解为:
X X T W = λ W \mathbf{X} \mathbf{X}^{\mathrm{T}} \mathbf{W} = \lambda \mathbf{W} XXTW=λW
可知,该式中 λ \lambda λ W \mathbf{W} W为矩阵 X X T \mathbf{X} \mathbf{X}^{\mathrm{T}} XXT对应的特征值和特征向量。因此只需要 X X T \mathbf{X} \mathbf{X}^{\mathrm{T}} XXT进行特征值分解,然后将特征值按从大到小进行排序,然后选取前 d ′ d' d个特征值对应的特征向量作为低维空间的基即可

需要注意的是 d ′ d' d不是很好确定,周志华老师在西瓜书提出可以设置一个重构阈值 t t t,然后计算至少前多少个特征值的和占所有特征值的和的比例大于等于该阈值,然后将该其对应的 d ′ d' d作为PCA降维后的维数,即:
∑ i = 1 d ′ λ i ∑ i = 1 d λ i ⩾ t (4) \frac{\sum_{i=1}^{d^{\prime}} \lambda_{i}}{\sum_{i=1}^{d} \lambda_{i}} \geqslant t \tag{4} i=1dλii=1dλit(4)

2.5 PCA算法总结

基于以上的所有内容,我们可知PCA算法的步骤,为方便(偷懒),这里仍借用周志华书中的伪代码来进行展示:

PCA

需要注意是的PCA在实际的应用中一般不直接对 X X T \mathbf{X} \mathbf{X}^{\mathrm{T}} XXT进行特征值分解,而是进行奇异值分解。

三.PCA实战

3.1 模型实现

限于时间原因,这里直接给出常规的PCA算法的源代码:

class PCAModel():
    def __init__(self,n_components) -> None:
        """
        n_components: 降维后的维度/重构阈值
        """
        self.n_components = n_components

    def transform(self,data):
        """
        data: (nums,features)
        """
        # 中心化
        data = data - np.mean(data,axis=0)
        # 协方差矩阵
        data = np.matmul(data.T,data)
        # v[:,i]是对应特征值w[i]的特征向量
        e_vals,e_vecs = np.linalg.eig(data)
        # 特征值从大到小排序
        indices = np.argsort(-e_vals)
        # 根据重构阈值获取d'
        if self.n_components >= 0 and self.n_components <= 1.0:
            k,val_cur,val_sum = 0,0,np.sum(e_vals)
            while True:
                val_cur += e_vals[indices[k]]
                k += 1
                if val_cur / val_sum >= self.n_components:
                    break
            self.n_components = k
        # w (features, d')
        w = e_vecs[:,indices[:self.n_components]]
        return w

3.2 真实数据集降维可视化

这里同样拿UCI中的鸢尾花数据集来进行降维可视化实战。此外,我们还与sklearn中的PCA的降维效果进行了对比,实现的源码如下:

# 重构阈值
n_components = 0.95
data = pd.read_csv("../datasets/iris.csv").values
x,y = data[:,:4],data[:,-1]
# 自己实现的模型
pca = PCAModel(n_components)
w = pca.transform(x)
lx = np.matmul(x,w)
# sklearn自带的模型
pca_sk = PCA(n_components)
lx_sk = pca_sk.fit_transform(x)
plt.subplot(1,2,1)
plt.title("Our PCA")
plt.scatter(lx[:,0],lx[:,1],c=y)
plt.subplot(1,2,2)
plt.title("Sklearn")
plt.scatter(lx_sk[:,0],lx_sk[:,1],c=y)
plt.savefig("vis.png")
plt.show()

sklearn中采用的便是奇异值分解的方法,有兴趣的可以去翻翻源码。

下面展示降维可视化后的结果:

outcome

从结果中可以看出模型能够将原来4维空间中的样本点较为准确的区分开来,另外可知鸢尾花数据集中有两个类别之间的距离比较近。

四.结语

完整源码: PCA

以上便是本文的全部内容,要是觉得不错的话就点个赞或关注一下博主吧,你们的支持是博主继续创作的不解动力,当然若是有任何问题也敬请批评指正!!!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斯曦巍峨

码文不易,有条件的可以支持一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值