精华内容
下载资源
问答
  • python主成分分析

    2018-05-29 10:51:00
    #主成分分析 降维 import pandas as pd #参数初始化 inputfile = '../data/principal_component.xls' outputfile = '../tmp/dimention.xls' #降维后的数据 data = pd.read_excel(inputfile, header...
    #-*- coding: utf-8 -*-
    #主成分分析 降维
    import pandas as pd
    
    #参数初始化
    inputfile = '../data/principal_component.xls'
    outputfile = '../tmp/dimention.xls' #降维后的数据
    
    data = pd.read_excel(inputfile, header = None) #读入数据
    
    from sklearn.decomposition import PCA
    
    pca = PCA(3)#选取3个主成分
    pca.fit(data)
    low_d=pca.transform(data)#用他来降低维度
    pd.DataFrame(low_d).to_excel(outputfile)
    pca.inverse_transform(low_d)#恢复降维之前的数据
    print(pca.components_) #返回模型的各个特征向量
    print(pca.explained_variance_ratio_) #返回各个成分各自的方差百分比

     

    转载于:https://www.cnblogs.com/ggzhangxiaochao/p/9103914.html

    展开全文
  • Python 主成分分析PCA

    千次阅读 2016-11-23 09:30:21
    Python 主成分分析PCA  主成分分析(PCA)是一种基于变量协方差矩阵对数据进行压缩降维、去噪的有效方法,PCA的思想是将n维特征映射到k维上(k 相关知识 介绍一个PCA的教程:A tutorial on Principal ...

    Python 主成分分析PCA

      主成分分析(PCA)是一种基于变量协方差矩阵对数据进行压缩降维、去噪的有效方法,PCA的思想是将n维特征映射到k维上(k<n),这k维特征称为主元,是旧特征的线性组合,这些线性组合最大化样本方差,尽量使新的k个特征互不相关。

    相关知识

    介绍一个PCA的教程:A tutorial on Principal Components Analysis ——Lindsay I Smith

    1.协方差 Covariance

      变量X和变量Y的协方差公式如下,协方差是描述不同变量之间的相关关系,协方差>0时说明 X和 Y是正相关关系,协方差<0时 X和Y是负相关关系,协方差为0时 X和Y相互独立。

      

      协方差的计算是针对两维的,对于n维的数据集,可以计算C(n,2)种协方差。 n维数据的协方差矩阵的定义如下:
      
          Dim(x)表示第x维。

          对于三维(x,y,z),其协方差矩阵如下,可看出协方差矩阵是一个对称矩阵(symmetrical),其对角线元素为每一维的方差:
        

    2.特征向量和特征值 

      若,则称是A的特征值,X是对应的特征向量。可以这样理解:矩阵A作用在它的特征向量X上,仅仅使得X的长度发生了变化,缩放比例就是相应的特征值。特征向量只能在方阵中找到,而且并不是所有的方阵都有特征向量,并且如果一个n*n的方阵有特征向量,那么就有n个特征向量。一个矩阵的所有特征向量是正交的,即特征向量之间的点积为0,一般情况下,会将特征向量归一化,即向量长度为1。

    3.PCA过程

      第一步,获取数据,下图中的Data为原始数据,一共有两个维度,可看出二维平面上的点。

      

      下图是Data在二维坐标平面上的散点图:

      

      第二步,减去平均值,对于Data中的每一维数据分别求平均值,并减去平均值,得到DataAdjust数据。

      第三步,计算DataAdjust的协方差矩阵

      

      第四步,计算协方差矩阵的特征向量和特征值,选取特征向量

      
       

      特征值0.490833989对应的特征向量是(-0.735178656, 0.677873399),这里的特征向量是正交的、归一化的,即长度为1。

      下图展示DataAdjust数据和特征向量的关系:

      

      正号表示预处理后的样本点,斜着的两条线就分别是正交的特征向量(由于协方差矩阵是对称的,因此其特征向量正交),特征值较大的那个特征向量是这个数据集的主要成分(principle component)。通常来说,当从协方差矩阵计算出特征向量之后,下一步就是通过特征值,对特征向量进行从大到小的排序,这将给出成分意义的顺序。成分的特征值越小,其包含的信息量也就越少,因此可以适当选择。  

      如果数据中有n维,计算出n个特征向量和特征值,选择前k个特征向量,然后最终的数据集合只有k维,取的特征向量命名为FeatureVector。 

         

      这里特征值只有两个,我们选择其中最大的那个,1.28402771,对应的特征向量是clip_image009[6]

      第五步,将样本点投影到选取的特征向量上,得到新的数据集

      假设样例数为m,特征数为n,减去均值后的样本矩阵为DataAdjust(m*n),协方差矩阵是n*n,选取的k个特征向量组成的矩阵为EigenVectors(n*k)。那么投影后的数据FinalData为

           clip_image011[4] 

      这里是FinalData(10*1) = DataAdjust(10*2矩阵)×特征向量clip_image009[7]

      得到结果为

      clip_image012[4]

      下图是FinalData根据最大特征值对应的特征向量转化回去后的数据集形式,可看出是将DataAdjust样本点分别往特征向量对应的轴上做投影:

      

      如果取的k=2,那么结果是

         clip_image014[4]

      可见,若使用了所有特征向量得到的新的数据集,转化回去之后,与原来的数据集完全一样(只是坐标轴旋转)。

    Python实现PCA

      将数据转化成前K个主成分的伪码大致如下: 

    复制代码
    '''
    减去平均数
    计算协方差矩阵
    计算协方差矩阵的特征值和特征向量
    将特征值从大到小排序
    保留最大的K个特征向量
    将数据转换到上述K各特征向量构建的新空间中
    '''
    复制代码

      代码实现如下:

    复制代码
    from numpy import *
    
    def loadDataSet(fileName, delim='\t'):
        fr = open(fileName)
        stringArr = [line.strip().split(delim) for line in fr.readlines()]
        datArr = [map(float,line) for line in stringArr]
        return mat(datArr)
    
    def pca(dataMat, topNfeat=999999):
        meanVals = mean(dataMat, axis=0)
        DataAdjust = dataMat - meanVals           #减去平均值
        covMat = cov(DataAdjust, rowvar=0)
        eigVals,eigVects = linalg.eig(mat(covMat)) #计算特征值和特征向量
        #print eigVals
        eigValInd = argsort(eigVals)
        eigValInd = eigValInd[:-(topNfeat+1):-1]   #保留最大的前K个特征值
        redEigVects = eigVects[:,eigValInd]        #对应的特征向量
        lowDDataMat = DataAdjust * redEigVects     #将数据转换到低维新空间
        reconMat = (lowDDataMat * redEigVects.T) + meanVals   #重构数据,用于调试
        return lowDDataMat, reconMat
    复制代码

      测试数据testSet.txt由1000个数据点组成。下面对数据进行降维,并用matplotlib模块将降维后的数据和原始数据一起绘制出来。

    复制代码
    import matplotlib
    import matplotlib.pyplot as plt
    
    dataMat = loadDataSet('testSet.txt')
    lowDMat, reconMat = pca(dataMat,1)
    print "shape(lowDMat): ",shape(lowDMat)
    
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(dataMat[:,0].flatten().A[0],dataMat[:,1].flatten().A[0],marker='^',s=90)
    ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0],marker='o',s=50,c='red')
    plt.show()
    复制代码

      结果如下图:

    Python环境

    1.编译环境:win8.1 + 32位 + python2.7

    2.相关模块安装:

      (1)Numpy和Scipy:numpy用于存储和处理大型矩阵,进行数值计算。scipy是基于numpy的科学和工程计算工具,用于处理多维数组向量、矩阵、图形(图形图像是像素的二维数组)、表格。下载地址:http://www.scipy.org/scipylib/download.html

      (2)Matplotlib:python的一个图形框架,用于数据绘图。win32的安装文件下载地址:http://matplotlib.org/downloads.html

      (3)Dateutil 和 Pyparsing模块:安装配置matplotlib包时需要。win32的安装文件下载地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/

    3.编译遇到问题:

      (1)提示“No module name six”,将\Python27\Lib\site-packages\scipy\lib中的six.py six.pyc six.pyo三个文件拷贝到\Python27\Lib\site-packages目录下即可。

      (2)提示 “ImportError: six 1.3 or later is required; you have 1.2.0”,说明six.py版本过低,下载最新的版本,将其中的six.py替换\Python27\Lib\site-packages中的six.py即可,下载地址:https://pypi.python.org/pypi/six/

      注:six模块是Python 2和3的兼容工具

     

    PCA可以从数据中识别其主要特征,它是通过沿着数据最大方差方向旋转坐标轴来实现的。其中的矩阵运算,求特征值、特征向量等不是很熟悉,仍需进一步学习。

    展开全文
  • 参考链接: Python 主成分分析(PCA) 原文请参考:http://www.cnblogs.com/chenbjin/p/4200790.html点击打开链接 主成分分析(PCA)是一种基于变量协方差矩阵对数据进行压缩降维、去噪的有效方法,PCA的思想是将n维...

    参考链接: Python 主成分分析(PCA)

    原文请参考:http://www.cnblogs.com/chenbjin/p/4200790.html点击打开链接 

    主成分分析(PCA)是一种基于变量协方差矩阵对数据进行压缩降维、去噪的有效方法,PCA的思想是将n维特征映射到k维上(k<n),这k维特征称为主元,是旧特征的线性组合,这些线性组合最大化样本方差,尽量使新的k个特征互不相关。 

    相关知识 

    1.协方差 Covariance 

      变量X和变量Y的协方差公式如下,协方差是描述不同变量之间的相关关系,协方差>0时说明 X和 Y是正相关关系,协方差<0时 X和Y是负相关关系,协方差为0时 X和Y相互独立。 

       

      协方差的计算是针对两维的,对于n维的数据集,可以计算C(n,2)种协方差。 n维数据的协方差矩阵的定义如下:          Dim(x)表示第x维。 

          对于三维(x,y,z),其协方差矩阵如下,可看出协方差矩阵是一个对称矩阵(symmetrical),其对角线元素为每一维的方差:      

    2.特征向量和特征值  

      若,则称是A的特征值,X是对应的特征向量。可以这样理解:矩阵A作用在它的特征向量X上,仅仅使得X的长度发生了变化,缩放比例就是相应的特征值。特征向量只能在方阵中找到,而且并不是所有的方阵都有特征向量,并且如果一个n*n的方阵有特征向量,那么就有n个特征向量。一个矩阵的所有特征向量是正交的,即特征向量之间的点积为0,一般情况下,会将特征向量归一化,即向量长度为1。 

    3.PCA过程 

      第一步,获取数据,下图中的Data为原始数据,一共有两个维度,可看出二维平面上的点。 

       

      下图是Data在二维坐标平面上的散点图: 

       

      第二步,减去平均值,对于Data中的每一维数据分别求平均值,并减去平均值,得到DataAdjust数据。 

      第三步,计算DataAdjust的协方差矩阵 

       

      第四步,计算协方差矩阵的特征向量和特征值,选取特征向量 

           

      特征值0.490833989对应的特征向量是(-0.735178656, 0.677873399),这里的特征向量是正交的、归一化的,即长度为1。 

      下图展示DataAdjust数据和特征向量的关系: 

       

      正号表示预处理后的样本点,斜着的两条线就分别是正交的特征向量(由于协方差矩阵是对称的,因此其特征向量正交),特征值较大的那个特征向量是这个数据集的主要成分(principle component)。通常来说,当从协方差矩阵计算出特征向量之后,下一步就是通过特征值,对特征向量进行从大到小的排序,这将给出成分意义的顺序。成分的特征值越小,其包含的信息量也就越少,因此可以适当选择。   

      如果数据中有n维,计算出n个特征向量和特征值,选择前k个特征向量,然后最终的数据集合只有k维,取的特征向量命名为FeatureVector。  

          

      这里特征值只有两个,我们选择其中最大的那个,1.28402771,对应的特征向量是。 

      第五步,将样本点投影到选取的特征向量上,得到新的数据集 

      假设样例数为m,特征数为n,减去均值后的样本矩阵为DataAdjust(m*n),协方差矩阵是n*n,选取的k个特征向量组成的矩阵为EigenVectors(n*k)。那么投影后的数据FinalData为 

             

      这里是FinalData(10*1) = DataAdjust(10*2矩阵)×特征向量 

      得到结果为 

       

      下图是FinalData根据最大特征值对应的特征向量转化回去后的数据集形式,可看出是将DataAdjust样本点分别往特征向量对应的轴上做投影: 

       

      如果取的k=2,那么结果是 

          

      可见,若使用了所有特征向量得到的新的数据集,转化回去之后,与原来的数据集完全一样(只是坐标轴旋转)。

    展开全文
  • python主成分分析(PCA)

    万次阅读 多人点赞 2018-12-10 13:32:34
    主成分分析(Principal Component Analysis,PCA), 是一种统计方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。 上完陈恩红老师的《机器学习与知识发现》和...

    一、PCA简介

    1. 相关背景

    主成分分析(Principal Component Analysis,PCA), 是一种统计方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。

    上完陈恩红老师的《机器学习与知识发现》和季海波老师的《矩阵代数》两门课之后,颇有体会。最近在做主成分分析和奇异值分解方面的项目,所以记录一下心得体会。

    在许多领域的研究与应用中,往往需要对反映事物的多个变量进行大量的观测,收集大量数据以便进行分析寻找规律。多变量大样本无疑会为研究和应用提供了丰富的信息,但也在一定程度上增加了数据采集的工作量,更重要的是在多数情况下,许多变量之间可能存在相关性,从而增加了问题分析的复杂性,同时对分析带来不便。如果分别对每个指标进行分析,分析往往是孤立的,而不是综合的。盲目减少指标会损失很多信息,容易产生错误的结论。

    因此需要找到一个合理的方法,在减少需要分析的指标同时,尽量减少原指标包含信息的损失,以达到对所收集数据进行全面分析的目的。由于各变量间存在一定的相关关系,因此有可能用较少的综合指标分别综合存在于各变量中的各类信息。主成分分析与因子分析就属于这类降维的方法。

    2. 问题描述

    下表1是某些学生的语文、数学、物理、化学成绩统计:

           首先,假设这些科目成绩不相关,也就是说某一科目考多少分与其他科目没有关系。那么一眼就能看出来,数学、物理、化学这三门课的成绩构成了这组数据的主成分(很显然,数学作为第一主成分,因为数学成绩拉的最开)。为什么一眼能看出来?因为坐标轴选对了!下面再看一组学生的数学、物理、化学、语文、历史、英语成绩统计,见表2,还能不能一眼看出来:

    数据太多了,以至于看起来有些凌乱!也就是说,无法直接看出这组数据的主成分,因为在坐标系下这组数据分布的很散乱。究其原因,是因为无法拨开遮住肉眼的迷雾~如果把这些数据在相应的空间中表示出来,也许你就能换一个观察角度找出主成分。如下图1所示:

          但是,对于更高维的数据,能想象其分布吗?就算能描述分布,如何精确地找到这些主成分的轴?如何衡量你提取的主成分到底占了整个数据的多少信息?所以,我们就要用到主成分分析的处理方法。

    3. 数据降维

    为了说明什么是数据的主成分,先从数据降维说起。数据降维是怎么回事儿?假设三维空间中有一系列点,这些点分布在一个过原点的斜面上,如果你用自然坐标系x,y,z这三个轴来表示这组数据的话,需要使用三个维度,而事实上,这些点的分布仅仅是在一个二维的平面上,那么,问题出在哪里?如果你再仔细想想,能不能把x,y,z坐标系旋转一下,使数据所在平面与x,y平面重合?这就对了!如果把旋转后的坐标系记为x’,y’,z’,那么这组数据的表示只用x’和y’两个维度表示即可!当然了,如果想恢复原来的表示方式,那就得把这两个坐标之间的变换矩阵存下来。这样就能把数据维度降下来了!但是,我们要看到这个过程的本质,如果把这些数据按行或者按列排成一个矩阵,那么这个矩阵的秩就是2!这些数据之间是有相关性的,这些数据构成的过原点的向量的最大线性无关组包含2个向量,这就是为什么一开始就假设平面过原点的原因!那么如果平面不过原点呢?这就是数据中心化的缘故!将坐标原点平移到数据中心,这样原本不相关的数据在这个新坐标系中就有相关性了!有趣的是,三点一定共面,也就是说三维空间中任意三点中心化后都是线性相关的,一般来讲n维空间中的n个点一定能在一个n-1维子空间中分析!

    上一段文字中,认为把数据降维后并没有丢弃任何东西,因为这些数据在平面以外的第三个维度的分量都为0。现在,假设这些数据在z’轴有一个很小的抖动,那么我们仍然用上述的二维表示这些数据,理由是我们可以认为这两个轴的信息是数据的主成分,而这些信息对于我们的分析已经足够了,z’轴上的抖动很有可能是噪声,也就是说本来这组数据是有相关性的,噪声的引入,导致了数据不完全相关,但是,这些数据在z’轴上的分布与原点构成的夹角非常小,也就是说在z’轴上有很大的相关性,综合这些考虑,就可以认为数据在x’,y’ 轴上的投影构成了数据的主成分!

    课堂上老师谈到的特征选择的问题,其实就是要剔除的特征主要是和类标签无关的特征。而这里的特征很多是和类标签有关的,但里面存在噪声或者冗余。在这种情况下,需要一种特征降维的方法来减少特征数,减少噪音和冗余,减少过度拟合的可能性。

    PCA的思想是将n维特征映射到k维上(k<n),这k维是全新的正交特征。这k维特征称为主成分,是重新构造出来的k维特征,而不是简单地从n维特征中去除其余n-k维特征。

    二、PCA实例

    现在假设有一组数据如下:

          行代表了样例,列代表特征,这里有10个样例,每个样例两个特征。可以这样认为,有10篇文档,x是10篇文档中“learn”出现的TF-IDF,y是10篇文档中“study”出现的TF-IDF。

    第一步,中心化(均值化)目的是为了方便后面求解。从协方差矩阵的定义看: Σ=E{(x-E(x)) * (x-E(x))T},PCA的第一步就是要去均值化。求分别求x和y的平均值,然后对于所有的样例,都减去对应的均值。这里x的均值是1.81,y的均值是1.91,那么一个样例减去均值后即为(0.69,0.49),得到

         第二步,求特征协方差矩阵,如果数据是3维,那么协方差矩阵是

         这里只有x和y,求解得

    对角线上分别是x和y的方差,非对角线上是协方差。协方差是衡量两个变量同时变化的变化程度。协方差大于0表示x和y若一个增,另一个也增;小于0表示一个增,一个减。如果x和y是统计独立的,那么二者之间的协方差就是0;但是协方差是0,并不能说明x和y是独立的。协方差绝对值越大,两者对彼此的影响越大,反之越小。协方差是没有单位的量,因此,如果同样的两个变量所采用的量纲发生变化,它们的协方差也会产生树枝上的变化。

    第三步,求协方差的特征值和特征向量,得到

          上面是两个特征值,下面是对应的特征向量,特征值0.0490833989对应特征向量为,这里的特征向量都归一化为单位向量。

    第四步,将特征值按照从大到小的顺序排序,选择其中最大的k个,然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。

    这里特征值只有两个,我们选择其中最大的那个,这里是1.28402771,对应的特征向量是(-0.677873399, -0.735178656)T。

    第五步,将样本点投影到选取的特征向量上。假设样例数为m,特征数为n,减去均值后的样本矩阵为DataAdjust(m*n),协方差矩阵是n*n,选取的k个特征向量组成的矩阵为EigenVectors(n*k)。那么投影后的数据FinalData为

    FinalData(10*1) = DataAdjust(10*2矩阵) x 特征向量(-0.677873399, -0.735178656)T

    得到的结果是

          这样,就将原始样例的n维特征变成了k维,这k维就是原始特征在k维上的投影。

    上面的数据可以认为是learn和study特征融合为一个新的特征叫做LS特征,该特征基本上代表了这两个特征。上述过程如下图2描述:

    正号表示预处理后的样本点,斜着的两条线就分别是正交的特征向量(由于协方差矩阵是对称的,因此其特征向量正交),最后一步的矩阵乘法就是将原始样本点分别往特征向量对应的轴上做投影。

    整个PCA过程貌似及其简单,就是求协方差的特征值和特征向量,然后做数据转换。但是有没有觉得很神奇,为什么求协方差的特征向量就是最理想的k维向量?其背后隐藏的意义是什么?整个PCA的意义是什么?

    三、PCA推导

    先看下面这幅图:

    在第一部分中,我们举了一个学生成绩的例子,里面的数据点是六维的,即每个观测值是6维空间中的一个点。我们希望将6维空间用低维空间表示。

    先假定只有二维,即只有两个变量,它们由横坐标和纵坐标所代表;因此每个观测值都有相应于这两个坐标轴的两个坐标值;如果这些数据形成一个椭圆形状的点阵,那么这个椭圆有一个长轴和一个短轴。在短轴方向上,数据变化很少;在极端的情况,短轴如果退化成一点,那只有在长轴的方向才能够解释这些点的变化了;这样,由二维到一维的降维就自然完成了。

    上图中,u1就是主成分方向,然后在二维空间中取和u1方向正交的方向,就是u2的方向。则n个数据在u1轴的离散程度最大(方差最大),数据在u1上的投影代表了原始数据的绝大部分信息,即使不考虑u2,信息损失也不多。而且,u1、u2不相关。只考虑u1时,二维降为一维。

    椭圆的长短轴相差得越大,降维也越有道理。

    1. 最大方差理论

    在信号处理中认为信号具有较大的方差,噪声有较小的方差,信噪比就是信号与噪声的方差比,越大越好。如前面的图,样本在u1上的投影方差较大,在u2上的投影方差较小,那么可认为u2上的投影是由噪声引起的。

    因此我们认为,最好的k维特征是将n维样本点转换为k维后,每一维上的样本方差都很大。

    比如我们将下图中的5个点投影到某一维上,这里用一条过原点的直线表示(数据已经中心化):

    假设我们选择两条不同的直线做投影,那么左右两条中哪个好呢?根据我们之前的方差最大化理论,左边的好,因为投影后的样本点之间方差最大(也可以说是投影的绝对值之和最大)。

    计算投影的方法见下图5:

     

    图中,红色点表示样例,蓝色点表示在u上的投影,u是直线的斜率也是直线的方向向量,而且是单位向量。蓝色点是在u上的投影点,离原点的距离是<x,u>(即xTu或者uTx)。

    2. 最小二乘法

    我们使用最小二乘法来确定各个主轴(主成分)的方向。

    对给定的一组数据(下面的阐述中,向量一般均指列向量):

           

        其数据中心位于:

            

        数据中心化(将坐标原点移到样本点的中心点):

    中心化后的数据在第一主轴u1方向上分布散的最开,也就是说在u1方向上的投影的绝对值之和最大(也可以说方差最大),计算投影的方法上面已经阐述,就是将x与u1做内积,由于只需要求u1的方向,所以设u1也是单位向量。

    在这里,也就是最大化下式:

    由矩阵代数相关知识可知,可以对绝对值符号项进行平方处理,比较方便。所以进而就是最大化下式:

    两个向量做内积,可以转化成矩阵乘法:

    所以目标函数可以表示为:

    括号里面就是矩阵乘法表示向量内积,由于列向量转置以后是行向量,行向量乘以列向量得到一个数,一个数的转置还是其本身,所以又可以将目标函数化为:

    去括号:

    又由于u1和i无关,可以拿到求和符外面,上式化简为:

    学过矩阵代数的同学可能已经发现了,上式括号里面求和后的结果,就相当于一个大矩阵乘以自身的转置,其中,这个大矩阵的形式如下:

    X矩阵的第i列就是xi

    于是有:

    所以目标函数最终化为:

    其中的就是一个二次型,

    我们假设的某一特征值为λ,对应的特征向量为ξ,有

    所以是半正定的对称矩阵,即是半正定阵的二次型,由矩阵代数知识得出,目标函数存在最大值!

    下面我们求解最大值、取得最大值时u1的方向这两个问题。

    先解决第一个问题,对于向量x的二范数平方为:

    同样,目标函数也可以表示成映射后的向量的二范数平方:

    把二次型化成一个范数的形式,由于u1取单位向量,最大化目标函数的基本问题也就转化为:对一个矩阵,它对一个向量做变换,变换前后的向量的模长伸缩尺度如何才能最大?我们有矩阵代数中的定理知,向量经矩阵映射前后的向量长度之比的最大值就是这个矩阵的最大奇异值,即:

    式中,是矩阵A的最大奇异值(亦是矩阵A的二范数),它等于(或)的最大特征值开平方。

    针对本问题来说,是半正定对称阵,也就意味着它的特征值都大于等于0,且不同特征值对应的特征向量是正交的,构成所在空间的一组单位正交基。

    再解决第二个问题,对一般情况,设对称阵的n个特征值分别为:

    相应的单位特征向量为:

    任取一个向量x,用特征向量构成的空间中的这组基表示为:

    则:

    所以:

    针对第二个问题,我们取上式中的,目标函数取得最大值,也就是的最大特征值时,对应的特征向量的方向,就是第一主成分u1的方向!(第二主成分的方向为的第二大特征值对应的特征向量的方向,以此类推)。

    证明完毕。

     

    3.拉格朗日乘法求主轴方向:

    求目标函数最大值值也可以根据拉格朗日乘法:

    目标函数为:Max(u.T*S*)其中S为上面的矩阵X*X.T

    约束条件为:u.T*u=1  (前面假设u为单位向量)

    上面可知目标函数的最大值实际上就是求最大特征值.

     

    主成分所占整个信息的百分比可用下式计算:

    式中分母为所有奇异值平方和,分子为所选取的前k大奇异值平方和。

    有些研究工作表明,所选的主轴总长度占所有主轴长度之和的大约85% 即可,其实,这只是一个大体的说法,具体选多少个,要看实际情况而定。

     

    4.结论

     

    一般的,如果我们有M个N维向量,想将其变换为由R个N维向量表示的新空间中,那么首先将R个基按行组成矩阵A,然后将向量按列组成矩阵B,那么两矩阵的乘积AB就是变换结果,其中AB的第m列为A中第m列变换后的结果。

    对应数学表达:

    其中pipi是一个行向量,表示第i个基,ajaj是一个列向量,表示第j个原始数据记录。

    上述分析同时给矩阵相乘找到了一种物理解释:两个矩阵相乘的意义是将右边矩阵中的每一列列向量变换到左边矩阵中每一行行向量为基所表示的空间中去。这种操作便是降维。

    补充知识:矩阵的乘法实际上就是在不同基上的投影。

     

     

    B-基的概念

    给出下面这个向量:

    在代数表示方面,我们经常用线段终点的点坐标表示向量,例如上面的向量可以表示为(3,2),这是我们再熟悉不过的向量表示。

    不过我们常常忽略,只有一个(3,2)本身是不能够精确表示一个向量的。我们仔细看一下,这里的3实际表示的是向量在x轴上的投影值是3,在y轴上的投影值是2。也就是说我们其实隐式引入了一个定义:以x轴和y轴上正方向长度为1的向量为标准。那么一个向量(3,2)实际是说在x轴投影为3而y轴的投影为2。注意投影是一个矢量,所以可以为负。

    更正式的说,向量(x,y)实际上表示线性组合:

    x(1,0)T+y(0,1)Tx(1,0)T+y(0,1)T

    不难证明所有二维向量都可以表示为这样的线性组合。此处(1,0)和(0,1)叫做二维空间中的一组基。

     

     

     

    同样我们可以利用基变换的矩阵表示进行求解:

    再举一例:(1,1),(2,2),(3,3),想变换到刚才那组基上,则可以这样表示:

    于是一组向量的基变换被干净的表示为矩阵的相乘。

    推广成一般性结论:

    一般的,如果我们有M个N维向量,想将其变换为由R个N维向量表示的新空间中,那么首先将R个基按行组成矩阵A,然后将向量按列组成矩阵B,那么两矩阵的乘积AB就是变换结果,其中AB的第m列为A中第m列变换后的结果。

    对应数学表达:

    其中pipi是一个行向量,表示第i个基,ajaj是一个列向量,表示第j个原始数据记录。

    上述分析同时给矩阵相乘找到了一种物理解释:两个矩阵相乘的意义是将右边矩阵中的每一列列向量变换到左边矩阵中每一行行向量为基所表示的空间中去。这种操作便是降维。

    关于最优基的选择就是上面求第一主成分的事情了。

    5.意义

    PCA将n个特征降维到k个,可以用来进行数据压缩,例如100维的向量最后可以用10维来表示,那么压缩率为90%。同样图像处理领域的KL变换使用PCA做图像压缩,人脸检测和匹配。比如如下摘自另一篇博客上的Matlab实验结果:

    可见测试样本为人脸的样本的重建误差显然小于非人脸的重建误差。

     

    from:http://blog.jobbole.com/109015/

            https://www.cnblogs.com/xingshansi/p/6445625.html

    展开全文
  • 矩阵的主成分分析与基于奇异值的主成分分析 from sklearn.preprocessing import scale def _6pca2(X :np.array) -&gt;tuple : ''' 主成分分析。内部已标准化。后续降维可选取返回的特征向量与原数据相乘。 ...
  • # -*- coding: utf-8 -*- ""...#主成分分析 降维 import pandas as pd #参数初始化 inputfile = 'H:/.../data/principal_component.xls' outputfile = 'H:/.../data/dimention_reducte...
  • python主成分分析PCA

    千次阅读 2018-07-06 11:43:11
    主成分PCA分析的基本步骤: · 对数据进行归一化处理(代码中并非这么做的,而是直接减去均值) · 计算归一化后的数据集的协方差矩阵 · 计算协方差矩阵的特征值和特征向量 · 保留最重要的k个特征(通常k要...
  • python 主成分分析PCA

    2018-06-25 22:46:05
    lowDDataMat=meanRemoved*redEigVects #将原始数据投影到主成分上得到新的低维数据lowDDataMat reconMat=(lowDDataMat*redEigVects.T)+meanVals #得到重构数据reconMat pp=eigVals/sum(eigVals) return ...
  • 在 z1 维度上,样本间表现出了较大的差异性,即样本的方差较大,因此,特征z1可以看作样本的一个主成分;而若在 z2 维度上投影,样本间表现的差异性在这个维度上会少很多。 二、相关库 from sklearn.decomposition ...
  • python主成分分析实战案例

    千次阅读 2015-04-29 14:49:18
    PCA主成分分析主要用于数据降维。由一系列特征组成的多维向量,其中某些元素本身没有区分性,或者彼此区分不大。此时,如果用它做特征区分,相似元素贡献会比较少。我们目的是找到那些变化大的元素,即方差较大的维...
  • Python PCA主成分分析算法

    千次阅读 热门讨论 2016-11-14 23:08:56
    Python主成分分析算法的作用是提取样本的主要特征向量,从而实现数据降维的目的。 # -*- coding: utf-8 -*- """ Created on Sun Feb 28 10:04:26 2016 PCA source code @author: liudiwei """ import ...
  • Python_主成分分析

    千次阅读 2016-10-15 14:31:34
    Python实现简单主成分分析
  • Python 实现主成分分析

    2018-08-08 11:00:00
    Python 实现主成分分析 主成分分析(Principal Component Analysis,PCA)是最常用的一种降维方法,通常用于高维数据集的探索与可视化,还可以用作数据压缩和预处理等。 矩阵的主成分就是其协方差矩阵对应的特征...
  • Python主成分分析

    2020-12-22 17:03:09
     了解主成分分析、因子分析、判别分析、聚类分析的原理背景  掌握SAS语言进行多变量分析过程(princomp过程和factor过程)  掌握SAS语言进行判别分析 (discrim过程)  掌握SAS语言进行聚类分析(cluster过程...
  • python实现主成分分析(PCA)python应用实例:如何用python实现主成分分析背景iris数据集简介算法的主要步骤代码实现查看各特征值的贡献率 python应用实例:如何用python实现主成分分析 主成分分析(Principal ...
  • python-主成分分析实现

    千次阅读 2020-09-12 18:04:17
    在理论的基础上,在python中实现主成分分析。 使用鸢尾花数据作为例子进行。首先导入数据: import numpy as np import pandas as pd df=pd.read_csv(r'iris.data') print(df.shape) df.columns=['sepal_len','sepal...
  • python实现主成分分析(PCA) 前言: 主成分分析主要是用于降维,减少样本的特征量,其核心思想是将样本数据映射到最重要的方向,而最重要的方向就是方差最大的方向。关于主成分分析详细的理论知识,请至我的这篇...
  • python pca主成分Data is the fuel of big data era, and we can get insightful information from data. However, tons of data in a high number of dimensions may cover valuable knowledge. Therefore, data ...
  • Python数据分析与机器学习-PCA主成分分析 Python数据分析与机器学习-PCA主成分分析
  • python进行主成分分析

    2019-11-18 17:51:33
    data = pd.read_csv('C:/Users/admin/Desktop/2019.10.05/算法/主成分分析/data.csv') # 读取训练数据 csv_data=csv_data.drop('序号', axis=1) #去掉序号那一列 corr = csv_data.corr() #求变量之间的相关系数,...
  • 转载文章:Python实现主成分分析(PCA)降维:原理及实例分析 简介 降维是由一些问题带来的: 可以缓解由维度诅咒(高维)带来的问题; 可以用来压缩数据,将损失数据最小化; 可以将高维数据降到低维进行可视化。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,280
精华内容 512
关键字:

python主成分分析

python 订阅