zoukankan      html  css  js  c++  java
  • 机器学习实战之PCA

    1.  向量及其基变换

    1.1 向量内积

    (1)两个维数同样的向量的内积定义例如以下: 内积运算将两个向量映射为一个实数.

    (2) 内积的几何意义

        如果AB是两个n维向量, n维向量能够等价表示为n维空间中的一条从原点发射的有向线段, 为方便理解, 在这里如果A和B都是二维向量.A=(x1,y1) , B=(x2,y2),在二维平面上A/B能够用两条发自原点的有向线段表示,例如以下图:

    在上图中,从A点向B所在的直线引一条垂线.垂线与B的交点叫A在B上的投影.A与B的夹角是a,则投影的矢量长度为

    * 矢量长度可能为负,其绝对值是线段长度. 符号取决于其方向与标准方向同样或相反. 标量长度总是大于等于0,值就是线段的长度.

    内积第二种表示形式:

    A和B的内积等于A到B的投影长度乘以B的模.设向量B的模为1的话,则A和B的内积值等于A向B所在直线投影的矢量长度.

    1.2 基

    (1) 一个二维向量相应二维直角坐标系中从原点出发的一个有向线段, 代数方面, 常使用线段终点的点坐标表示向量, 比如(3,2), 可是一个(3,2)并不能精确的表示一个向量,. 分析可得: "3"实际表示的是向量在x轴上的投影值是3,在y轴的投影值是2, 也就是隐式的引入了一个定义: 以x轴和y轴正方向长度为1的向量为标准. 更详细地,向量(x,y)实际能够表示线性组合:. 此处(1,0)/(0,1)为二维空间中的一组基.

    结论: 为了准确描写叙述向量,首先确定一组基,然后给出在基所在的各个直线上的投影值就可以.

    (2) 不论什么两个线性无关的二维向量都能够成为一组基.一般如果基的模为1, 比如一组基为,则点(3,2)在新基上的坐标为,形象的从下图中能够观察:

    (3) 基变换的矩阵表示

    第二节中的样例转为矩阵表示为:

    矩阵的两行分别为两个基.乘以原向量恰好是新坐标; 若是有多个二维向量要转换到新基下的坐标,即将这些二维向量按列排成一个矩阵,比如点(1,1)/(2,2)/(3,3)

    *结论: 假设有m个n维向量,想将其变换为r个n维空间表示的新空间中,首先将r个基按行组成矩阵A,然后将向量按列组成矩阵B, 那么两矩阵的乘积AB就是变换结果,当中AB的第m列为B中第m列的变换结果. r决定了变换后数据的维数.即能够将一n维数据变换到更低维的空间中去,变换后的维数取决于基的数量.

    两个矩阵相乘的意义就是将右边矩阵中的每一列列向量转换到左边每一行行向量为基表示的空间中去.

    2. 协方差矩阵

    2.1 基础准备

           前面讨论了不同的基能够对同一组数据给出不同的表示,假设基的数量少于向量自身的维数, 则能够达到降维的目标. 怎样选择k个n维向量(k个基)使得最大程度上保留原有的信息?

    以下举例说明:

    数据的5条记录组成, 将它们表示成矩阵形式:

    当中每一列为一条数据记录,一行相应一个字段,为了处理方便,首先将每一个字段内全部值减去字段均值,其结果就是将每一个字段的均值都变为0,上述矩阵变换后的结果为:

    其在坐标系中相应的位置为:

    问题: 如今要用一维来表示这些数据,又希望尽可能的保留原始的信息,该怎么选择基?

    答案: 希望投影后的投影值尽可能分散.

    上述图所将数据点向第一象限和第三象限的斜线投影,则上述5个点在投影后还是能够区分的.


    2.2.  方差

        希望投影后得到的数据值尽可能分散, 分散程度能够用数学上的方差来表述.

         一个字段的方差能够看作是每一个元素与字段均值差的平方和的均值,即

        因为上面已将数据的每一个字段平均化了,因此方差能够直接用每一个元素的平方和除以元素个数,即

     于是上述问题被形式化表示为:寻找一个基,使得全部数据变换为这个基上的坐标后,方差最大.

    2.3 协方差

       对于将二维变为一维的问题,找到使得方差最大的方向就可以; 可是对于更高维,须要考虑很多其它,比如三维降到二维, 与之前同样,首先希望找到一个方向使得投影后方差最大,这样就完毕了地一个方向的选择,继续我们还须要选择第二个投影方向.

        若继续选择方差最大的方向,则这个方向和第一个方向应该是差点儿重合的, 显然这样是不行的,. 从直观上看,为了让这两个字段尽可能的表示很多其它的原始信息,希望它们之间是线性不相关的,由于相关性意味这两个字段不是全然独立,存在反复表示的信息.

       数学上用两个字段的协方差来表示其相关性,因为已经让每一个字段的均值为0,则其协方差计算公式例如以下:

       由式子能够得出, 在字段均值为0的情况下, 两个字段的协方差简洁的表示为其内积除以元素数.

       当协方差为0时, 表示两个字段全然独立. 为了让协方差为0, 选择第二个基仅仅能在与第一个基正交的方向上选择.因此终于选择的两个方向一定是正交的.


    ***降维的优化目标: 将一组n维向量降为k维,其目标是选择k个单位(模为1)正交基,使得原始数据变换到这组基上后, 个字段两两间协方差为0,且字段的方差尽可能大(在正交的约束下,取最大的k个方差)


    2.4 协方差矩阵

         终于目的与字段内方差和字段间的协方差密切相关,如今想做的就是使得两者统一.

        如果我们有a和b两个字段,m个向量,将其按行组成矩阵X:

       然后用X乘以X的转置,并除以向量个数:

       能够发现,这个矩阵对角线上的两个元素各自是来那个个字段的方差,而其他元素是a和b的协方差.即方差和协方差被统一到了一个矩阵中.

     ***推广得到一般结论: 若有m个n维数据,将其按列拍成n*m的矩阵X,,则C是一个对称矩阵,其对角线各自是各个字段相应的方差,第i行j列与第j行i列的元素一样,表示i和j两个字段的协方差.

    2.5 协方差矩阵对角化

       为了达到使得字段内方差尽可能大,字段间的协方差为0的目标, 等于将协方差矩阵对角化:即除对角线外的其他元素均为0,而且对角线上的元素按从大到小的顺序排列,这样就达到了优化目的.

       令原始数据矩阵X相应的协方差矩阵为C,P是一组基按行组成的矩阵,Y=PX,则Y为X对P做基变换后的数据.设Y的协方差矩阵为D,推导D与C的关系:

     

      显然, 变换后的矩阵Y的协方差矩阵D应该除对角线外的元素为0.我们寻找的P是能让原始协方差矩阵对角化的P.

       即优化目标变为:寻找一个矩阵P, 满足是一个对角矩阵,且对角元素按从大到小依次排列,那么P的前k行就是寻找的基,用P的前k行组成的矩阵乘以C就使得X从n维降到了k维并满足上述优化条件.


    2.6 协方差对角化

    协方差矩阵C是一个对称矩阵,实对称矩阵有非常好的性质:


    3. 降维方法

    3.1 降维目的:

    • 使得数据集更易使用
    • 减少非常多算法的计算开销
    • 去除噪声
    • 使得结果易懂

    3.2 三种降维方法

    (1) 主成分分析法 (principal component analysis, PCA)

           在PCA中,数据从原来的坐标系转换到了新的坐标系,新坐标系的选择由数据本身决定. 第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴的选择是和第一个新坐标轴正交且具有最慷慨差的方向.过程一直反复,反复次数为原始数据中特征的数目.

    (2) 因子分析(factor analysis)

          在因子分析中,如果在观察数据的生成中有一些观察不到的隐变量.如果观察数据是这些隐变量和某些噪声的线性组合.

    (3) 独立成分分析(independent component analysis,ICA)

           在ICA中, 如果数据是从N个数据源生成的.即数据为多个数据源的混合观察结果,这些数据源之间在统计上是相互独立的,在PCA中仅仅如果数据是不相关的.同因子分析一样,若数据源的数目小于观察数据的数目,就能够实现降维.


    4. PCA(principal component analysis,主成分分析)

    4.1 性能评价

    长处: 减少数据的复杂性,识别到最重要的几个特征

    缺点:不一定须要,且可能损失实用信息

    4.2 PCA实现

       将数据转换成前N个主成分的伪代码例如以下:

        去除平均值(将数据的每一维特征减去其平均值)

        计算由数据构成矩阵的协方差矩阵

        计算协方差矩阵的特征值和特征向量

        将特征值从大到小排序

         保留最上面的N个特征向量

        将数据转换到上述N个特征向量构建的新空间中


    事实上现代码例如以下:

    <span style="font-size:18px;"><span style="font-size:18px;">def pca(dataMat,topNfeat = 999999):
    	#每一行相应一个数据点,求每一列的平均值(即每一个特征的均值)
    	meanVal = mean(dataMat,axis = 0)
    	#数据均值化
    	meanData = dataMat - meanVal
    	
    	#求数据的协方差矩阵
    	covMat = cov(meanData,rowvar = 0)
    	#协方差矩阵的特征向量和特征值
    	eigVal,eigVec = linalg.eig(mat(covMat))
    	
    	eigValIndex = argsort(eigVal)
    	eigValIndex = eigValIndex[:-(topNfeat+1):-1]
    	redEigVec = eigVec[:,eigValIndex]
    	#得到降维后的数据
    	lowDataMat = meanData * redEigVec
    
    	#原始数据被重构后返回用于调试
    	reconMat = (lowDataMat * redEigVec.T) + meanVal
    
    	return lowDataMat,reconMat</span></span>

    4.3 重构

    还原原始数据的过程就是获得样本点映射以后在原空间中的预计位置的过程.

    检验:在命令行输入下面代码:将降维后的数据和原始数据一起画出来.得到图片例如以下:

    <span style="font-size:18px;">>>> lowdata,recon = pca.pca(datas,1)
    [[ 1.]]
    >>> import matplotlib.pyplot as plt
    >>> fig = plt.figure()
    >>> ax = fig.add_subplot(111)
    >>> ax.scatter(datas[:,0].flatten().A[0],datas[:,1].flatten().A[0],marker='^',s=90)
    <matplotlib.collections.PathCollection object at 0x7f8b84d70590>
    >>> ax.scatter(recon[:,0].flatten().A[0],recon[:,1].flatten().A[0],marker='o',s=50,c='red')
    <matplotlib.collections.PathCollection object at 0x7f8b84d40290>
    >>> plt.show()
    </span>

    即红色的线表示原始数据沿着这条线投影.即第一新坐标轴.


     參考:

    (1)PCA数学原理:http://www.360doc.com/content/13/1124/02/9482_331688889.shtml

  • 相关阅读:
    Tomcat部署web项目,虚拟目录,上下文(Context),WEB-INF,web.xml,servlet,404
    Android异常:唤醒锁未授权。(Caused by: java.lang.SecurityException: Neither user 10044 nor current process has android.permission.WAKE_LOCK.)
    .hiverc
    Hive安装
    搭建Kafka开发环境
    java实现Kafka的消费者示例
    java实现Kafka生产者示例
    Kafka集群部署
    kafka介绍
    Pig UDF 用户自定义函数
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7298553.html
Copyright © 2011-2022 走看看