Псевдообратная модель Мура - Пенроуза в программировании на R

Опубликовано: 30 Ноября, 2021

Концепция, используемая для обобщения решения линейного уравнения, известна как псевдообратная матрица Мура - Пенроуза. Обратная матрица Мура - Пенроуза - наиболее широко известный тип псевдообратной матрицы. В псевдообратной линейной алгебре матрицы A является обобщением обратной матрицы. Чаще всего псевдообратное решение используется для вычисления наилучшего решения системы линейных уравнений, не имеющей единственного решения. Термин обобщенный обратный иногда используется как синоним псевдообратного. Язык R предоставляет очень простой метод вычисления псевдообратной матрицы Мура - Пенроуза. Псевдообратная формула используется следующим образом:

where,
A+: Single value decomposition used to calculate the pseudoinverse or the generalized inverse of a numerical matrix
x and b: vectors

Note: Moore – Penrose pseudoinverse solves the problem in the least squared error sense. In general, there is no exact solution to overdetermined problems. So if you cross check the solution you will not get the exact required b but an approx value of b.

Реализация в R

R предоставляет две функции: ginv() которая доступна в библиотеке MASS, pinv() которая доступна в библиотеке pracma, для вычисления обобщенной обратной матрицы Мура-Пенроуза. Эти две функции возвращают произвольную обобщенную обратную матрицу, используя gaussianElimination.

Synatx:
ginv(A)
pinv(A)

Parameter:
A: numerical matrix

Пример 1:
Рассмотрим ниже 3 линейных уравнения:

Эквивалентно можно записать приведенные выше уравнения в матричной форме, как показано ниже:

# Использование ginv()

# R program to illustrate
# solve a linear matrix
# equation of metrics using
# moore – Penrose Pseudoinverse
# Importing library for
# applying pseudoinverse
library(MASS)
# Representing A in
# matrics form in R
A = matrix(
c( 1 , 5 , 11 , 3 , 7 , 13 ),
nrow = 3 ,
ncol = 2 ,
)
cat( "A = : " )
print (A)
# Representing b in
# matrics form in R
b = matrix(
c( 17 , 19 , 23 ),
nrow = 3 ,
ncol = 1 ,
)
cat( "b = : " )
print (b)
# Calculating x using ginv()
cat("Solution of linear equations
using pseudoinverse: ")
x = ginv(A) % * % b
print (x)

Выход:

A =:
     [, 1] [, 2]
[1,] 1 3
[2,] 5 7
[3,] 11 13
b =:
     [, 1]
[1,] 17
[2,] 19
[3,] 23
Решение линейных уравнений 
    используя псевдообратный:
          [, 1]
[1,] -7,513158
[2,] 8.118421

# Использование pinv()

# R program to illustrate
# solve a linear matrix
# equation of metrics using
# moore – Penrose Pseudoinverse
# Importing library for
# applying pseudoinverse
library(pracma)
# Representing A in
# matrics form in R
A = matrix(
c( 1 , 5 , 11 , 3 , 7 , 13 ),
nrow = 3 ,
ncol = 2 ,
)
cat( "A = : " )
print (A)
# Representing b in
# matrics form in R
b = matrix(
c( 17 , 19 , 23 ),
nrow = 3 ,
ncol = 1 ,
)
cat( "b = : " )
print (b)
# Calculating x using pinv()
cat("Solution of linear equations
using pseudoinverse: ")
x = pinv(A) % * % b
print (x)

Выход:

A =:
     [, 1] [, 2]
[1,] 1 3
[2,] 5 7
[3,] 11 13
b =:
     [, 1]
[1,] 17
[2,] 19
[3,] 23
Решение линейных уравнений 
    используя псевдообратный:
          [, 1]
[1,] -7,513158
[2,] 8.118421

Пример 2:
Аналогично, пусть у нас есть линейные уравнения в матричной форме, как показано ниже:

# Использование ginv()

# R program to illustrate
# solve a linear matrix
# equation of metrics using
# moore – Penrose Pseudoinverse
# Importing library for
# applying pseudoinverse
library(MASS)
# Representing A in
# matrics form in R
A = matrix(
c( 1 , 0 , 2 , 0 , 3 , 1 ),
ncol = 3 ,
byrow = F
)
cat( "A = : " )
print (A)
# Representing b in
# matrics form in R
b = matrix(
c( 2 , 1 ),
)
cat( "b = : " )
print (b)
# Calculating x using ginv()
cat("Solution of linear equations
using pseudoinverse: ")
x = ginv(A) % * % b
print (x)

Выход:

A =:
     [, 1] [, 2] [, 3]
[1,] 1 2 3
[2,] 0 0 1
b =:
     [, 1]
[1,] 2
[2,] 1
Решение линейных уравнений 
    используя псевдообратный:
     [, 1]
[1,] -0,2
[2,] -0,4
[3,] 1.0

# Использование pinv()

# R program to illustrate
# solve a linear matrix
# equation of metrics using
# moore – Penrose Pseudoinverse
# Importing library for
# applying pseudoinverse
library(pracma)
# Representing A in
# matrics form in R
A = matrix(
c( 1 , 0 , 2 , 0 , 3 , 1 ),
ncol = 3 ,
byrow = F
)
cat( "A = : " )
print (A)
# Representing b in
# matrics form in R
b = matrix(
c( 2 , 1 ),
)
cat( "b = : " )
print (b)
# Calculating x using pinv()
cat("Solution of linear equations
using pseudoinverse: ")
x = pinv(A) % * % b
print (x)

Выход:

A =:
     [, 1] [, 2] [, 3]
[1,] 1 2 3
[2,] 0 0 1
b =:
     [, 1]
[1,] 2
[2,] 1
Решение линейных уравнений 
    используя псевдообратный:
     [, 1]
[1,] -0,2
[2,] -0,4
[3,] 1.0