Вычислить обратную матрицу: система является сингулярной в вычислительном отношении [ошибка]

У меня есть матрица m:

(m <- matrix(c(26,14,24,14,20,42,24,42,90), 3))

#      [,1] [,2] [,3]
# [1,]   26   14   24
# [2,]   14   20   42
# [3,]   24   42   90

Когда я запускаю solve(m) для вычисления обратной матрицы, я получаю это сообщение об ошибке:

solve(m)

Ошибка в файле resolve.default (m): система является сингулярной в вычислительном отношении: обратное число условия = 6.21104e-18


person Bilal    schedule 10.01.2016    source источник
comment
Каков ваш ожидаемый результат? Вы хотите найти обобщенно-инверсную матрицу?   -  person Julius Vainora    schedule 10.01.2016


Ответы (2)


Проблема в том, что столбцы не являются линейно независимыми.

Первый столбец * -1/3 + второй столбец * 7/3 равен третьему столбцу.

-m[, 1] * 1/3 + 7/3 * m[, 2]

# [1] 24 42 90
person David Maust    schedule 10.01.2016
comment
Спасибо @rawr за преобразование в R. - person David Maust; 10.01.2016

Мы видим, что это должно быть так несколькими способами, каждый из которых подразумевает необратимость:

1) Определитель m равен нулю:

> det(m)
[1] -2.685852e-12

2) m имеет нулевое собственное значение, то есть eigen(m)$values[3]. Эквивалентно нулевое пространство m не равно нулю - оно равно 1-мерному пространству, охватываемому eigen(m)$vectors[, 3]

> e <- eigen(m); e
$values
[1]  1.180000e+02  1.800000e+01 -6.446353e-15

$vectors
           [,1]          [,2]       [,3]
[1,] -0.2881854  9.486833e-01  0.1301889
[2,] -0.4116935  1.110223e-16 -0.9113224
[3,] -0.8645563 -3.162278e-01  0.3905667

> N <- e$vector[, 3]  # nullspace
> m %*% N  # shows that N is indeed mapped to zero
             [,1]
[1,] 5.329071e-15
[2,] 0.000000e+00
[3,] 0.000000e+00

3) Столбцы m не линейно независимы. В частности, регресс m[,1] в других столбцах дает идеальное совпадение (т.е. подобранные значения равны m[, 1]), поэтому из коэффициентов линейной модели мы имеем 7 * m[,2] - 3 * m[, 3] равно m[, 1].

> fm <- lm(m[, 1] ~ m[, 2] + m[, 3] + 0)

> all.equal(fitted(fm), m[, 1]) # perfect fit
[1] TRUE

> coef(fm)
m[, 2] m[, 3] 
     7     -3 

> all.equal(7 * m[, 2] - 3 * m[, 3], m[, 1])
[1] TRUE

4) На диагонали разложения Холецкого стоит ноль:

> chol(m, pivot = TRUE)
         [,1]     [,2]      [,3]
[1,] 9.486833 2.529822 4.4271887
[2,] 0.000000 4.427189 0.6324555
[3,] 0.000000 0.000000 0.0000000
attr(,"pivot")
[1] 3 1 2
attr(,"rank")
[1] 2
Warning message:
In chol.default(m, pivot = TRUE) :
  the matrix is either rank-deficient or indefinite

5) m не имеет полного ранга, т. е. ранг меньше 3:

> attr(chol(m, pivot = TRUE), "rank")
[1] 2
Warning message:
In chol.default(m, pivot = TRUE) :
  the matrix is either rank-deficient or indefinite

Примечание. Ввод воспроизводимо:

m <- matrix(c(26, 14, 24, 14, 20, 42, 24, 42, 90), 3)
person G. Grothendieck    schedule 10.01.2016
comment
Привет, Г. Гротендик, в моем случае я столкнулся с тем же сообщением об ошибке, что и Ошибка в решении.default (r, result $ Structure): система вычислительно сингулярна: обратное число условия = 6.23118e-19 “. Однако, если я случайно удалю один столбец из данных, он будет работать успешно. Я обнаружил, что нет одной пары корреляции между столбцами ›0.9. Почему это должно происходить? - person pengchy; 28.06.2016
comment
Столбец, который вы удалили, находится в подпространстве, охватываемом другими столбцами, а остальные столбцы линейно независимы. - person G. Grothendieck; 28.06.2016