我正在尝试对我的数据进行 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
只是为了好玩,因为这是
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。正如您从这个示例中看到的那样,您的转换不是必需的。我不必使用定标器。