Как отметил @Lyngbakr в комментарии, вероятной причиной наблюдаемого расхождения является тот факт, что вы указали переменные для масштабирования в коде R, а не в коде Matlab.
Вот пример в R:
Создание переменных с разными величинами (случайный равномерный шум с разными величинами):
x1 <- runif(100, 200, 500)
x2 <- runif(100, 20, 50)
x3 <- runif(100, 2, 5)
x4 <- runif(100, 0.2, 0.5)
mat <- cbind(x1, x2, x3, x4)
сделать PCA без масштабирования:
pca1 <- prcomp(mat)
pca1$sdev
[1] 80.27564312 8.15330049 0.82751057 0.08491903
Стандартные отклонения отражают различные диапазоны переменных
Если вы только центрируете переменные, оставляете отклонения такими, какие они есть, это часто называют «PCA на основе ковариаций»:
cov(mat)
x1 x2 x3 x4
x1 6444.144562 11.149336032 9.70055864 -1.191862833
x2 11.149336 66.495763487 0.06598063 -0.001822713
x3 9.700559 0.065980626 0.69928547 0.007559200
x4 -1.191863 -0.001822713 0.00755920 0.007560817
Если вы также стандартизируете переменные для дисперсий = 1, это часто называют «PCA на основе корреляций».
pca2 <- prcomp(mat, scale = TRUE)
pca2$sdev
[1] 1.1308637 1.0205627 0.9624318 0.8679425
Когда данные масштабируются, стандартные отклонения основных компонентов говорят о другом.
cov(scale(mat))
x1 x2 x3 x4
x1 1.00000000 0.017032146 0.144506324 -0.170749431
x2 0.01703215 1.000000000 0.009675918 -0.002570615
x3 0.14450632 0.009675918 1.000000000 0.103959503
x4 -0.17074943 -0.002570615 0.103959503 1.000000000
all.equal(cov(scale(mat)), cor(mat))
[1] TRUE
Изображение говорит тысячу слов:
library(ggbiplot)
library(cowplot)
plot_grid(ggbiplot(pca1),
ggbiplot(pca2),
labels = c("not scaled", "scaled"))
prcomp
с масштабированием должен быть похож на Weighted PCA
в matlab
, где дисперсии обратных переменных используются в качестве весов при выполнении анализа главных компонентов.
[coeff,~,latent,~,explained] = pca(dataset,...'VariableWeights','variance')
У меня нет matlab для тестирования.