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

#r #pca

#r #pca

Вопрос:

Я хотел бы выполнить обратное вычисление главного компонента в R, что означает: получение исходной матрицы самим объектом PCA.

Это примерный случай:

 # Load an expression matrix
load(url("http://www.giorgilab.org/allexp_rsn.rda"))
# Calculate PCA
pca <- prcomp(t(allexp_rsn))
  

Чтобы получить исходную матрицу, следует умножить вращения на сами PCA как таковые:

 test<-pca$rotation%*%pca$x
  

Однако, как вы можете проверить, вычисленная «тестовая» матрица полностью отличается от исходной матрицы «allexp_rsn». Что я делаю не так? Добавляет ли функция prcomp что-то еще к процедуре svs?

Спасибо 🙂

Ответ №1:

Используя USArrests :

 pca <- prcomp(t(USArrests))
out <- t(pca$x%*%t(pca$rotation))
out <- sweep(out, 1, pca$center, ' ')
apply(USArrests - out, 2, sum)
   Murder       Assault      UrbanPop          Rape 
1.070921e-12 -2.778222e-12  3.801404e-13  1.428191e-12 
  

Ответ №2:

Помните, что обязательным условием для выполнения анализа на ПК является масштабирование и центрирование данных. Я полагаю, что prcomp процедура делает это, поэтому pca$x возвращает масштабированные исходные данные (со средним значением 0 и std. равно 1).

Комментарии:

1. По умолчанию центрируется, но не масштабируется.

2. Спасибо, я переоценил это 🙂

Ответ №3:

Вот решение, использующее собственную функцию, применяемую к матрице черно-белого изображения, чтобы проиллюстрировать суть. Функция использует все большее количество компьютеров, но вы можете использовать их все или только некоторые из них

 library(gplots)
library(png) 
# Download an image:
download.file("http://www.giorgilab.org/pictures/monalisa.tar.gz",destfile="monalisa.tar.gz",cacheOK = FALSE)
untar("monalisa.tar.gz")
# Read image:
img <- readPNG("monalisa.png")
# Dimension
d<-1
# Rotate it:
rotate <- function(x) t(apply(x, 2, rev))
centermat<-rotate(img[,,d])
# Plot it
image(centermat,col=gray(c(0:100)/100))
# Increasing PCA
png("increasingPCA.png",width=2000,height=2000,pointsize=20)
par(mfrow=c(5,5),mar=c(0,0,0,0))
for(end in (1:25)*12){
    for(d in 1){
        centermat<-rotate(img[,,d])
        eig <- eigen(cov(centermat))
        n <- 1:end
        eigmat<-t(eig$vectors[,n] %*% (t(eig$vectors[,n]) %*% t(centermat)))
        image(eigmat,col=gray(c(0:100)/100))
    }
}
dev.off()
  

обратная реконструкция PCA Федерико Мануэля Джорджи

Комментарии:

1. Хороший график, к сожалению, невоспроизводимый.