python人脸识别技术,pca降维 python

  python人脸识别技术,pca降维 python

  本文由使用python实现PCA代码使用sklearn库实现PCA降维两部分组成,与原理无关。

  一般来说,对于N维数据,PCA维数减少到K维是由于:

  归一化原始数据的平均值;求协方差矩阵;找到协方差矩阵的特征值对应的特征向量,选择特征值最大的K个值对应的特征向量;将预处理后的数据与选择的特征向量相乘,得到降维结果。

  Experiment data.txt使用[2]中创建的数据。以下是部分数据截图。

  形状是(31,4),这是31条特征数为4的数据。

  用python实现PCA的完整代码参考[2]。这里详细解释一下。

  1.导入数据

  importnumpyasnpimportpandasapsdatafile= data . txt xmat=NP . array(PD . read _ CSV(datafile,sep=,header

  求XMat列的平均值:

  Average=NP.mean(xmat,axis=0)平均数组([5.01935484,3.43870968,1.47741935,0.24516129])扩展平均形状为(1)。

  # avgs是第m=31行的平均值。因为average只有一行,所以这31行表示同一个#NP.tile(average,)m,1)是二维的,有m行4列m,n=np.shape) xmat) avvreage)

  从XMat中减去每列的平均值:

  数据调整=xmat-avg sdata _ adjust

  2.去除平均值

  因为它是4列数据的四维特征,所以协方差是44:

  covx=NP . cov(data _ adjust . t)covxarray([0.1356129,0.10022581,0.01645161,0.01576344 ],[0.1002222222581,0.11581] [0.01645161,0.00023656,0.03380645,0.0055

  featValue,featvec=NP。LinaLG . EIG(covx)featvaluefeatveccarray([0.23301081,0.04211748,0.02128637,0.00534878 ] 0.49557031,-0.48975753,-0.2379878],[-0.06366849,-0.775436-0.02548266,- 0.32813302,0.93774397 ] )3.求XMat协方差矩阵的特征值和特征向量

  当按照特征值从大到小的顺序重新排列时,索引显示位置:

  在index=NP . arg sort(-feat value)index #下,输入小NP.argsort (feat value) feat value)数组([0,1,2,3],dtype=int64)。

  k=2 select vec=NP . matrix(feat vec . t[index[:k])select vec matrix([-0.72506043,-0.67669491,-0.063663)

  266]])5.将样本点投影到选取的特征向量上

  即数据集*特征向量的换位:

  final data=data _ adjust * select vec。T # (31,4) * (4,2)=(31,2)finalData.shapefinalData

  6.计算重构误差[3]

  恢复相应的投影数据:

  recon data=(final data * select vec)average print(recon data . shape)recon data

  根据[4]:

  其中m是样本数,即数据31的行数。x是去平均后的原始数据,这里是data_adjust。x(近似值)是重建后恢复的数据,这里是reconData。

  对误差的平方求和,并计算err1:

  Errmat=xmat-recondataerr1=NP。sum (NP。array(errmat)* * 2)/err 2 0.2000000000005

  Err 2=NP。sum(data _ adjust * * 2)/nerr 2 2 . 54686 . 36868686661

  eta=err 1/err 2 eta 0.0882650011729915根据[4],1-=约91%,这说明当k=2用于PCA降维时,数据可以保留91%以上的信息。

  使用sklearn库进行PCA降维的api见[5]。下面是一些常用的属性和方法。

  从sklearn.decomposition导入PCA PCA=PCA(n _ components=k)PCA . fit(XMat)1. n_components参数:

  默认值是保留所有特征值,即不降维:PCA=PCA () PCA。Fit (XMAT) PCA。Explained _ Variance _ Array([0.23301081,0.04211748,0.02128637,0.00534878])Explained _ Variance _

  当n_components==mle 时,会自动确认降维,但好像结果是n-1(n是原始数据中的列数,即特征数):PCA。解释了_方差_数组([0.23301081,0.04211748,0.02128637])。

  n _ components 1为0时,指定降维后的方差和比例。比例越大,降维后保留的信息越多,降维会自动确认。当n_components=0.9时,是k=2的效应;当n_components=0.95时,就是k=3的效果。

  您可以通过在[6]中绘图来获得您想要保留的信息和尺寸之间的关系:

  导入matplotlib.pyplot为PLT def pcaImg(XMat):PCA=PCA()PCA . fit(XMat)ratio=PCA . explained _ variance _ ratio _ K=PCA . n _ components _ print( PCA . n _ components _ ,K) #画图x=[I 1 for I in range (k)] y=[NP .范围(k)内I的Sum(比率[:I 1])print(y)PLT。绘图(x,y) PLT。x票(1NP。Arange (k,step=1)) plt.yticks(np.arange(0,1.01,0.05))PLT . grid()PLT . show()pcaImg(XMat)

  横坐标代表k,纵坐标代表降维后可以保留的信息。

  可以看出,当k=1时,可以保留约77%的信息;k=2时91%,k=3时98%,k=4时无降维或信息损失。

  当n_components=0.9时,打印结果:

  k=2是真的。

  2.components_ 属性

  输出k个特征向量,每行代表一个特征向量:

  3.explained_variance_ 属性

  输出选定的k个最大特征值:

  4.explained_variance_ratio_ 属性

  保留维度的方差百分比是每个特征值与其所有特征值的总值之比:

  即当k=1时,降维后能保留的信息为77%,当k=2时,为77% 24%。

  一般来说,比例太小可以舍弃,也就是这里取k=2或者3比较好,具体情况具体分析。

  5.n_components_ 属性

  即,设定维度缩减k:

  6.fit_transform(X[, y]) 方法

  得到降维后的结果,类似于transform(X)方法:

  7.get_covariance() 方法

  获取协方差矩阵:

  8.inverse_transform(X) 方法

  从降维结果返回原始结果:

  因为这里k=n,所有的原始值都恢复了。实际上,在使用kn的时候,就和上面一样存在误差。

  当汇总数据的维度过高时,可以使用PCA等降维手段使维度降低,避免维度灾难,加快运算速度。

  PCA降维本质上是一种信息压缩,比如把形状为(31,4)的数据压缩成(31,2)。

  关于降维k的确定,可以使用sklearn中的PCA模块来获取数据的方差百分比,根据上面的作图方法来确定k的最佳值。

  一些研究工作表明,所选锭子的总长度约占所有锭子总长度的85%。即保留维度的总方差百分比达到85%以上,但实际效果仍取决于训练后生成的预测结果的评价。

  K值确定后,可以根据API快速得到降维后的数据,用于后续实验。

  参考文献[1]降维算法1: PCA(主成分分析)

  [2]用于机器学习降维的PCA(python代码数据)

  [3]主成分分析的降维与维数确定

  [4]PCA主成分量(降维)选择

  [5]sklearn.decomposition.PCA

  [6]通过主成分分析选择合适的降维方法。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: