R 和 Python 中不同的 PCA 结果

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

我正在尝试对我的数据进行 PCA,该数据框的行中有 16 个观察值,列中有 11 个特征。

在 R 中,使用

prcomp
,矩阵格式由行中的特征和列中的主成分组成。在 Python 中使用
sklearn
格式是相反的。行是观察值(在我的例子中是行政单位),列又是主要组成部分。虽然 R 和 Python 之间的特征值和分量载荷不同,但解释方差的累积和以及特征与主分量的相关性保持不变

我正在努力理解为什么会出现这些差异以及如何正确解释 Python 结果。任何见解或解释将不胜感激。

R:

data_pca <- prcomp(data, scale = TRUE)

Python:

from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)

pca = PCA()
data_pca = pca.fit_transform(data_scaled)


编辑:我转置数据以最终得到相同形状后的结果。结果很奇怪,仍然与 R 不同。

explained_variance    explained_variance_ratio  cumulative_sum
PC1 1.541840e+01      8.760452e-01               0.876045
PC2 6.401815e-01      3.637395e-02               0.912419
PC3 5.191492e-01      2.949711e-02               0.941916
PC4 4.163386e-01      2.365560e-02               0.965572
PC5 3.616688e-01      2.054936e-02               0.986121
PC6 9.329659e-02      5.300943e-03               0.991422
PC7 8.263950e-02      4.695426e-03               0.996118
PC8 4.770578e-02      2.710556e-03               0.998828
PC9 1.481567e-02      8.417995e-04               0.999670
PC10 5.808094e-03     3.300053e-04               1.000000
PC11 8.392454e-33     4.768440e-34               1.000000
python r scikit-learn pca prcomp
1个回答
0
投票

只是为了好玩,因为这是

reticulate
的一个很好的用例,我构建了一个测试用例来比较 2 个 PCA 计算。这是测试脚本,您可以根据您的具体用例进行调整:

library(reticulate)
# Use mtcars as test data
daten <- mtcars
# Results of PCA calculated in R
result_r <- prcomp(daten)
# Load scikit module via reticulate
pca <- import("sklearn.decomposition")
# PCA calculated wih Python
result_py <- pca$PCA(n_components = as.integer(11))
result_py <- result_py$fit(daten)
result_py <- result_py$transform(daten)
# Calculate absolute difference of result matrices
#   calculated with abs, because the Principal Components
#   may point in opposite directions
abs(result_r$x) - abs(result_py)
# Calculate maximum and minimum difference
max(abs(result_r$x) - abs(result_py))
min(abs(result_r$x) - abs(result_py))

正如您将看到的,存在差异,但数量级为 1e-13 到 1e-14,在数字上合理且可以忽略不计。


PS。正如您从这个示例中看到的那样,您的转换不是必需的。我不必使用定标器。

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