Python和SAS产生具有相同绝对值的PCA数据。值,但符号倒置-为什么?

问题描述 投票:0回答:1

我正在构建Python 3(用于数据处理的熊猫,用于通过SVD进行PCA的numpy)以模仿我在研究生院编写的一些代码。该代码在SAS 9.4中使用PROC IML在光谱矩阵上调用svd。 SAS代码:

data Raman1;
infile "Combined SpectraC.csv" dsd firstobs=2;
input Wavenumber R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21;
run;
proc iml;
use Raman1;
read all var {R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21} into Raman1[colname=varname]; *Matrix is row=value at a wavenumber, column sample**;
close Raman1;
Raman=Raman1`;  *transpose;
mean1=mean(Raman);
std1=std(Raman);
RamanSVD=(Raman-mean1)/std1;
call svd (u,q,v,RamanSVD);

我的python代码(跳过输入,spec1是在SAS代码中称为Raman1的相同数据)

(所有缩写都是正常的,pd = pandas,np = numpy,la = numpy.linalg)

tspec=spec1.T
tspec_stats=tspec.describe()
tspec_stats=tspec_stats.drop(["count","min","25%", "50%","75%","max"], axis=0)

scale_spec=pd.DataFrame()
tsamplelist=tspec.columns.tolist()
for i in tsamplelist:
    scale_spec[i]=((tspec[i]-tspec_stats.iloc[0, i])/tspec_stats.iloc[1,i])

PCA_data=scale_spec.to_numpy()

u, s, vh= la.svd(PCA_data)

这些产生几乎相同的数据,除了在许多数据上符号相反。 Q(来自SAS)和S(来自Python)相同,但是对于U和V列1-6、8、13-14、16、19(在21列中)具有相同的绝对值,但SAS和Python之间的符号不同(即,SAS中为正的数据在Python中为负,反之亦然)。其他列(7、9-12、15、17、28、20和21)具有相同的绝对值和符号。

这不是问题本身:解释光谱的PCA的一般方法是使用有限的尺寸(主要成分)重建光谱;因为符号在数据的两边都翻转了,所以重建是相同的。 X + * X + = X- * X-相等,并且X + * X- = X- * X +(假设X是相同的数字)。

这是我对数据的信心,也是我有能力捍卫自己的方法。谁能帮助我了解为什么会发生这些标志变化?这些过程有何不同?

PS:我检查过。使用的数据是完全相同的文件。

python sas pca
1个回答
1
投票

这在数学上是因为如果x是一个特征向量,那么-x也是一个具有相同特征值的特征向量。因此,本征向量的方向不确定。在数值上,在计算过程中较小的舍入误差会使方向改变。如果问题已在各个库之间进行了数字标准化,则要简单得多,但这不是当前的情况,因此我们必须忍受它。但是,您可以在任何PCA例程的后处理中任意更改方向,例如使第一个组件为非负数:这是缺乏标准化的合理解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.