r - R 函数 eigen() 返回的特征向量是否错误?
问题描述
#eigen values and vectors
a <- matrix(c(2, -1, -1, 2), 2)
eigen(a)
我正在尝试在 R 中查找特征值和特征向量。函数eigen
适用于特征值,但特征向量值存在错误。有没有办法解决这个问题?
解决方案
一些文书工作告诉你
- 特征值 3 的特征向量适用
(-s, s)
于任何非零实数值s
; - 特征值 1 的特征向量适用
(t, t)
于任何非零实数值t
。
将特征向量缩放到单位长度给出
s = ± sqrt(0.5) = ±0.7071068
t = ± sqrt(0.5) = ±0.7071068
缩放是好的,因为如果矩阵是实对称的,则特征向量矩阵是正交的,因此它的逆是它的转置。以您的真实对称矩阵a
为例:
a <- matrix(c(2, -1, -1, 2), 2)
# [,1] [,2]
#[1,] 2 -1
#[2,] -1 2
E <- eigen(a)
d <- E[[1]]
#[1] 3 1
u <- E[[2]]
# [,1] [,2]
#[1,] -0.7071068 -0.7071068
#[2,] 0.7071068 -0.7071068
u %*% diag(d) %*% solve(u) ## don't do this stupid computation in practice
# [,1] [,2]
#[1,] 2 -1
#[2,] -1 2
u %*% diag(d) %*% t(u) ## don't do this stupid computation in practice
# [,1] [,2]
#[1,] 2 -1
#[2,] -1 2
crossprod(u)
# [,1] [,2]
#[1,] 1 0
#[2,] 0 1
tcrossprod(u)
# [,1] [,2]
#[1,] 1 0
#[2,] 0 1
如何使用教科书方法找到特征向量
教科书的方法是求解齐次系统:(A - λI)x = 0
为 Null Space 基。我这个答案中的NullSpace
功能会有所帮助。
## your matrix
a <- matrix(c(2, -1, -1, 2), 2)
## knowing that eigenvalues are 3 and 1
## eigenvector for eigenvalue 3
NullSpace(a - diag(3, nrow(a)))
# [,1]
#[1,] -1
#[2,] 1
## eigenvector for eigenvalue 1
NullSpace(a - diag(1, nrow(a)))
# [,1]
#[1,] 1
#[2,] 1
如您所见,它们没有“标准化”。相比之下,给出“归一化”特征向量,因此您得到的结果与(直至可能的符号翻转)pracma::nullspace
的输出一致:eigen
library(pracma)
nullspace(a - diag(3, nrow(a)))
# [,1]
#[1,] -0.7071068
#[2,] 0.7071068
nullspace(a - diag(1, nrow(a)))
# [,1]
#[1,] 0.7071068
#[2,] 0.7071068
推荐阅读
- javascript - 即使重新初始化后值也未定义
- python - 使用 Seaborn 为 x 轴绘制超过 10K 的数据点作为时间戳
- javascript - 从 ajax 调用在 Flask 中渲染模板
- node.js - 找不到模块,无法解决 Angular 中的错误
- python - 如何从 pyspark sql 上的大表中选择除 2 之外的所有列?
- django-views - 覆盖 AllAuth 视图并将上下文数据传递给模板
- php - 在一个 CodeIgniter 控制器会话是空的,在其他所有工作
- angular - ngOnChanges Angular 不适用于双向数据绑定 [(ngModel)]
- android - Retrofit Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $ in onActivityResult
- kubespray - 如何更改当前上下文