zoukankan      html  css  js  c++  java
  • 05-03 主成分分析(PCA)


    更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11686958.html

    主成分分析(PCA)

    一、维数灾难和降维

    在KNN算法中曾讲到,对于高维数据,会出现数据样本稀疏、距离计算困难等问题。但是这种问题并不是仅仅针对KNN算法,只是在KNN算法中这种问题会被放大,而其他的机器学习算法也会因为高维数据对训练模型造成极大的障碍,这种问题一般被称为维数灾难(curse of dimensionality)。

    解决维数灾难最常用的方法是降维(dimension reduction),即通过某种数学变换将原始高维特征空间转变为一个低维子空间,在这个子空间中样本密度大幅提高,距离计算也变得更容易。

    # 维数灾难和降维图例
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.font_manager import FontProperties
    from sklearn.decomposition import PCA
    %matplotlib inline
    font = FontProperties(fname='/Library/Fonts/Heiti.ttc')
    

    np.random.seed(0)
    X = np.empty((100, 2))
    X[:, 0] = np.random.uniform(0, 100, size=100)
    X[:, 1] = 0.75 * X[:, 0] + 3. + np.random.normal(0, 10, size=100)
    pca = PCA(n_components=1)
    X_reduction = pca.fit_transform(X)
    X_restore = pca.inverse_transform(X_reduction)

    plt.scatter(X[:, 0], X[:, 1], color='g', label='原始数据')
    plt.scatter(X_restore[:, 0], X_restore[:, 1],
    color='r', label='降维后的数据')
    plt.annotate(s='',xytext=(40,60),xy=(65,30),arrowprops=dict(arrowstyle='-',color='b',linewidth=5))
    plt.legend(prop=font)
    plt.show()

    png

    如上图所示,绿点即原始高维空间中的样本点,红点即我们降维后的样本点。由于图中的高维是二维,低维是一维,所以样本在低维空间是一条直线。

    接下来我们的目标就是聊一聊如何做到把高维空间样本点映射到低维空间,即各种降维算法。

    二、主成分分析学习目标

    1. 维数灾难和降维
    2. 主成分分析两个条件
    3. 基于主成分分析两个条件推导主成分分析
    4. 核主成分分析
    5. 主成分分析优缺点

    三、主成分分析详解

    主成分分析(principal component analysis,PCA)是最常用的一种降维方法,我们已经利用“维数灾难和降维图例”解释了降维的过程,PCA的降维过程则是尽可能的使用数据最主要的特征来代表数据原有的所有特征。但是有没有同学想过为什么使用PCA降维是上图的红点组成的线而不是蓝线呢?这里就需要说到我们PCA的两个条件了。

    3.1 主成分分析两个条件

    对于“维数灾难和降维图例”中的红线和蓝线我们可以把它看成一个超平面S,理论上红线和蓝线构成的超平面都可以做到对样本特征的降维,但是一般我们希望这种能够做到降维的超平面满足以下两个条件

    1. 最近重构性:样本点到这个超平面的距离都足够近
    2. 最大可分性:样本点到这个超平面上的投影尽可能分开

    基于最近重构性和最大可分性,就可以得到主成分分析的两种等价推导。

    3.2 基于最近重构性推导PCA

    3.2.1 主成分分析目标函数

    我们首先从最近重构性推导PCA,即样本点到这个超平面的距离足够近。

    假设mn维数据(x(1),x(2),,x(m))都已经进行了中心化,即i=1mx(i)=0;在假设投影变换后得到的新坐标系为{w1,w2,,wn},其中wi是标准正交基向量,即||wi||=1wiTwj=0,其中ij

    如果把数据从n维降到n维,即丢弃新坐标系中的部分坐标,则新的坐标系为{w1,w2,,wn},则样本点x(i)n维坐标系中的投影为

    zi=(zi1,zi2,,zid)T

    其中zij=wjTxi,是xi在低维坐标系下第j维的坐标。

    如果我们用z(i)重构x(i),则可以恢复的原始数据为

    xi^=j=1dzijwj

    现在考虑整个样本集,既可以获得原样本点xi到基于投影重构的样本点xi^之间的距离为

    (1)i=1m||xi^xi||2=i=1m||Wzixi||2(2)=i=1m(Wzi)T(Wzi)2i=1m(Wzi)Txi+i=1mxiTxi(3)=i=1mziTzi2i=1mziTWTxi+i=1mxiTxi(4)=i=1mziTzi2i=1mziTzi+i=1mxiTxi(5)=i=1mziTzi+i=1mxiTxi(6)=tr(WT(i=1mxixiT)W)+i=1mxiTxi(7)=tr(WTXXTW)+i=1mxiTxi

    由于涉及过多矩阵推导,此处不多赘述,看不懂的可以跳过。

    其中W=(w1,w2,,wd),其中i=1mxiTxi是数据集的协方差矩阵,W的每一个向量wj是标准正交基,而i=1mxiTxi是一个常量,最小化上式等价于

    (8)minWtr(WTXXTW)(9)s.t.WTW=I

    3.2.2 主成分分析目标函数优化

    主成分分析目标函数为

    (10)minWtr(WTXXTW)(11)s.t.WTW=I

    最小化该目标函数其实并不难,可以发现最小化目标函数对应的W由协方差矩阵XXT最大的n个特征值对应的特征向量组成,利用拉格朗日乘子法可得

    J(W)=tr(WTXXTW+λi(WTWI))

    W求导等于0即可得

    (12)XXTW+λW=0(13)XXTW=λW

    从上式可以看出,WXXTn个特征向量组成的矩阵,而λ有若干个特征值组成的矩阵,特征值在对角线上,其余位置为0。当我们将数据集从n维降到n维时,需要找到最大的n个特征值对应的特征向量。这个n个特征向量组成的矩阵W即我们需要的矩阵。对于原始数据集,我们只需要用zi=WTxi,就可以把原始数据集降到最小投影距离的n维数据集。

    3.3 基于最大可分性推导PCA

    从最大可分性出发,样本点xi在新空间中超平面的投影是WTxi,如果所有样本点的投影尽可能分开,则应该使投影后样本点的方差最大化。

    投影后样本点的方差是i=1mWTxixiTW,因此目标函数可以写成

    (14)maxWtr(WTXXTW)(15)s.t.WTW=I

    上式其实和基于最近重构性推导PCA的目标函数其实差不多,其中一个是加负号的最小化,一个是最大化。
    对基于最大可分性推导得到的目标函数最大化,利用拉格朗日乘子法可以得到

    XXTW=λW

    3.4 核主成分分析(KPCA)

    PCA中,我们假设存在一个线性的超平面,可以对数据投影,但工业上大多数时候数据都是线性不可分的,这里就需要用到和核SVM一样的思想,即核主成分分析(kernelized PCA,KPCA),是基于核技巧对非线性可分数据进行降维。

    KPCA首先会把数据从n维映射到更高的N维,让数据线性可分后又会把数据映射回低维n,即n<n<N

    假设我们将在高维特征空间把数据投影到由W=(w1,w2,,wd)确定的超平面上,则W

    ZZTW=(i=1mziziT)W=λW

    其中zi是样本点再高维特征空间中的像,即特征分解问题变为

    (16)W=1λ(i=1mziziT)W(17)=i=1mziziTWλ(18)=i=1mziαij

    其中aij=1λziTWαi的第j个分量。

    假设zi是由原始样本点xi通过映射ϕ产生,即zi=ϕ(xi),则特征分解问题变为

    (i=1mϕ(xi)ϕ(xi)T)W=λW

    W变为

    W=i=1mϕ(xi)αij

    由于我们并不知道ϕ是什么,一般情况下ϕ不需要显示计算,通过核函数转换即可。因此引入核函数

    k(xi,xj)=ϕ(xi)Tϕ(xj)

    将核函数和wj代入特征分解问题,可得

    Kαj=λαj

    其中Kk对应的核矩阵,对于上述特征值分解问题,去K最大的d个特征值对应的特征向量即可。

    对于新样本x,他投影后的第j(j=1,2,,d)维坐标为

    (19)zj=WTϕ(x)(20)=i=1mαijϕ(xi)Tϕ(x)(21)=i=1mαijk(xi,x)

    从上述特征分解可以看出,KPCA需要对所有样本求和,因此它的计算开销较大。

    四、主成分分析流程

    4.1 输入

    样本集D={x1,x2,,xn};低维空间维数n

    4.2 输出

    降维后的样本集D

    4.3 流程

    1. 对所有样本进行中心化:xixi1mi=1mxi
    2. 计算样本的协方差矩阵XXT
    3. 对协方差矩阵XXT做特征值分解
    4. 取最大的n个特征值所对应的特征向量(w1,w2,,wn),将所有的特征向量标准化后,组成特征向量矩阵W
    5. 对样本集中的每一个样本x(i),转化为新的样本z(i)=WTx(i)
    6. 得到输出样本集n=(z(1),z(2),,z(m))

    降维后低维空间的维数n通常是用户事先指定的,一般选择使用交叉验证的方法选择最好的n值。对于PCA,有时候也会从重构的角度指定一个降维到的主成分比重阈值t,这个阈值的范围一般是(0,1],然后选取使下式成立的最小n

    i=1nλii=1nλit

    五、主成分分析优缺点

    5.1 优点

    1. 只需要以方差衡量信息量,不受数据集以外的因素影响
    2. 主要计算是特征值分解,计算简单,易于实现

    5.2 缺点

    1. 主成分由于是降维得到,没有原始样本那样较强的解释性
    2. 由于PCA降维会丢掉不少的信息,可能对后续的数据处理有影响

    六、小结

    PCA作为一个无监督学习的降维方法,只需要对特征值分解,就可以压缩数据,对数据去噪声。但是PCA还是有不少缺点的,针对PCA的缺点,也出现了很多PCA的变种,如解决非线性数据降维的KPCA;解决内存限制的增量的Incremental PCA;解决稀疏数据降维的Sparse PCA等。

    由于PCA涉及过多的数学公式,以及有着较强逻辑和空间处理。如果不是很懂可以结合代码然后多看几遍。

  • 相关阅读:
    巨蟒python全栈开发-第3天
    python全栈开发-第1天
    2018.11.23-day28 异常处理&hashlib
    面试题1
    if __name__ == "__main__": 怎么理解?
    2018.11.23-day27 面向对象(大总结)
    2018.11.23-day26 面向对象(终结)
    20181125 test
    (39.1) Spring Boot Shiro权限管理【从零开始学Spring Boot】
    Android一键换肤功能:一种简单的实现
  • 原文地址:https://www.cnblogs.com/abdm-989/p/14111650.html
Copyright © 2011-2022 走看看