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

时间:2016-04-04 11:24:29

标签: python scikit-learn pca variance orange

我正在使用scikit-learn PCA查找数据集的主要组件,其中包含大约20000个要素和400多个样本。

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

使用scikit-learn,第一个Principal Component占总方差的约14%,第二个占~13%,依此类推。

使用Orange3,我得到一个非常不同的结果(第一个主成分的约65%的变化等等):

Orange3 PCA output

我使用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块,我在其中取消选中了规范化选项。

两种方法的区别在哪里?

3 个答案:

答案 0 :(得分:1)

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

  • 继续(用于将分类或确定的分类值转换为连续的,例如通过单热转换)和
  • 插补(例如,用平均值替换nans)。

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

答案 1 :(得分:0)

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

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

所以我转换了数据,结果与scikit-learn模块给出的结果相同:

PCA corrected

由于

答案 2 :(得分:0)

也许差异是由于正常化。一个sklearn除以Pearson std(n-1)而不是std(n)。它可以解释小样本的小差异。

检查一下 对于std

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)

Pearson std 来自sklearn导入预处理

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