Собственные векторы, возвращаемые функцией R eigen(), неверны?

avatar
Karan Bari
22 сентября 2018 в 16:47
2746
1
2
#eigen values and vectors
a <- matrix(c(2, -1, -1, 2), 2)

eigen(a)

Я пытаюсь найти собственные значения и собственные векторы в R. Функция eigen работает для собственных значений, но есть ошибки в значениях собственных векторов. Можно ли это исправить?

code for eigen value and vectors

Источник
Julius Vainora
22 сентября 2018 в 17:01
3

Что именно вы считаете здесь ошибкой? Имейте в виду, что R возвращает собственные векторы, нормализованные к единице длины, и помните, что в данном случае они также определены с точностью до знака.

Karan Bari
23 сентября 2018 в 15:37
0

собственные векторы должны быть похожи на -1 1 1 -1, но они оказываются десятичными, а ответы чисто не десятичными @JuliusVainora

Julius Vainora
23 сентября 2018 в 20:48
0

Тогда мой комментарий и ответ @李哲源 объясняют это: c(-1, 1) / sqrt(1^2+1^2) равно c(-0.707, 0.707).

Karan Bari
29 сентября 2018 в 14:24
0

Да, я понял твою точку зрения @JuliusVainora. Я искренне извиняюсь за задержку с ответом@李哲源

Ответы (1)

avatar
Zheyuan Li
22 сентября 2018 в 16:55
4

Некоторые документы говорят вам

  • собственный вектор для собственного значения 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 для базиса нулевого пространства. Функция 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
Vassilis Chasiotis
20 октября 2018 в 19:06
0

Да, я имею в виду функцию NullSpace. На самом деле он отлично работает для поиска собственных векторов! Но я думаю, что его можно использовать и как решение линейных однородных систем. В R нет аналогичной функции или кода, который делал бы то, что делает NullSpace.