Orange PCA 和 scikit-learn PCA 之间的不同结果

Different results between Orange PCA and scikit-learn PCA

我正在使用 scikit-learn PCA 查找具有大约 20000 个特征和 400 多个样本的数据集的主要成分。

然而,与应该使用 scikit-learn PCA 的 Orange3 PCA 相比,我得到了不同的结果。我还取消选中了 Orange3 PCA 提出的规范化选项。

使用 scikit-learn,第一个主成分占总方差的 14%,第二个占 13%,依此类推。

对于 Orange3,我得到了非常不同的结果(第一个主成分的方差约为 65%,依此类推):

我使用 scikit-learn 的代码如下:

import pandas as pd
from sklearn.decomposition import PCA
matrix = pd.read_table("matrix.csv", sep='\t', index_col=0)
sk_pca = PCA(n_components=None)
result = sk_pca.fit(matrix.T.values)
print(result.explained_variance_ratio_)

对于 Orange3,我使用文件块加载了 csv。然后我将这个块连接到 PCA 块,其中我取消选中规范化选项。

两种方法的区别在哪里?

可能与 Orange 的 PCA 预处理器或加载数据的方式有关。 PCA 包含以下两个预处理器:

  • 连续化(用于将分类值或确定为分类值变为连续值,例如通过单热变换),以及
  • 插补(例如,用平均值替换 nans)。

确保您加载的数据没有任何 nan 值,并且带有 Orange's three line header,标记所有特征是连续的,因此不会进行任何转换。

感谢K3---rnc的回答,我检查了我是如何加载数据的。

但是数据加载正确,没有丢失数据。问题是 Orange3 加载数据时将特征放在列上,将样本放在行上,这与我期望的相反。

所以我转置了数据,结果和scikit-learn模块给出的结果一样:

谢谢

可能差异是由于 normalisation.The sklearn 除以 Pearson std (n-1) 而不是 std (n) 之一。它可以解释小样本情况下的小差异。

检查一下 对于标准

df
df2 = df.mean()
df2 = pd.DataFrame(df2,columns = ['Mean'])

#Calculer l'ecart type de chaque variable
df3 = df.std()
df3 = pd.DataFrame(df3,columns = ['Standard Deviation'])

#Centrer la matrice : faire la difference entre la matrice df et la moyenne de chaque variable
df4 = df.sub(df.mean(axis=0), axis=1)

#Reduire la matrice : diviser la matrice centree par son ecart type
import numpy as np
df5 = df4.divide(df.std(axis=0), axis=1)
df5 = df5.replace(np.nan, 0)

皮尔逊标准 来自 sklearn 导入预处理

df=pd.DataFrame(preprocessing.scale(df), index = df.index, columns = df.columns)