eigen
函数中特征向量的符号根据symmetric
参数的规范而变化。请考虑以下示例:
set.seed(1234)
data <- matrix(rnorm(200),nrow=100)
cov.matrix <- cov(data)
vectors.1 <- eigen(cov.matrix,symmetric=TRUE)$vectors
vectors.2 <- eigen(cov.matrix,symmetric=FALSE)$vectors
#The second and third eigenvectors have opposite sign
all(vectors.1 == vectors.2)
FALSE
这也对主成分分析有影响,因为princomp
函数似乎使用eigen
函数计算协方差矩阵的特征向量,symmetric
设置为TRUE
。
pca <- princomp(data)
#princomp uses vectors.1
pca$loadings
Loadings:
Comp.1 Comp.2
[1,] -0.366 -0.931
[2,] 0.931 -0.366
Comp.1 Comp.2
SS loadings 1.0 1.0
Proportion Var 0.5 0.5
Cumulative Var 0.5 1.0
vectors.1
[,1] [,2]
[1,] -0.3659208 -0.9306460
[2,] 0.9306460 -0.3659208
有人可以解释这种差异背后的来源或推理吗?
答案 0 :(得分:4)
特征向量在乘以标量(包括-1)之后仍然是特征向量。
证明很简单:
如果v
是具有匹配特征值A
的矩阵c
的特征向量,那么按定义Av=cv
。
然后,A(-v) = -(Av) = -(cv) = c(-v)
。所以-v
也是具有相同特征值的特征向量。
最重要的是,这无关紧要,也不会改变任何内容。
答案 1 :(得分:3)
像LAPACK这样的线性代数库包含多个子程序,用于执行像eigendecompositions这样的操作。在任何给定情况下使用的特定子例程可能取决于被分解的矩阵的类型,以及用户所需的那些分解。
正如您在eigen
代码中的代码段中所看到的,它会调度不同的LAPACK子例程,具体取决于symmetric=TRUE
还是symmetric=FALSE
(以及矩阵是真实的还是复合物)。
if (symmetric) {
z <- if (!complex.x)
.Internal(La_rs(x, only.values))
else .Internal(La_rs_cmplx(x, only.values))
ord <- rev(seq_along(z$values))
}
else {
z <- if (!complex.x)
.Internal(La_rg(x, only.values))
else .Internal(La_rg_cmplx(x, only.values))
ord <- sort.list(Mod(z$values), decreasing = TRUE)
}
根据?eigen
中的指针,La_rs()
(在symmetric=TRUE
时使用)似乎引用dsyevr而La_rg()
引用dgeev。
为了学习完全为什么这两个算法会切换你传递给eigen()
的矩阵的特征向量的一些符号,你必须深入研究使用的FORTRAN代码实施它们。 (因为正如其他人所指出的那样,这个标志是无关紧要的,我猜你不会想那么深的挖掘;)。
答案 2 :(得分:1)
如果你想改变特征向量元素的符号,那么只需确保$ \ mathbf {1} ^ T \ mathbf {e}&gt; 1 $。换句话说,对每个特征向量中的所有元素求和,并确保总和大于1。如果不是,请将每个元素的符号更改为相反的符号。这是使PCA中的特征向量元素,主成分和负载的符号与大多数统计软件相同的技巧。