Вычисление новых переменных из главных компонентов - PCA в R
Для изучения PCA на R я запустил функцию princomp() (из пакета MASS) для набора данных iris. Я следовал следующие шаги:
library(MASS)
irispca<-princomp(iris[-5])
summary(irispca)
irispca$loadings
Чтобы вычислить основные компоненты, я использовал вывод нагрузок следующим образом:
iris_temp2 <- iris
iris_temp2$Comp.1 <- with(iris_temp2,Sepal.Length*0.361+Petal.Length*0.857+Petal.Width*0.358)
iris_temp2$Comp.2 <- with(iris_temp2,Sepal.Length*(-0.657)+Sepal.Width*(-0.73)+Petal.Length*0.173)
iris_temp2$Comp.3 <- with(iris_temp2,Sepal.Length*(-0.582)+Sepal.Width*0.598+Petal.Width*0.546)
iris_temp2$Comp.4 <- with(iris_temp2,Sepal.Length*0.315+Sepal.Width*(-0.32)+Petal.Length*(-0.48)+Petal.Width*0.754)
iris_temp2 <- with(iris_temp2, iris_temp2[order(Comp.1,Comp.2,Comp.3,Comp.4),])
Наконец, я отсортировал набор данных. Я также узнал, что баллы дают то же самое, что и выше, то есть баллы рассчитываются путем умножения масштабированных данных (на которых вы запускаете PCA) с нагрузками. Поэтому я подумал о том, чтобы сравнить вывод результатов и вывод iris_temp2 (с четырьмя компонентами).
iris_temp1 <- as.data.frame(irispca$scores)
iris_temp1 <- with(iris_temp1, iris_temp1[order(Comp.1,Comp.2,Comp.3,Comp.4),])
Однако, когда я делаю head(iris_temp1) и head(iris_temp2[,6:9]), выходы не совпадают.
Я бы попросил вас, люди, указать причину этого наблюдения. Есть ли что-то, что я неправильно понял? Если вам нужен какой-либо другой вклад с моей стороны, пожалуйста, дайте мне знать.
Я использовал следующие справочные материалы: http://yatani.jp/teaching/doku.php?id=hcistats:pca и https://www.youtube.com/watch?v=I5GxNzKLIoU&spfreload=5.
Спасибо Шанкар
1 ответ
princomp
данные не переупорядочиваются, каждая строка преобразуется в баллы, поэтому нет необходимости переупорядочивать данные при сравнении. Баллы включают в себя как унижение данных, так и изменение базиса матрицей собственных значений.
Это означает, что в первую очередь вам необходимо унижать ваши данные, т.е.
library(MASS)
irispca<-princomp(iris[-5])
iris2 <- as.matrix(iris[-5])
iris2 <- sweep(iris2, MARGIN=2, irispca$center, FUN="-")
Тогда важно понимать, что метод печати для princomp
объекты округляют значения для отображения
irispca$loadings
Loadings:
Comp.1 Comp.2 Comp.3 Comp.4
Sepal.Length 0.361 -0.657 0.582 0.315
Sepal.Width -0.730 -0.598 -0.320
Petal.Length 0.857 0.173 -0.480
Petal.Width 0.358 -0.546 0.754
Но когда мы действительно проверяем один из компонентов, мы видим его полные значения
irispca$loadings[,1]
Sepal.Length Sepal.Width Petal.Length Petal.Width
0.36138659 -0.08452251 0.85667061 0.35828920
Принимая это во внимание, мы имеем
is1 <- list()
is1$Comp.1 <- iris2 %*% irispca$loadings[,1]
is1$Comp.2 <- iris2 %*% irispca$loadings[,2]
is1$Comp.3 <- iris2 %*% irispca$loadings[,3]
is1$Comp.4 <- iris2 %*% irispca$loadings[,4]
score1 <- as.data.frame(is1)
который дает
head(score1, 2)
Comp.1 Comp.2 Comp.3 Comp.4
-2.684126 -0.3193972 0.02791483 0.002262437
2.714142 0.1770012 0.21046427 0.099026550
head(irispca$scores, 2)
Comp.1 Comp.2 Comp.3 Comp.4
[1,] -2.684126 -0.3193972 0.02791483 0.002262437
[2,] -2.714142 0.1770012 0.21046427 0.099026550
Последнее, что следует отметить, о чем не спрашивали, но часто может вызвать путаницу, это то, что если v
является основным компонентом, чем -1 * v
также принципиальный компонент. Многие алгоритмы их определения явно не навязывают ориентацию. Из документов
Знаки столбцов нагрузок и баллов являются произвольными, и поэтому могут различаться в разных программах для PCA и даже в разных сборках R.