Hướng dẫn what is pseudo inverse in python? - nghịch đảo giả trong python là gì?

Moore-Penrose Pseudoinverse là một kỹ thuật đại số tuyến tính được sử dụng để xấp xỉ nghịch đảo của các ma trận không thể tin được. Kỹ thuật này có thể xấp xỉ nghịch đảo của bất kỳ ma trận nào, bất kể ma trận có hình vuông hay không. Nói tóm lại, giả gián tồn tại cho tất cả các ma trận. Nếu một ma trận có nghịch đảo, thì nghịch đảo của nó bằng nghịch đảo của nó.

Ý tưởng đằng sau sự gián đoạn giả rất gần với những gì chúng ta đã biết về nghịch đảo của ma trận. Khi chúng ta tạo ra nghịch đảo của ma trận, chúng ta thường tìm thấy một ma trận hoàn tác những gì ma trận gốc đã làm. Vì vậy, thật tốt khi nghĩ về nghịch đảo của ma trận là ma trận ánh xạ (các) vectơ biến đổi trở lại không gian ban đầu của nó.

Nghịch đảo của ma trận được áp dụng khi giải một hệ phương trình tuyến tính. Tuy nhiên, khi giải quyết các hệ thống này, thách thức thường phát sinh là chỉ có thể xác định giải pháp của hệ thống nếu ma trận hệ số không phải là hình vuông và vuông.

Nếu ma trận hệ số đáp ứng hai điều kiện này, thì nó không thể đảo ngược, và do đó, tồn tại một giải pháp duy nhất cho hệ thống, tức là.

Nếu $ a \ in m_ {n \ lần m} $ là không thể đảo ngược, thì hệ thống tuyến tính, $ ax = b $ có một giải pháp duy nhất, tức là, $ a^{-1} ax = a^{-1} b $ $ x = a^{-1} b $

Prerequisites:

  • Phân hủy giá trị số ít
  • Khả năng làm việc với ma trận trong Jupyter Notebook hoặc Google Colab.
  • Kiến thức về các hệ phương trình tuyến tính.

Giới thiệu về giả đảo

Hầu hết thời gian, ma trận hệ số của các hệ phương trình tuyến tính không phải lúc nào cũng vuông và không thể xác định được nghịch đảo của nó. Điều này ngụ ý rằng chúng ta không thể trực tiếp tìm một giải pháp cho một hệ thống tuyến tính nếu đây là trường hợp. Những tình huống này có thể phát sinh theo hai cách có thể. Một là khi một hệ thống tuyến tính được xác định không xác định (ma trận béo ngắn).

Một hệ thống được cho là không xác định được nếu số lượng biến trong hệ thống lớn hơn số lượng phương trình. Trong trường hợp này, hệ thống có thể có vô số giải pháp. Trường hợp sau đây là hệ thống bị xác định quá mức (ma trận cao cấp).

Một hệ thống được gọi là quá mức nếu nó có số lượng phương trình cao hơn nhiều so với số lượng biến. Trong trường hợp này, hệ thống có thể có nhiều giải pháp hoặc không có giải pháp. Bây giờ, để gần đúng giải pháp tốt nhất cho các hệ thống như vậy không có giải pháp duy nhất, chúng tôi sử dụng phân tách giá trị số ít (SVD).

Hãy cho chúng tôi xem SVD tạo điều kiện cho điều này như thế nào. Giả sử chúng ta có một hệ phương trình tuyến tính, $$ AX = B, $$ trong đó ma trận hình chữ nhật A và vector B được biết đến và vector X chưa được biết.

Để giải quyết hệ thống này, chúng ta cần tìm các giá trị cho vectơ x. Trong trường hợp này, A không có nghịch đảo, nhưng chúng ta có thể xấp xỉ nó bằng cách sử dụng phân tách giá trị số ít. Chúng tôi biết, svd của một ma trận, $$ a = uσv^t. $$

Trong hệ thống đã cho, chúng ta có thể thay thế ma trận A bằng SVD của nó, tức là,

AX = b

$ Uσv^tx = b $,

Bây giờ, sẽ dễ dàng hơn nhiều để có được nghịch đảo của các thành phần số ít này của a, tức là, $$ vς^{-1} u^TUσv^tx = vς^{-1} u^tb $$.

Vì $ u^tu $, $ σ^{-1} σ $ và $ vv^t $ u^t Tất cả đều nhân lên để xác định ma trận, và do đó, phương trình của chúng tôi có thể được giảm xuống, $$ \ hat x = vς ^{-1} u^tb $$.

Chúng tôi biểu thị số lượng $ Vς^{-1} u^t $ as $ a^\ Dagger $, tức là, $$ a^\ Dagger = vς^{-1} u^t. $$

Điều này cho:

$ \ hat x = a^\ dagger b $

Số lượng $ a^\ Dagger $ là những gì chúng ta gọi là giả đảo hoặc, nói chung hơn, moore penrose pseudo của ma trận A.

Số lượng này khái quát hóa nghịch đảo của ma trận và nó tồn tại cho bất kỳ ma trận nào bất kể ma trận có hình vuông hay không.

$ A^\ Dagger $ phải đáp ứng bốn điều kiện được gọi là điều kiện giả giả của Moore Penrose. Đó là: 1. $ aa^\ Dagger a = A $ 2. $ a^\ Dagger a a^\ Dagger = a^\ Dagger $ 3. $ (a a^\ Dagger)^* = aa^\ Dagger $ 4. $ (A^\ Dagger A)^* = A^\ Dagger A $

Chúng tôi sẽ không chứng minh những điều kiện này, nhưng bạn có thể tìm thấy bằng chứng ở đây.

Bây giờ, chúng ta hãy xem xét một ví dụ để hiểu cách kỹ thuật này hoạt động bằng trực giác.

Giả sử chúng ta được đưa ra ma trận sau:

$ A = \ start

Chúng tôi được yêu cầu tìm sự gián đoạn giả của nó.

Ma trận này là một ma trận không vuông, vì vậy chúng ta không thể tính toán nghịch đảo của nó. Thay vào đó, chúng ta có thể xấp xỉ nó bằng cách sử dụng Pseudo-Converse. Để làm như vậy, trước tiên chúng tôi tính toán phân tách giá trị số ít của nó.

Phân hủy giá trị số ít của ma trận này sẽ trả về một đầu ra tương tự như được cung cấp dưới đây.

$ U = \ start {bmatrix} \ frac {1} {\ sqrt 3} & \ frac {1} {\ sqrt 2} & \ frac {1} {\ sqrt 6} } & 0 & \ frac {-2} {\ sqrt 6} \ \ frac {1} {\ sqrt 3} & \ frac {-1} {\ sqrt 2} kết thúc {bmatrix} $

$ \ sum = \ start

$ V = \ BẮT ĐẦU {BMATRIX} 0 & 1 & 0 & 1 \ 1 & 0 & 1 & 0 \ 1 & 0 & -1 & 0 \ 0 & -1 & 0 & 1 \ end {bmatrix} $

Tiếp theo, chúng tôi xác định $^\ Dagger $ từ ma trận $ σ $ bằng cách lấy lại tất cả các phần tử khác không và sau đó chuyển ma trận kết quả.

Sản lượng này:

$ \ sum^{\ Dagger} = \ start

Bây giờ chúng ta có tất cả những gì chúng ta cần để tính toán pseudoinverse Moore-Penrose của $ A $.

$A^{\dagger}=V {Σ^\dagger}U^T
=\frac{1}{\sqrt 2}\begin{bmatrix}
    0&1&0&1\\
    1&0&1&0\\
    1&0&-1&0\\
    0&-1&0&1
\end{bmatrix}\begin{bmatrix}
    \frac{1}{\sqrt6} & 0& 0\\
    0&\frac{1}{2}&0\\
    0&0&0\\
    0&0&0
\end{bmatrix}\begin{bmatrix}
    \frac{1}{\sqrt 3} & \frac{1}{\sqrt 3} & \frac{1}{\sqrt 3}\\
    \frac{1}{\sqrt 2} & 0 &\frac{-1}{\sqrt 2}\\
\frac{1}{\sqrt 6} & \frac{-2}{\sqrt 6} & \frac{1}{\sqrt 6}
\end{bmatrix}$

$=\begin{bmatrix}
    0&1&0&1\\
    1&0&1&0\\
    1&0&-1&0\\
    0&-1&0&1
\end{bmatrix}\begin{bmatrix}
    \frac{1}{6} & \frac{1}{6}& \frac{1}{6}\\
    \frac{1}{4}&0&\frac{-1}{4}\\
    0&0&0\\
    0&0&0
\end{bmatrix}=\frac{1}{12}\begin{bmatrix}
    3&0&-3\\
    2&2&2\\
    2&2&2\\
    -3&0&3
\end{bmatrix}$

Giải pháp này là gián đoạn giả của $ A $.

Chúng ta hãy nhìn vào một ví dụ nữa.

Giả sử chúng ta có $ m \ lần n $ một ma trận $, trong đó, $ m \ neq n $, chúng ta hãy xác định gián đoạn giả của nó.

$ A = \ start

Lần này, chúng tôi sử dụng và đồng thời tìm hiểu cách tính tỷ lệ giả giả của Moore-Penrose của ma trận bằng phần mềm. Trong trường hợp của chúng tôi, chúng tôi sẽ thực hiện các tính toán của chúng tôi trong Python.

Triển khai Python của Moore Penrose Pseudoinverse

Ở đây, chúng tôi chỉ cần thư viện

$=\begin{bmatrix}
    0&1&0&1\\
    1&0&1&0\\
    1&0&-1&0\\
    0&-1&0&1
\end{bmatrix}\begin{bmatrix}
    \frac{1}{6} & \frac{1}{6}& \frac{1}{6}\\
    \frac{1}{4}&0&\frac{-1}{4}\\
    0&0&0\\
    0&0&0
\end{bmatrix}=\frac{1}{12}\begin{bmatrix}
    3&0&-3\\
    2&2&2\\
    2&2&2\\
    -3&0&3
\end{bmatrix}$
6 vì nó chứa một gói dành riêng cho đại số tuyến tính. Vì vậy, hãy để chúng tôi nhập thư viện này.

Điều tiếp theo là tạo ma trận của chúng tôi, $ a $. Chúng tôi làm điều này như hình dưới đây.

A = np.array([[-1,2],[3,-2],[5,7]])
print(A)

Output:

Chúng tôi có một ma trận 3 x 2, giống như mong đợi, nhưng vì ma trận này không phải là hình vuông, chúng tôi không thể tìm thấy nghịch đảo của nó.

Tuy nhiên, nó có một gián đoạn giả. Để xác định sự gián đoạn giả của nó, trước tiên chúng ta hãy có được sự phân hủy giá trị số ít của nó.

U,d,VT = np.linalg.svd(A)

Bây giờ chúng ta có thể in ba ma trận này một cách rõ ràng như sau.

Output:

array([[ 0.12708324,  0.47409506,  0.87125411],
       [ 0.00164602, -0.87847553,  0.47778451],
       [ 0.99189069, -0.0592843 , -0.11241989]])

Output:

array([8.66918448, 4.10429538])

Đầu ra:

array([[ 0.55798885,  0.82984845],
       [-0.82984845,  0.55798885]])

Bây giờ, để tính toán $ A^\ Dagger $, chúng tôi yêu cầu V và $ D^\ Dagger $ từ các đầu ra SVD ở trên.

Thật dễ dàng để tính toán V bằng cách sử dụng ma trận

$=\begin{bmatrix}
    0&1&0&1\\
    1&0&1&0\\
    1&0&-1&0\\
    0&-1&0&1
\end{bmatrix}\begin{bmatrix}
    \frac{1}{6} & \frac{1}{6}& \frac{1}{6}\\
    \frac{1}{4}&0&\frac{-1}{4}\\
    0&0&0\\
    0&0&0
\end{bmatrix}=\frac{1}{12}\begin{bmatrix}
    3&0&-3\\
    2&2&2\\
    2&2&2\\
    -3&0&3
\end{bmatrix}$
7 được trả về từ SVD. Vì vậy, nhiệm vụ duy nhất chúng tôi có là tính toán $ d^\ Dagger $. Chúng tôi tạo ra các ma trận như sau.

Để xác định $ d^\ Dagger $, trước tiên chúng tôi tạo một ma trận đường chéo D bằng cách sử dụng các giá trị số ít của vectơ D thu được ở trên.

Mã này tạo ra ma trận đường chéo mà chúng tôi đang tìm kiếm. Thực hiện mã này, chúng ta sẽ nhận được một đầu ra tương tự như quy định dưới đây.

array([[8.66918448, 0.        ],
       [0.        , 4.10429538]])

Điều tiếp theo là lấy đối ứng của tất cả các mục khác không trong ma trận đường chéo này. Lưu ý rằng chúng tôi chỉ lấy đối ứng cho các mục khác không.

Từ mô hình

$=\begin{bmatrix}
    0&1&0&1\\
    1&0&1&0\\
    1&0&-1&0\\
    0&-1&0&1
\end{bmatrix}\begin{bmatrix}
    \frac{1}{6} & \frac{1}{6}& \frac{1}{6}\\
    \frac{1}{4}&0&\frac{-1}{4}\\
    0&0&0\\
    0&0&0
\end{bmatrix}=\frac{1}{12}\begin{bmatrix}
    3&0&-3\\
    2&2&2\\
    2&2&2\\
    -3&0&3
\end{bmatrix}$
8, chúng tôi sử dụng phương thức
$=\begin{bmatrix}
    0&1&0&1\\
    1&0&1&0\\
    1&0&-1&0\\
    0&-1&0&1
\end{bmatrix}\begin{bmatrix}
    \frac{1}{6} & \frac{1}{6}& \frac{1}{6}\\
    \frac{1}{4}&0&\frac{-1}{4}\\
    0&0&0\\
    0&0&0
\end{bmatrix}=\frac{1}{12}\begin{bmatrix}
    3&0&-3\\
    2&2&2\\
    2&2&2\\
    -3&0&3
\end{bmatrix}$
9 để tự động lấy ma trận ở trên.

D_inver = np.linalg.inv(D)
print(D_inver)

Thực hiện mã chúng tôi nhận được:

array([[0.1153511 , 0.        ],
       [0.        , 0.24364718]])

Tiếp theo, chúng tôi để có được sự chuyển đổi của

A = np.array([[-1,2],[3,-2],[5,7]])
print(A)
0 ở trên. Ngoài ra, chúng ta cần lưu ý rằng
A = np.array([[-1,2],[3,-2],[5,7]])
print(A)
0 là ma trận 2 x 2 vuông.

Để đáp ứng luật nhân ma trận, chúng ta cần đảm bảo số lượng cột của $ d^{\ Dagger} $ khớp với số lượng hàng của U.

Vì $ u $ có ba hàng, chúng tôi kết hợp một cột bằng không trên $ d^{\ Dagger} $.

Hãy để chúng tôi làm điều này bằng cách sử dụng mã bên dưới:

$=\begin{bmatrix}
    0&1&0&1\\
    1&0&1&0\\
    1&0&-1&0\\
    0&-1&0&1
\end{bmatrix}\begin{bmatrix}
    \frac{1}{6} & \frac{1}{6}& \frac{1}{6}\\
    \frac{1}{4}&0&\frac{-1}{4}\\
    0&0&0\\
    0&0&0
\end{bmatrix}=\frac{1}{12}\begin{bmatrix}
    3&0&-3\\
    2&2&2\\
    2&2&2\\
    -3&0&3
\end{bmatrix}$
0

Output:

$=\begin{bmatrix}
    0&1&0&1\\
    1&0&1&0\\
    1&0&-1&0\\
    0&-1&0&1
\end{bmatrix}\begin{bmatrix}
    \frac{1}{6} & \frac{1}{6}& \frac{1}{6}\\
    \frac{1}{4}&0&\frac{-1}{4}\\
    0&0&0\\
    0&0&0
\end{bmatrix}=\frac{1}{12}\begin{bmatrix}
    3&0&-3\\
    2&2&2\\
    2&2&2\\
    -3&0&3
\end{bmatrix}$
1

Đây là $ d^\ Dagger $ Matrix của chúng tôi. Bây giờ, chúng tôi có mọi thứ chúng tôi cần để tính toán $ a^† $.

Chúng tôi biết, $ a^= vd^† u^t $ và từ phân tách giá trị số ít của chúng tôi, chúng tôi có u và $ v^t $, giờ đây chúng tôi có thể tính toán thủ đô giả $ a^† $ như sau.

$=\begin{bmatrix}
    0&1&0&1\\
    1&0&1&0\\
    1&0&-1&0\\
    0&-1&0&1
\end{bmatrix}\begin{bmatrix}
    \frac{1}{6} & \frac{1}{6}& \frac{1}{6}\\
    \frac{1}{4}&0&\frac{-1}{4}\\
    0&0&0\\
    0&0&0
\end{bmatrix}=\frac{1}{12}\begin{bmatrix}
    3&0&-3\\
    2&2&2\\
    2&2&2\\
    -3&0&3
\end{bmatrix}$
2

Output:

$=\begin{bmatrix}
    0&1&0&1\\
    1&0&1&0\\
    1&0&-1&0\\
    0&-1&0&1
\end{bmatrix}\begin{bmatrix}
    \frac{1}{6} & \frac{1}{6}& \frac{1}{6}\\
    \frac{1}{4}&0&\frac{-1}{4}\\
    0&0&0\\
    0&0&0
\end{bmatrix}=\frac{1}{12}\begin{bmatrix}
    3&0&-3\\
    2&2&2\\
    2&2&2\\
    -3&0&3
\end{bmatrix}$
3

Trên đây là sự gián đoạn giả của ma trận của chúng tôi. Chúng ta có thể kiểm tra những gì nó cung cấp bằng cách nhân nó với ma trận gốc.

Nó có cung cấp một ma trận nhận dạng như chúng ta mong đợi khi chúng ta nhân một ma trận với nghịch đảo của nó hay không? Hãy cho chúng tôi thấy điều này trong thực tế.

Output:

$=\begin{bmatrix}
    0&1&0&1\\
    1&0&1&0\\
    1&0&-1&0\\
    0&-1&0&1
\end{bmatrix}\begin{bmatrix}
    \frac{1}{6} & \frac{1}{6}& \frac{1}{6}\\
    \frac{1}{4}&0&\frac{-1}{4}\\
    0&0&0\\
    0&0&0
\end{bmatrix}=\frac{1}{12}\begin{bmatrix}
    3&0&-3\\
    2&2&2\\
    2&2&2\\
    -3&0&3
\end{bmatrix}$
4

Thật vậy, đầu ra không xa ma trận nhận dạng. Lưu ý rằng đường chéo hàng đầu có các nguyên tố và tất cả các yếu tố khác trong đường chéo không đáng kể đến mức chúng có thể được coi là bằng không.

Vì vậy, chúng ta có thể kết luận rằng các gián đoạn giả xấp xỉ một ma trận nghịch đảo rất phù hợp. Thật không may, việc thực hiện tất cả các bước này là tốn thời gian này, như chúng tôi đã nhận thấy.

Nếu bạn chỉ quan tâm đến việc nhận được câu trả lời cuối cùng, thì tồn tại một phương thức trong

A = np.array([[-1,2],[3,-2],[5,7]])
print(A)
2 theo mô hình đại số tuyến tính tự động tính toán thủ đoạn giả. Hãy cho chúng tôi xem liệu chúng tôi có thể sử dụng phương pháp đó để có được câu trả lời tương tự như trên không.

Output:

$=\begin{bmatrix}
    0&1&0&1\\
    1&0&1&0\\
    1&0&-1&0\\
    0&-1&0&1
\end{bmatrix}\begin{bmatrix}
    \frac{1}{6} & \frac{1}{6}& \frac{1}{6}\\
    \frac{1}{4}&0&\frac{-1}{4}\\
    0&0&0\\
    0&0&0
\end{bmatrix}=\frac{1}{12}\begin{bmatrix}
    3&0&-3\\
    2&2&2\\
    2&2&2\\
    -3&0&3
\end{bmatrix}$
3

Phương pháp

A = np.array([[-1,2],[3,-2],[5,7]])
print(A)
3 đã cho chúng tôi câu trả lời tương tự mà chúng tôi đã tính toán trước đó.

Sự kết luận

Bài viết này đã giới thiệu chúng tôi với Moore Penrose Pseudo-Inverse. Sử dụng khái niệm này, chúng ta có thể xấp xỉ nghịch đảo của ma trận không vuông, cả bằng tay và thực tế. Điều quan trọng là phải thực hiện một hoạt động như vậy, đặc biệt là với dữ liệu thực.

Điều này liên quan đến việc tìm giải pháp cho các biến khi dữ liệu là ma trận không vuông. Hơn nữa, chúng tôi đã giải thích làm thế nào giả có thể đơn giản hóa công việc. Bây giờ bạn đã biết cách thực hiện gián đoạn giả, bạn có thể tiếp tục và thử thách bản thân bằng cách giải một hệ phương trình tuyến tính bằng cách áp dụng kiến ​​thức bạn có được trong tài liệu này. Điều này sẽ cho sự hiểu biết của bạn một sự củng cố.

đọc thêm

  • Thêm về giả đảo

Đóng góp đánh giá ngang hàng của: Mercy Meave

Pseudo nghịch đảo là gì?

Một cách sử dụng phổ biến của pseudoinverse là tính toán một giải pháp "phù hợp nhất" (bình phương ít nhất) cho một hệ phương trình tuyến tính thiếu giải pháp (xem bên dưới trong các ứng dụng §). Một cách sử dụng khác là tìm giải pháp định mức tối thiểu (Euclide) cho một hệ thống tuyến tính với nhiều giải pháp.compute a "best fit" (least squares) solution to a system of linear equations that lacks a solution (see below under § Applications). Another use is to find the minimum (Euclidean) norm solution to a system of linear equations with multiple solutions.

Làm thế nào để bạn tính toán nghịch đảo giả trong Python?

Để tính toán (moore-penrose) giả của ma trận, sử dụng phương pháp numpy.linalg.pinv () trong Python.Tính nghịch đảo tổng quát của ma trận bằng cách sử dụng phân tách giá trị số ít (SVD) và bao gồm tất cả các giá trị số ít lớn.use the numpy. linalg. pinv() method in Python. Calculate the generalized inverse of a matrix using its singular-value decomposition (SVD) and including all large singular values.

Làm thế nào để giả nghịch đảo làm việc?

Pseudoinverse Moore-Penrose là một ma trận có thể hoạt động như một sự thay thế một phần cho nghịch đảo ma trận trong trường hợp nó không tồn tại.Ma trận này thường được sử dụng để giải một hệ phương trình tuyến tính khi hệ thống không có giải pháp duy nhất hoặc có nhiều giải pháp.a matrix that can act as a partial replacement for the matrix inverse in cases where it does not exist. This matrix is frequently used to solve a system of linear equations when the system does not have a unique solution or has many solutions.

Làm thế nào để bạn tìm thấy nghịch đảo giả?

Chúng ta có thể đánh giá Pseudoinverse A+ theo nhiều cách.Nếu bạn sử dụng phân tách giá trị số ít để thu được các điều khoản của a = u ⋅ s ⋅ v t a = u \ cdot s \ cdot v^t a = u⋅s⋅vt, thì bạn có thể dễ dàng tính toán pseudoinverse của A với a + = v ⋅ s+U t a^+= v \ cdot s^+\ cdot u^t a+= v⋅s+⋅ut.A + = V ⋅ S + ⋅ U T A^+ = V\cdot S^+\cdot U^T A+=V⋅S+⋅UT.