Противоречивые результаты при ручном расчете первого основного компонента с использованием prcomp - PullRequest
0 голосов
/ 03 января 2019

Я рассчитываю PCA для набора данных радужной оболочки следующим образом:

data(iris)
ir.pca <- prcomp(iris[, 1:4], center = TRUE, scale. = TRUE)

Это первая строка набора данных радужной оболочки:

head(iris, 1)
#Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1          5.1         3.5          1.4         0.2  setosa

Для первой строки я вижу, что значение первого основного компонента равно -2.257141:

head(ir.pca$x, 1)
#           PC1        PC2       PC3        PC4
#[1,] -2.257141 -0.4784238 0.1272796 0.02408751

Но когда я пытаюсь извлечь нагрузки:

ir.pca$rotation[, 1]
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
0.5210659   -0.2693474    0.5804131    0.5648565 

и сам вычислим первый главный компонент:

0.5210659 * 5.1  + -0.2693474 * 3.5  + 0.5804131 * 1.4 + 0.5648565 * 0.2

Я получаю другой результат 2.64027.

Почему это?

1 Ответ

0 голосов
/ 03 января 2019

Масштабирование - это проблема.

Либо сбросьте масштабирование в вызове prcomp()

data(iris)
ir.pca <- prcomp(iris[, 1:4], center = FALSE, scale. = FALSE)

head(ir.pca$x, 1)
           # PC1      PC2         PC3         PC4
# [1,] -5.912747 2.302033 0.007401536 0.003087706

ir.pca$rotation[, 1] %*% t(iris[1, 1:4])
             # 1
# [1,] -5.912747

, либо масштабируйте iris, прежде чем вручную применить нагрузки

ir.pca <- prcomp(iris[, 1:4], center = TRUE, scale. = TRUE)

head(ir.pca$x, 1)
           # PC1        PC2       PC3        PC4
# [1,] -2.257141 -0.4784238 0.1272796 0.02408751

ir.pca$rotation[, 1] %*% scale(iris[, 1:4])[1,]
          # [,1]
# [1,] -2.257141
...