Vorrei capire come posso ottenere la percentuale di varianza di un set di dati, non nello spazio di coordinate fornito da PCA, ma rispetto a un set leggermente diverso di vettori (ruotati).
set.seed(1234)
xx <- rnorm(1000)
yy <- xx * 0.5 + rnorm(1000, sd = 0.6)
vecs <- cbind(xx, yy)
plot(vecs, xlim = c(-4, 4), ylim = c(-4, 4))
vv <- eigen(cov(vecs))$vectors
ee <- eigen(cov(vecs))$values
a1 <- vv[, 1]
a2 <- vv[, 2]
theta = pi/10
rotmat <- matrix(c(cos(theta), sin(theta), -sin(theta), cos(theta)), 2, 2)
a1r <- a1 %*% rotmat
a2r <- a2 %*% rotmat
arrows(0, 0, a1[1], a1[2], lwd = 2, col = "red")
arrows(0, 0, a2[1], a2[2], lwd = 2, col = "red")
arrows(0, 0, a1r[1], a1r[2], lwd = 2, col = "green3")
arrows(0, 0, a2r[1], a2r[2], lwd = 2, col = "green3")
legend("topleft", legend = c("eigenvectors", "rotated"), fill = c("red", "green3"))
Quindi, in sostanza, so che la varianza del set di dati lungo ciascuno degli assi rossi, data da PCA, è rappresentata dagli autovalori. Ma come ho potuto ottenere le varianze equivalenti, totalizzando la stessa quantità, ma proiettando i due diversi assi in verde, che sono una rotazione di pi / 10 degli assi componenti principali. Ad esempio, dati due vettori di unità ortogonali dall'origine, come posso ottenere la varianza di un set di dati lungo ciascuno di questi assi arbitrari (ma ortogonali), in modo tale che tutta la varianza sia calcolata (ovvero "autovalori" somma allo stesso di quella di PCA).