Вычисление PCA для набора данных с использованием Matlab и R, но с разной дисперсией на компонент - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь визуализировать 5-элементный набор данных с использованием PCA. Я использую и matlab, и R. В R я использую команду prcomp (), а в matlab я использую команду pca (). Оба используют SVD для получения основных компонентов, но я получаю огромную разницу в дисперсии в каждом из основных компонентов между Matlab и R. В Matlab я получаю 95% дисперсию в первом компоненте и 3% во втором, в то время как в R первый компонент имеет примерно 42-процентную дисперсию и около 28% на второй. Почему они так сильно меняются?

Могу также упомянуть, что планирую позже использовать данные для модели машинного обучения и хотел бы использовать основные компоненты для уменьшения размерности. Должен ли я использовать результат от Matlab или R?

Sidenote: Я отображаю дисперсию для компонента в R, используя fviz_eig ().

Редактировать:

Код R:

res.pca <- prcomp(dataset, scale=TRUE)
fviz_eig(res.pca)

Код Matlab:

[coeff, score,~,~,var, mean] = pca(dataset,'algorithm','SVD');
bar(var)

«Набор данных» представляет собой CSV-файл с 5 объектами, и каждый объект содержит 257493 наблюдений.

1 Ответ

0 голосов
/ 09 мая 2018

Как отметил @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"))

enter image description here

prcomp с масштабированием должен быть похож на Weighted PCA в matlab, где дисперсии обратных переменных используются в качестве весов при выполнении анализа главных компонентов.

[coeff,~,latent,~,explained] = pca(dataset,...'VariableWeights','variance')

У меня нет matlab для тестирования.

...