在R语言中,用stats
包的prcomp
函数算出来的和其它商业软件算出来的一样,但是手算结果的特征向量是另一个结果,比如用prcomp
算出来的为:
dat <- structure(c(3387L, 3109L, 2670L, 3125L, 3469L, 3120L, 3671L,
4531L, 3678L, 3238L, 3135L, 5217L, 3728L, 3506L, 3824L, 3516L,
2200L, 875L, 957L, 1758L, 868L, 398L, 1603L, 523L, 2034L, 1136L,
5326L, 1658L, 1945L, 344L, 807L, 1223L, 1181L, 3532L, 2502L,
4510L, 3032L, 2130L, 1982L, 4675L, 2354L, 4606L, 3044L, 3340L,
2111L, 1291L, 1365L, 1175L, 14861L, 11367L, 13329L, 12328L, 12847L,
13979L, 13528L, 12699L, 13534L, 11609L, 14189L, 15052L, 12236L,
15482L, 14900L, 15078L, 236L, 310L, 1182L, 1208L, 1385L, 1053L,
1046L, 1100L, 1349L, 1150L, 1216L, 660L, 299L, 206L, 239L, 161L),
.Dim = c(16L, 5L),
.Dimnames = list(NULL, c("x1", "x2", "x3", "x4", "x5")))
pca <- prcomp(dat)
pca$sdev^2
#> [1] 2770226.28 1429206.26 628128.63 221138.26 99823.79
pca$rotation
#> PC1 PC2 PC3 PC4 PC5
#> x1 0.04623685 -0.04824957 0.62915050 -0.6428767 0.431756103
#> x2 0.03900887 0.98481068 -0.07669642 -0.1506621 -0.006694838
#> x3 -0.65824478 0.10702841 0.58181284 0.2504276 -0.392477505
#> x4 0.73412440 0.06940658 0.50323172 0.3970439 -0.212974429
#> x5 -0.15529213 0.10745954 0.08086384 0.5862190 0.783674134
但是手算的是
dat <- structure(c(3387L, 3109L, 2670L, 3125L, 3469L, 3120L, 3671L,
4531L, 3678L, 3238L, 3135L, 5217L, 3728L, 3506L, 3824L, 3516L,
2200L, 875L, 957L, 1758L, 868L, 398L, 1603L, 523L, 2034L, 1136L,
5326L, 1658L, 1945L, 344L, 807L, 1223L, 1181L, 3532L, 2502L,
4510L, 3032L, 2130L, 1982L, 4675L, 2354L, 4606L, 3044L, 3340L,
2111L, 1291L, 1365L, 1175L, 14861L, 11367L, 13329L, 12328L, 12847L,
13979L, 13528L, 12699L, 13534L, 11609L, 14189L, 15052L, 12236L,
15482L, 14900L, 15078L, 236L, 310L, 1182L, 1208L, 1385L, 1053L,
1046L, 1100L, 1349L, 1150L, 1216L, 660L, 299L, 206L, 239L, 161L),
.Dim = c(16L, 5L),
.Dimnames = list(NULL, c("x1", "x2", "x3", "x4", "x5")))
dat2 <- scale(dat,scale=FALSE)
dat3 <- t(dat2)
C = 1/(nrow(dat2)-1)*dat3%*%t(dat3)
eigen(C,symmetric = FALSE)
#> eigen() decomposition
#> $values
#> [1] 2770226.28 1429206.26 628128.63 221138.26 99823.79
#>
#> $vectors
#> [,1] [,2] [,3] [,4] [,5]
#> [1,] -0.04623685 -0.04824957 -0.62915050 -0.6428767 -0.431756103
#> [2,] -0.03900887 0.98481068 0.07669642 -0.1506621 0.006694838
#> [3,] 0.65824478 0.10702841 -0.58181284 0.2504276 0.392477505
#> [4,] -0.73412440 0.06940658 -0.50323172 0.3970439 0.212974429
#> [5,] 0.15529213 0.10745954 -0.08086384 0.5862190 -0.783674134
这里的数值倒是一样,但是正负号不对,不过用python算的和手算的一样,为什么啊?