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

    千次阅读 热门讨论 2020-04-29 23:03:41
    主成分分析法代码实现 之间我介绍过主成分份分析法,这里给出代码实现 from sklearn.decomposition import PCA import pandas as pd import os path="C:/Users/Administrator/Desktop/o25mso/homework/AMZN.csv"#...

    主成分分析法代码实现

    之间我介绍过主成分份分析法,这里给出代码实现

    from sklearn.decomposition import PCA
    import pandas as pd
    import os
    
    path="C:/Users/Administrator/Desktop/o25mso/homework/AMZN.csv"#存放文件路径,这个文件在我的资源上传里
    
    df=pd.read_csv(path)#读取文件
    
    pca=PCA()#创建对象
    df=(df.iloc[:,2:]-df.iloc[:,2:].mean())/df.iloc[:,2:].std()#对数据进行中心化处理
    #print(df)
    pca.fit(df)
    print(pca.components_)#返回模型的各个特征向量
    print(pca.explained_variance_ratio_)#返回各个成分各自的方差百分比
    pca=PCA(2)#设置转化主成分个数两个
    pca.fit(df)
    low_d=pca.transform(df)
    print(low_d)#返回降维后的数据
    

    运行结果:
    在这里插入图片描述
    上图的结果分别为特征向量,和主成分所占的方差百分比,可以发现第一个和第二个主成分占的方差百分比比较多,其他几个特别小,所以这里我们取两个主成分进行降维,对应上诉代码。

    好的,代码很简单,原理并没那么简单,如果不了解原理可以多看看这方面的理论知识。

    展开全文
  • 相关分析 主成分分析 python源码
  • PCA主成分分析python实现

    万次阅读 多人点赞 2018-10-13 14:32:50
    PCA(principle component analysis) ,主成分分析,主要是用来降低数据集的维度,然后挑选出主要的特征。原理简单,实现也简单。关于原理公式的推导,本文不会涉及,你可以参考下面的参考文献,也可以去Wikipedia...

    Github源码:https://github.com/csuldw/MachineLearning/tree/master/PCA

     

    PCA(principle component analysis) ,主成分分析,主要是用来降低数据集的维度,然后挑选出主要的特征。原理简单,实现也简单。关于原理公式的推导,本文不会涉及,你可以参考下面的参考文献,也可以去Wikipedia,这里主要关注实现,算是锻炼一下自己。

    本来是在复习LDA的,然后就看到了PCA,就跟着下面这篇文章的步骤,把PCA用Python实现了一遍,具体的思想可以参考这篇文章,讲的通俗易懂,主要是有个实例参考,值得拥有!

    下面引用的是http://www.cnblogs.com/jerrylead/archive/2011/04/18/2020209.html中关于主成分分析的讲解

     

    主成分分析(Principal components analysis)-最大方差解释

         在这一篇之前的内容是《Factor Analysis》,由于非常理论,打算学完整个课程后再写。在写这篇之前,我阅读了PCA、SVD和LDA。这几个模型相近,却都有自己的特点。本篇打算先介绍PCA,至于他们之间的关系,只能是边学边体会了。PCA以前也叫做Principal factor analysis。

    1. 问题

         真实的训练数据总是存在各种各样的问题:

    1、 比如拿到一个汽车的样本,里面既有以“千米/每小时”度量的最大速度特征,也有“英里/小时”的最大速度特征,显然这两个特征有一个多余。

    2、 拿到一个数学系的本科生期末考试成绩单,里面有三列,一列是对数学的兴趣程度,一列是复习时间,还有一列是考试成绩。我们知道要学好数学,需要有浓厚的兴趣,所以第二项与第一项强相关,第三项和第二项也是强相关。那是不是可以合并第一项和第二项呢?

    3、 拿到一个样本,特征非常多,而样例特别少,这样用回归去直接拟合非常困难,容易过度拟合。比如北京的房价:假设房子的特征是(大小、位置、朝向、是否学区房、建造年代、是否二手、层数、所在层数),搞了这么多特征,结果只有不到十个房子的样例。要拟合房子特征->房价的这么多特征,就会造成过度拟合。

    4、 这个与第二个有点类似,假设在IR中我们建立的文档-词项矩阵中,有两个词项为“learn”和“study”,在传统的向量空间模型中,认为两者独立。然而从语义的角度来讲,两者是相似的,而且两者出现频率也类似,是不是可以合成为一个特征呢?

    5、 在信号传输过程中,由于信道不是理想的,信道另一端收到的信号会有噪音扰动,那么怎么滤去这些噪音呢?

         回顾我们之前介绍的《模型选择和规则化》,里面谈到的特征选择的问题。但在那篇中要剔除的特征主要是和类标签无关的特征。比如“学生的名字”就和他的“成绩”无关,使用的是互信息的方法。

         而这里的特征很多是和类标签有关的,但里面存在噪声或者冗余。在这种情况下,需要一种特征降维的方法来减少特征数,减少噪音和冗余,减少过度拟合的可能性。

         下面探讨一种称作主成分分析(PCA)的方法来解决部分上述问题。PCA的思想是将n维特征映射到k维上(k<n),这k维是全新的正交特征。这k维特征称为主元,是重新构造出来的k维特征,而不是简单地从n维特征中去除其余n-k维特征。

    2. PCA计算过程

         首先介绍PCA的计算过程:

         假设我们得到的2维数据如下:

         clip_image001[4]

         行代表了样例,列代表特征,这里有10个样例,每个样例两个特征。可以这样认为,有10篇文档,x是10篇文档中“learn”出现的TF-IDF,y是10篇文档中“study”出现的TF-IDF。也可以认为有10辆汽车,x是千米/小时的速度,y是英里/小时的速度,等等。

         第一步分别求x和y的平均值,然后对于所有的样例,都减去对应的均值。这里x的均值是1.81,y的均值是1.91,那么一个样例减去均值后即为(0.69,0.49),得到

         clip_image002[4]

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

         clip_image003[4]

         这里只有x和y,求解得

         clip_image004[4]

         对角线上分别是x和y的方差,非对角线上是协方差。协方差大于0表示x和y若有一个增,另一个也增;小于0表示一个增,一个减;协方差为0时,两者独立。协方差绝对值越大,两者对彼此的影响越大,反之越小。

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

         clip_image005[4]

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

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

         这里特征值只有两个,我们选择其中最大的那个,这里是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]

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

         上面的数据可以认为是learn和study特征融合为一个新的特征叫做LS特征,该特征基本上代表了这两个特征。

         上述过程有个图描述:

         clip_image013[4]

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

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

         clip_image014[4]

         这就是经过PCA处理后的样本数据,水平轴(上面举例为LS特征)基本上可以代表全部样本点。整个过程看起来就像将坐标系做了旋转,当然二维可以图形化表示,高维就不行了。上面的如果k=1,那么只会留下这里的水平轴,轴上是所有点在该轴的投影。

         这样PCA的过程基本结束。在第一步减均值之后,其实应该还有一步对特征做方差归一化。比如一个特征是汽车速度(0到100),一个是汽车的座位数(2到6),显然第二个的方差比第一个小。因此,如果样本特征中存在这种情况,那么在第一步之后,求每个特征的标准差clip_image016[6],然后对每个样例在该特征下的数据除以clip_image016[7]

         归纳一下,使用我们之前熟悉的表示方法,在求协方差之前的步骤是:

         clip_image017[4]

         其中clip_image019[6]是样例,共m个,每个样例n个特征,也就是说clip_image019[7]是n维向量。clip_image021[4]是第i个样例的第j个特征。clip_image023[4]是样例均值。clip_image025[4]是第j个特征的标准差。

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

    3. PCA理论基础

         要解释为什么协方差矩阵的特征向量就是k维理想特征,我看到的有三个理论:分别是最大方差理论、最小错误理论和坐标轴相关度理论。这里简单探讨前两种,最后一种在讨论PCA意义时简单概述。

    3.1 最大方差理论

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

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

         比如下图有5个样本点:(已经做过预处理,均值为0,特征方差归一)

         clip_image026[4]

         下面将样本投影到某一维上,这里用一条过原点的直线表示(前处理的过程实质是将原点移到样本点的中心点)。

         clip_image028[4]

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

         这里先解释一下投影的概念:

         QQ截图未命名

         红色点表示样例clip_image037[14],蓝色点表示clip_image037[15]在u上的投影,u是直线的斜率也是直线的方向向量,而且是单位向量。蓝色点是clip_image037[16]在u上的投影点,离原点的距离是clip_image039[4](即clip_image030[4]或者clip_image041[4])由于这些样本点(样例)的每一维特征均值都为0,因此投影到u上的样本点(只有一个到原点的距离值)的均值仍然是0。

         回到上面左右图中的左图,我们要求的是最佳的u,使得投影后的样本点方差最大。

         由于投影后均值为0,因此方差为:

         clip_image042[4]

         中间那部分很熟悉啊,不就是样本特征的协方差矩阵么(clip_image037[17]的均值为0,一般协方差矩阵都除以m-1,这里用m)。

         用clip_image044[10]来表示clip_image046[4]clip_image048[6]表示clip_image050[4],那么上式写作

         clip_image052[4] 

         由于u是单位向量,即clip_image054[4],上式两边都左乘u得,clip_image056[4]

         即clip_image058[4]

         We got it!clip_image044[11]就是clip_image048[7]的特征值,u是特征向量。最佳的投影直线是特征值clip_image044[12]最大时对应的特征向量,其次是clip_image044[13]第二大对应的特征向量,依次类推。

         因此,我们只需要对协方差矩阵进行特征值分解,得到的前k大特征值对应的特征向量就是最佳的k维新特征,而且这k维新特征是正交的。得到前k个u以后,样例clip_image037[18]通过以下变换可以得到新的样本。

         clip_image059[4]

         其中的第j维就是clip_image037[19]clip_image061[4]上的投影。

         通过选取最大的k个u,使得方差较小的特征(如噪声)被丢弃。

         这是其中一种对PCA的解释,第二种是错误最小化,放在下一篇介绍。

    PCA思想

     

    主要思想:移动坐标轴,将n维特征映射到k维上(kn),这k维是全新的正交特征。这k维特征称为主元,是重新构造出来的k维特征,而不是简单地从n维特征中去除其余n-k维特征。

    说到PCA难免会提到LDA(linear discriminate analysis,线性判别分析),以及FA(factor analysis,因子分析)。关于LDA,打算有时间也用代码实现一遍,下面给出它的主要思想。

    LDA思想:最大类间距离,最小类内距离。简而言之,第一,为了实现投影后的两个类别的距离较远,用映射后两个类别的均值差的绝对值来度量。第二,为了实现投影后,每个类内部数据点比较聚集,用投影后每个类别的方差来度量。

    三者的描述如下

    以下内容引自 Wikipedia- Linear discriminant analysis

    LDA is also closely related to principal component analysis (PCA) and factor analysis in that they both look for linear combinations of variables which best explain the data.[4] LDA explicitly attempts to model the difference between the classes of data. PCA on the other hand does not take into account any difference in class, and factor analysis builds the feature combinations based on differences rather than similarities. Discriminant analysis is also different from factor analysis in that it is not an interdependence technique: a distinction between independent variables and dependent variables (also called criterion variables) must be made.

    区别:PCA选择样本点投影具有最大方差的方向,LDA选择分类性能最好的方向。

    好了,下面来看下实现源码!

    基本步骤

    基本步骤:

    • 对数据进行归一化处理(代码中并非这么做的,而是直接减去均值)
    • 计算归一化后的数据集的协方差矩阵
    • 计算协方差矩阵的特征值和特征向量
    • 保留最重要的k个特征(通常k要小于n),也可以自己制定,也可以选择一个阈值,然后通过前k个特征值之和减去后面n-k个特征值之和大于这个阈值,则选择这个k
    • 找出k个特征值对应的特征向量
    • 将m * n的数据集乘以k个n维的特征向量的特征向量(n * k),得到最后降维的数据。

    其实PCA的本质就是对角化协方差矩阵。有必要解释下为什么将特征值按从大到小排序后再选。首先,要明白特征值表示的是什么?在线性代数里面我们求过无数次了,那么它具体有什么意义呢?对一个n*n的对称矩阵进行分解,我们可以求出它的特征值和特征向量,就会产生n个n维的正交基,每个正交基会对应一个特征值。然后把矩阵投影到这N个基上,此时特征值的模就表示矩阵在该基的投影长度。特征值越大,说明矩阵在对应的特征向量上的方差越大,样本点越离散,越容易区分,信息量也就越多。因此,特征值最大的对应的特征向量方向上所包含的信息量就越多,如果某几个特征值很小,那么就说明在该方向的信息量非常少,我们就可以删除小特征值对应方向的数据,只保留大特征值方向对应的数据,这样做以后数据量减小,但有用的信息量都保留下来了。PCA就是这个原理。

    源码实现

    1.首先引入numpy,由于测试中用到了pandas和matplotlib,所以这里一并加载

     
    1. import numpy as np

    2. import pandas as pd

    3. import matplotlib.pyplot as plt

    2.定义一个均值函数

     
    1. #计算均值,要求输入数据为numpy的矩阵格式,行表示样本数,列表示特征

    2. def meanX(dataX):

    3. return np.mean(dataX,axis=0)#axis=0表示按照列来求均值,如果输入list,则axis=1

    3.编写pca方法,具体解释参考注释

    1. """

    2. 参数:

    3. - XMat:传入的是一个numpy的矩阵格式,行表示样本数,列表示特征

    4. - k:表示取前k个特征值对应的特征向量

    5. 返回值:

    6. - finalData:参数一指的是返回的低维矩阵,对应于输入参数二

    7. - reconData:参数二对应的是移动坐标轴后的矩阵

    8. """

    9. def pca(XMat, k):

    10. average = meanX(XMat)

    11. m, n = np.shape(XMat)

    12. data_adjust = []

    13. avgs = np.tile(average, (m, 1))

    14. data_adjust = XMat - avgs

    15. covX = np.cov(data_adjust.T) #计算协方差矩阵

    16. featValue, featVec= np.linalg.eig(covX) #求解协方差矩阵的特征值和特征向量

    17. index = np.argsort(-featValue) #按照featValue进行从大到小排序

    18. finalData = []

    19. if k > n:

    20. print "k must lower than feature number"

    21. return

    22. else:

    23. #注意特征向量时列向量,而numpy的二维矩阵(数组)a[m][n]中,a[1]表示第1行值

    24. selectVec = np.matrix(featVec.T[index[:k]]) #所以这里需要进行转置

    25. finalData = data_adjust * selectVec.T

    26. reconData = (finalData * selectVec) + average

    27. return finalData, reconData

    4.编写一个加载数据集的函数

    1. #输入文件的每行数据都以\t隔开

    2. def loaddata(datafile):

    3. return np.array(pd.read_csv(datafile,sep="\t",header=-1)).astype(np.float)

    5.可视化结果

    因为我将维数k指定为2,所以可以使用下面的函数将其绘制出来:

    1. def plotBestFit(data1, data2):

    2. dataArr1 = np.array(data1)

    3. dataArr2 = np.array(data2)

    4.  
    5. m = np.shape(dataArr1)[0]

    6. axis_x1 = []

    7. axis_y1 = []

    8. axis_x2 = []

    9. axis_y2 = []

    10. for i in range(m):

    11. axis_x1.append(dataArr1[i,0])

    12. axis_y1.append(dataArr1[i,1])

    13. axis_x2.append(dataArr2[i,0])

    14. axis_y2.append(dataArr2[i,1])

    15. fig = plt.figure()

    16. ax = fig.add_subplot(111)

    17. ax.scatter(axis_x1, axis_y1, s=50, c='red', marker='s')

    18. ax.scatter(axis_x2, axis_y2, s=50, c='blue')

    19. plt.xlabel('x1'); plt.ylabel('x2');

    20. plt.savefig("outfile.png")

    21. plt.show()

    6.测试方法

    测试方法写入main函数中,然后直接执行main方法即可:

    data.txt可到github中下载:data.txt

    1. #根据数据集data.txt

    2. def main():

    3. datafile = "data.txt"

    4. XMat = loaddata(datafile)

    5. k = 2

    6. return pca(XMat, k)

    7. if __name__ == "__main__":

    8. finalData, reconMat = main()

    9. plotBestFit(finalData, reconMat)

    结果展示

    最后的结果图如下:

     


     

     

    蓝色部分为重构后的原始数据,红色则是提取后的二维特征!

    参考文献

    [1] http://www.cnblogs.com/jerrylead/archive/2011/04/18/2020209.html 
    [2] Wikipedia- Linear discriminant analysis 
    [3] Wikipedia- Principal_component_analysis

    展开全文
  • PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法。PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维...
  • 主成分分析(Kernel Principal Component Analysis, KPCA) PCA方法假设从高维空间到低维空间的函数映射是线性的,但是在不少现实任务中,可能需要非线性映射才能找到合适的低维空间来降维。 非线性降维的额一种常用...
  • Python中,主成分分析的函数位于Scikit-Learn中: sklearn.decomposition.pca(n_components=None, copy=True,whiten=False) 导入: from sklearn.decomposition import PCA 参数说明: n_components ...

    主成分分析

    以下引自百度百科和wiki:

        主成分分析(Principal Component Analysis,PCA), 是一种统计方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。在实际课题中,为了全面分析问题,往往提出很多与此有关的变量(或因素),因为每个变量都在不同程度上反映这个课题的某些信息。主成分分析首先是由K.皮尔森(Karl Pearson)对非随机变量引入的,尔后H.霍特林将此方法推广到随机向量的情形。信息的大小通常用离差平方和或方差来衡量。
         Principal component analysis (PCA) is a mathematical procedure that uses an orthogonal transformation to convert a set of observations of possibly correlated variables into a set of values of linearly uncorrelated variables called principal components. The number of principal components is less than or equal to the number of original variables. This transformation is defined in such a way that the first principal component has the largest possible variance (that is, accounts for as much of the variability in the data as possible), and each succeeding component in turn has the highest variance possible under the constraint that it be orthogonal to (i.e., uncorrelated with) the preceding components. Principal components are guaranteed to be independent if the data set is jointly normally distributed. PCA is sensitive to the relative scaling of the original variables.

    1、步骤

    1. 将d维度原始数据标准化。
    2. 构建协方差矩阵(因为已经对数据进行标准化,所以协方差矩阵也为原始数据的相关系数矩阵)。
    3. 求解协方差矩阵的特征向量和特征值。
    4. 选择值最大的k个特征值对应的特征向量,k就是新特征空间的维度,k<<d;或者也可以选择累计方差贡献率大于85%以上的前k个特征。
    5. 利用前k特征向量构建映射矩阵W。
    6. 将原始数据d维度的数据集X,通过映射矩阵W转换到k维度的特征子空间。

    2、Python实现

    在Python中,主成分分析的函数位于Scikit-Learn中:

    sklearn.decomposition.pca(n_components=None, copy=True,whiten=False)

    导入:

    from sklearn.decomposition import PCA

    参数说明:

    1. n_components
      意义:PCA算法中要保留的主成分个数n,也即经过线性变换后保留下来的特征个数n,起到降维的效果。
      类型:int或者string。缺省时默认为None,所有成分被保留,可以通过explained_variance_ratio属性得到每个主成分的方差解释率。赋值为int,比如n_components=3,将把原始数据降到三个维度。赋值为string,比如n_components=‘mle’,将自动选取特征个数n,使得满足所要求的的方差百分比。
    pca=PCA(n_components=None)
    X_train_pca=pca.fit_transform(X_train_std)
    pca.explained_variance_ratio_
    1. copy
      类型:bool,True或者False,缺省时默认为True。
      意义:表示是否在运行算法时,将原始训练数据复制一份,若为True,则运行PCA算法后,原始训练数据的值不会有任何改变。因为是在原始数据的副本上进行运算的;若为False,在运算PCA算法后,原始训练数据的值会改变,因为是在原始数据上进行降维计算。
    2. whiten
      类型:bool,缺省时默认为False。
      意义:白化,使得每个特征具有相同的方差。

    3、案例

        使用《Python数据分析与挖掘实战》的principal_component.csv数据作为原始数据进行分析。

    import pandas as pd
    from sklearn.decomposition import PCA
    data=pd.read_csv("D:/anaconda/data/principal_component.csv",header=None)
    data.shape 
    (14, 8) #数据有14个观测,8个特征。
    pca=PCA(n_components=None)
    pca.fit(data)
    pca.components_ #显示各特征的特征向量。
    array([[ 0.56788461,  0.2280431 ,  0.23281436,  0.22427336,  0.3358618 ,
             0.43679539,  0.03861081,  0.46466998],
           [ 0.64801531,  0.24732373, -0.17085432, -0.2089819 , -0.36050922,
            -0.55908747,  0.00186891,  0.05910423],
           [-0.45139763,  0.23802089, -0.17685792, -0.11843804, -0.05173347,
            -0.20091919, -0.00124421,  0.80699041],
           [-0.19404741,  0.9021939 , -0.00730164, -0.01424541,  0.03106289,
             0.12563004,  0.11152105, -0.3448924 ],
           [-0.06133747, -0.03383817,  0.12652433,  0.64325682, -0.3896425 ,
            -0.10681901,  0.63233277,  0.04720838],
           [ 0.02579655, -0.06678747,  0.12816343, -0.57023937, -0.52642373,
             0.52280144,  0.31167833,  0.0754221 ],
           [-0.03800378,  0.09520111,  0.15593386,  0.34300352, -0.56640021,
             0.18985251, -0.69902952,  0.04505823],
           [-0.10147399,  0.03937889,  0.91023327, -0.18760016,  0.06193777,
            -0.34598258, -0.02090066,  0.02137393]])
    pca.explained_variance_ratio_.cumsum() #显示各特征的累计方差贡献率。
    array([0.77401126, 0.93096071, 0.97372013, 0.99778605, 0.99928883,
           0.99969982, 0.99990754, 1.        ])
    pca=PCA(3) #前三个主成分的累计贡献率达到了97.37%,所以选择3个主成分即可。
    pca.fit(data)
    low_d=pca.transform(data)
    low_d #显示降维后的结果。
    array([[  8.19133694,  16.90402785,   3.90991029],
           [  0.28527403,  -6.48074989,  -4.62870368],
           [-23.70739074,  -2.85245701,  -0.4965231 ],
           [-14.43202637,   2.29917325,  -1.50272151],
           [  5.4304568 ,  10.00704077,   9.52086923],
           [ 24.15955898,  -9.36428589,   0.72657857],
           [ -3.66134607,  -7.60198615,  -2.36439873],
           [ 13.96761214,  13.89123979,  -6.44917778],
           [ 40.88093588, -13.25685287,   4.16539368],
           [ -1.74887665,  -4.23112299,  -0.58980995],
           [-21.94321959,  -2.36645883,   1.33203832],
           [-36.70868069,  -6.00536554,   3.97183515],
           [  3.28750663,   4.86380886,   1.00424688],
           [  5.99885871,   4.19398863,  -8.59953736]])
    pca=PCA(n_components='mle') #自动选择
    pca.fit(data)
    low_d=pca.transform(data)
    low_d #显降维后的结果。自动选择提取五个主成分。
    array([[ 8.19133694e+00,  1.69040279e+01,  3.90991029e+00,
             7.48106686e+00, -5.16142203e-01],
           [ 2.85274026e-01, -6.48074989e+00, -4.62870368e+00,
             5.01369607e+00,  1.65278935e+00],
           [-2.37073907e+01, -2.85245701e+00, -4.96523096e-01,
            -1.57285727e+00,  2.09522277e-01],
           [-1.44320264e+01,  2.29917325e+00, -1.50272151e+00,
            -1.30763061e+00, -1.54047215e+00],
           [ 5.43045680e+00,  1.00070408e+01,  9.52086923e+00,
            -5.63779544e+00,  9.21974743e-01],
           [ 2.41595590e+01, -9.36428589e+00,  7.26578565e-01,
            -1.98622218e+00,  9.98528392e-01],
           [-3.66134607e+00, -7.60198615e+00, -2.36439873e+00,
             4.21318409e-02,  8.48196502e-02],
           [ 1.39676121e+01,  1.38912398e+01, -6.44917778e+00,
            -2.92916826e+00,  1.91994563e-01],
           [ 4.08809359e+01, -1.32568529e+01,  4.16539368e+00,
             1.21239981e+00, -1.33543444e+00],
           [-1.74887665e+00, -4.23112299e+00, -5.89809954e-01,
            -1.57477365e+00, -4.10612180e-01],
           [-2.19432196e+01, -2.36645883e+00,  1.33203832e+00,
             4.39763606e+00,  2.61113312e-02],
           [-3.67086807e+01, -6.00536554e+00,  3.97183515e+00,
            -1.54808393e+00, -3.00572729e-01],
           [ 3.28750663e+00,  4.86380886e+00,  1.00424688e+00,
             8.51193030e-01,  6.27109498e-01],
           [ 5.99885871e+00,  4.19398863e+00, -8.59953736e+00,
            -2.44159234e+00, -6.09616105e-01]])
    展开全文
  • 主成分分析 python, sklearn

    千次阅读 2020-06-24 15:27:03
    主成分分析(Principle Component Analysis, PCA)是数据降维的一个方法:原始的统计数据中有很多变量,可以采用主成分分析方法将原始数据降维为少数几个变量的数据。 主成分分析的求解一般采用特征根分解,即求解...

    六月份似乎太忙,将近一个月没有写博客,于是挑一个多元统计分析中的方法写一篇 python 操作实现的。

    主成分分析(Principle Component Analysis, PCA)是数据降维的一个方法:原始数据中有很多特征变量,可以采用主成分分析方法将原始数据降维为少数几个变量,主成分就是降维后各原始变量的线性组合系数。

    主成分分析的求解一般采用特征根分解,即求解原始数据协方差矩阵或相关系数矩阵最大特征根对应的特征向量,即为第一主成分,第二主成分为第二大特征根对应的特征向量,其他的主成分可以依次得出。主成分贡献率为对应特征根占所有特征根加和的比例。(特征向量使得降维后数据的方差最大,因此保留了原始变量尽可能多的信息,数学原理中用到了瑞利定理的结论)

    采用 python 主成分分析时,常用的包为 Sklearn,其他一些包也能做(例如 matplotlib.mlab.PCA)。需要注意的是

    • 最好对原始数据进行标准化
    • sklearn 计算主成分时使用的是协方差矩阵,而不是相关系数矩阵。

    举例,下面一个统计数据:

    食品衣着居住家庭设备交通通讯文教娱乐医疗保健其他
    北 京1736379854327615797504103
    天 津117125761411732832917940
    河 北88815639910122222613539
    山 西8302022016916028010333
    内蒙古10541503358429330917644
    辽 宁112722137810030137723468
    吉 林10031682578228526119456
    黑龙江9241845277425727725449
    上 海26843661320458748937562204
    江 苏156919151216836447919985
    浙 江2061319914260618723416121
    安 徽100011734510619725713441
    福 建1518187457154366357154100
    江 西12211253269623027615556
    山 东108816044613729437718846
    河 南8591323188316017812339
    湖 北119212531011022327213562
    湖 南143312830711421932916858
    广 东1789144530152412361204116
    广 西1187793809521422612344
    海 南113566146921781999360
    重 庆1130962319616325014333
    四 川124411623410217222514436
    贵 州8208023662991617224
    云 南976802266710018312235
    西 藏1185182848179284439
    陕 西8131242128416329716638
    甘 肃859922417415525811427
    青 海8931563298420811015243
    宁 夏9231433467717817819951
    新 疆8041713336818315916936

    对其主成分分析的 Python 代码为:

    from sklearn.decomposition import PCA
    from sklearn.preprocessing import scale
    import pandas as pd
    import numpy as np
    
    
    df = pd.read_excel(r'D:\Users\chen_\git\Statistics-book\datas\data-pca.xlsx', index_col=0) # 读取数据
    data = scale(df.values) # 标准化,标准化之后就自动根据协方差矩阵进行主成分分析了
    # data2 = np.corrcoef(np.transpose(data)) # 没有必要单独计算协方差阵或相关系数阵
    pca = PCA() # 可以调整主成分个数,n_components = 1
    pca.fit(data)
    print(pca.explained_variance_) # 输出特征根
    print(pca.explained_variance_ratio_) # 输出解释方差比
    print(pca.components_) # 输出主成分
    

    输出结果:

    [7.32679152 0.46898546 0.16208403 0.1035709 0.07520292 0.06908562
    0.04006575 0.02088048]

    [0.88630543 0.05673211 0.01960694 0.01252874 0.00909713 0.00835713
    0.00484666 0.00252586]

    [[ 0.34197826 0.32541509 0.36029958 0.36486138 0.3682146 0.36096996
    0.35616496 0.34854195]
    [ 0.54451489 -0.61527353 -0.11520953 0.11674732 -0.03494752 -0.07480108
    -0.2943857 0.4522824 ]
    [ 0.27960446 0.69192655 -0.19973533 -0.07235855 -0.02963776 -0.42452329
    -0.39881297 0.24037227]
    [-0.21745238 -0.1359657 0.65924912 -0.30353519 0.15040126 -0.53935545
    0.07814873 0.29639958]
    [-0.15267545 -0.0164215 -0.46139281 -0.58549298 0.44015111 0.1955926
    0.1948895 0.38828316]
    [ 0.16110958 -0.00739226 0.32020717 -0.29565015 0.42815873 0.33310541
    -0.60500836 -0.35175729]
    [ 0.63371524 -0.02206104 -0.01490419 -0.36536854 0.00175525 -0.23513962
    0.46603443 -0.43785863]
    [-0.10113902 -0.13222512 -0.25839752 0.43837388 0.68017775 -0.4341369
    0.01092949 -0.2492196 ]]

    转载于个人公众号:Python 统计分析与数据科学

    在这里插入图片描述

    展开全文
  • 第二节主成分分析 介绍 这里是司守奎教授的《数学建模算法与应用》全书案例代码python实现,欢迎加入此项目将其案例代码用python实现 GitHub项目地址:Mathematical-modeling-algorithm-and-Application CSDN专栏:...
  • 主成分分析(PCA)python实现(含数据集),结构清晰,适合初学者
  • 主成分分析法,使用python实现。应对非线性数据,先使用核技巧映射高维使之线性可分,之后再用PCA方法将高维降到低维,理论上可从无穷维降到一维或二维,将数据变为线性可分。此程序中既包含了手工制作的KPCA全...
  • 多尺度主成分分析。 多尺度PCA(MSPCA)结合了PCA提取变量之间的互相关或关系的能力,以及正交小波的能力,以从随机过程中分离确定性特征,并使测量之间的自相关近似解相关[1]。 图1. MSPCA模型的示意图[2]。 图...
  • PCA主成分分析Python实现

    千次阅读 2017-04-08 11:01:13
    PCA(principle component analysis) ,主成分分析,主要是用来降低数据集的维度,然后挑选出主要的特征。原理简单,实现也简单。关于原理公式的推导,本文不会涉及,你可以参考下面的参考文献,也可以去Wikipedia...
  • 主成分分析原理及Python实现

    千次阅读 2020-10-27 15:16:26
    主成分分析(Principal Components Analysis, PCA)是一种常用的数据分析手段,是图像处理过程中常用到的降维方法。对于一组不同维度之间可能存在线性相关关系的数据,PCA能够把这组数据通过正交变换变成各个维度...
  • 将数据转换为只保留前N个主成分特征空间 1、去除平均值 2、计算协方差矩阵 3、计算协方差矩阵的特征值和特征向量 4、将特征值排序保留前N个最大特征值对应的特征向量 5、将数据转换到上面得到的N个特征向量构建的...
  • Python主成分分析

    千次阅读 2020-12-22 17:03:09
     了解主成分分析、因子分析、判别分析、聚类分析的原理背景  掌握SAS语言进行多变量分析过程(princomp过程和factor过程)  掌握SAS语言进行判别分析 (discrim过程)  掌握SAS语言进行聚类分析(cluster过程...
  • 主成分分析(PCA) 目的 数据降维,将n维数据降为n’维数据。原数据X:n×m,sample point:(x1,...,xn)T,base:{w1,...,wn}X:n\times m,sample\,point:(x_1,...,x_n)^T,base:\lbrace w_1,...,w_n\rbraceX:n×m,...
  • Python实现主成分分析(PCA)降维

    千次阅读 多人点赞 2020-08-07 17:25:33
    主成分分析是我十分喜欢的一个将为丰富,在之前学习并总结过其matlab的实现方法。
  • python实现主成分分析(PCA)

    千次阅读 2020-05-02 17:53:31
    python实现主成分分析(PCA) 前言: 主成分分析主要是用于降维,减少样本的特征量,其核心思想是将样本数据映射到最重要的方向,而最重要的方向就是方差最大的方向。关于主成分分析详细的理论知识,请至我的这篇...
  • 主成分分析python上的实现

    千次阅读 多人点赞 2020-03-24 10:48:52
    主成分分析(PCA)是一种基于变量协方差矩阵对数据进行压缩降维、去噪的有效方法,PCA的思想是将n维特征映射到k维上(k<n),这k维特征称为主成分,是旧特征的线性组合,这些线性组合最大化样本方差,尽量使新的k...
  • 信息分析与预测的实验,Python写的代码,萌新代码,勿喷,仅仅只是方便没时间写实验的朋友,直接用python打开就能运行
  • 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)

    千次阅读 2021-05-09 19:12:18
    python实现主成分分析(PCA)python应用实例:如何用python实现主成分分析背景iris数据集简介算法的主要步骤代码实现查看各特征值的贡献率 python应用实例:如何用python实现主成分分析 主成分分析(Principal ...
  • 主成分分析 python实现

    2019-12-02 19:09:14
    主成分分析的步骤: 1.首先有一个原始数据阵X=[X1,X2,X3,X4] 2.对数据阵进行标准化,一般的标准化方法是Xi=(Xi-E(Xi))/i 3.求出新的矩阵的协方差矩阵 4.求出的特征值(从大到小排列)和特征向量 5.各主成分贡献...
  • 数学建模——主成分分析算法详解Python代码 import matplotlib.pyplot as plt #加载matplotlib用于数据的可视化 from sklearn.decomposition import PCA #加载PCA算法包 from sklearn.datasets import load_iris ...
  • Python数据建模--主成分分析

    千次阅读 2020-05-15 10:30:34
    PCA主成分分析python实现方法 介绍:最广泛无监督算法 + 基础的降维算法,通过线性变换将原始数据变换为一组各维度线性无关的表示,用于提取数据的主要特征分量 → 高维数据的降维 分类:二维数据降维 / 多维数据...
  • 主成分分析 (PCA) 的Python实现

    千次阅读 2020-03-06 23:21:12
    一句话概括主成分分析 主成分分析是采取一种数学降维的方法,找出几个综合变量来代替原来众多的变量,使这些综合变量能尽可能地代表原来变量的信息量,而且彼此之间互不相关。这种将把多个变量化为少数几个互相无关...
  • Python实现 导入数据 from sklearn import datasets iris = datasets . load_iris ( ) 用sklearn版本的PCA from sklearn . decomposition import PCA import numpy as np import ...
  • 文章目录numpy + pandas实现1. 标准化原始数据集2. 获得协方差矩阵3. 获得特征向量和特征值4....代码思路来自Python Machine Learning 3rd,本人只是做了一些修改 numpy + pandas实现 我们以panda...
  • python主成分分析(PCA)

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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,627
精华内容 4,650
关键字:

主成分分析python

python 订阅