pca算法原理及其优缺点,pca算法有哪些缺点
=====================================================================
755-79000系列博客是博客作者阅读本书《机器学习实战》的笔记,也包含一些其他python实现的机器学习算法。
Github源同步:https://github.com/Thinkgamer/Machine-Learning-With-Python
该算法用Python实现。如需转载,请注明出处。谢谢你。
=====================================================================
数据简化的原因1:让数据更容易使用。
2.降低许多算法的计算成本。
3.消除噪音。
4.让结果容易理解。
降维方法1:主成分分析
在PCA中,数据从原坐标系转换到新坐标系,新坐标系的选择由数据本身决定。第一个新坐标轴选择原始数据中方差最大的方向,第二个新坐标轴与第一个坐标轴正交,方差最大。这个过程一直在重复,重复的次数就是原始数据中特征的个数。我们会发现大部分方差都包含在前几个新坐标轴上。所以可以忽略剩下的坐标轴,也就是数据的降维。
2.因子分析(因子分析)
在因子分析中,我们假设在观察数据的生成过程中存在一些不可观察的潜在变量。假设观测数据是这些隐变量和一些噪声的线性组合。那么隐变量的数据可能比观测数据的数量少,也就是说,可以通过寻找隐变量来实现数据的降维。
3.独立成分分析
假设ICA数据是从n个数据源生成的,有点类似于因子分析。假设数据是多个数据源的混合观测,这些数据源在统计上是相互独立的,但是在?0人只假设数据无关。与因子分析一样,如果数据源的数量少于观测数据的数量,就可以实现降维过程。
PCA降维技术(应用最广泛)
覆盖整个数据集的三条直线,其中直线8最长,并给出了数据集中最大差异的方向。
在PCA中,我们对数据进行旋转,旋转的过程取决于数据本身,如上图所示,在A、B、c三条直线中,B线覆盖的数据范围最广,然后将第一坐标轴旋转到B线的位置,此时覆盖数据的方差最大,数据的最大方差给出了数据最重要的信息。
选择第一个坐标轴后,如果与第一个坐标轴垂直,则是覆盖数据第二大差值的坐标轴。这里更严谨的说法是正交。当然,在二维平面上,垂直和正交是一回事,直线C是第二坐标轴。使用PCA,我们将数据坐标轴旋转到从数据角度来看最重要的方向。
我们实现了坐标轴的旋转。接下来,我们将讨论降维。坐标轴的旋转不会减少数据的维数。
二维空间的三个范畴。当PCA应用于数据集时,可以去除一个维度,从而使分类问题更容易处理。
如上所示,有三个不同的类别。为了区分这三个类别,您可以使用决策树。我们还记得,决策树每次都是基于一个特征做出决策。我们会发现在X轴上可以找到一些值,可以很好的把这三类分开。这样我们可能会得到一些规律,比如当0 4)时,数据属于0类。如果我们使用像SVM这样稍微复杂的分类器,我们会得到更好的分类表面和规则。例如,当(w0 * x w1 * y b) 0时,数据也属于类别0。SVM可能得到比决策树更好的分类区间,但是分类超平面很难解释。
通过PCA降维,我们可以同时得到SVM和决策树的优点:一方面,我们得到了一个像决策树一样简单的分类器,分类区间和SVM一样好。如上图所示,其中的数据来自上图,是经过PCA转换后绘制的。如果只使用原始数据,这里的区间会比决策树大。此外,由于只需要考虑一维信息,因此可以用比S V M简单得多、更容易采用的规则来区分数据。
在上图中,我们只需要一维信息,因为其他一维信息只是对分类没有贡献的噪声数据。在二维平面上,这一点看似微不足道,但在高维空间中却意义重大。
让我们用代码实现PCA:
span style= font-size:18px;span style= font-size:14px;#-*-编码:utf8-*- 创建于2016-5-15 @作者:thinkgamer from numpy import * def load dataset(filename,delim= t ):fr=open(filename)string ar=[line . strip()。split(delim)for Line in fr . readlines()]datArr=[map(float,Line)for Line in string arr]return mat(datArr)# dataMat对应数据集,有n个特征DEFCA (datamat,topn feat=999999):mean values=mean(dataMat,Axis=0)# average mean removed=dataMat-mean vals # average covmat=cov(mean removed,rowvar=0) #计算协方差矩阵eigVals,Vectors=Lina LG . EIG(mat(mat(cov))EIG valind=EIG valind[:-(topnfeat 1):-1]RedegVectors=EIG vectors[:Eigend] #将数据转换到新的空间lowdDatamat=Mean Removed * RedegVectors recon mat=(lowdDatamat * RedegVectors . t)Mean Vals return lowdDatamat,recon mat # test dataMat=load dataset( testset . txt )lowDMat,reconmat=PCA (datamat,1)print shape(lowDMat)# showimport matplotlibimport matplotlib . py展平()。A[0],dataMat[:1]。展平()。A[0],marker=^,s=90 )ax.scatter(reconMat[:0]。展平()。一个[0],再确认[:1]。展平()。A[0],marker=o ,s=50,c= red )/span span style= font-size:14px;plt.show() /span/span
打印的结果是:(1000,1)
图纸:
示例:通过PCA技术降低半导体制造数据的维度
span style= font-size:18px;span style= font-size:14px;#用平均值函数def replaceanwithmean()替换NaN:datMat=load dataset( secom . data ), )numFeat=shape(datMat)[1]for I in range(numFeat):mean val=mean(datMat[非零(~isnan(datMat[:i])。A))[0],i])#不是NaN(一个数字)datMat[非零(isnan(datMat[:I])的值。A))[0],I]=mean val # set nan values to mean return data mat # load data data mat=replaceanwithmean()# remove mean mean vals=mean(data mat,Axis=0)mean removed=data mat-mean valves #计算协方差covmat=cov (meanremoved,rowvar=0) #特征值分析eigvals,EIG vectors=Lina LG . EIG(mat(cov mat))print EIG vals/span/span
输出是:
数据描述:
会不会发现这些值很多都是0?事实上,超过2 0%的特征值为0。这意味着这些特征是其他特征的副本,也就是说,它们可以由其他特征来表示,而无需提供附加信息。
接下来,我们来看看一些数值的数量级。前15个数值的数量级大于105,但实际上,之后的数值已经变得很小了。这就好比告诉我们,我们只有一些重要的特性,重要特性的数量很快就会下降。
最后,我们可能会注意到有一些很小的负值,这主要是因为数值误差要四舍五入到0。
表13-1显示了对应于这些主成分的方差百分比和累积方差百分比。浏览“累积方差百分比(%)”列,您会注意到前六个主成分覆盖了数据的96.8%方差,而前20个主成分覆盖了99.3%方差。这表明,如果保留前六个组件并删除后584个组件,我们可以实现大约100: 1的压缩比。此外,因为噪声的主成分被丢弃,所以通过去除后面的主成分,数据将更干净。
因此,我们可以知道数据集的第一主成分所包含的信息量。我们可以尝试不同的截断值来测试它们的性能。有的人用能包含90%信息的主成分个数,有的人用前20个主成分。我们无法确切知道需要多少个主成分,必须通过在实验中取不同的值来确定。有效主成分的数量取决于数据集和具体应用。
上述分析可以得到所使用的主成分的数量,然后我们可以将这个数量输入到PCA算法中。最后,减少的数据可用于分类器。