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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。