NumPy का numpy.linalg.pinv() फंक्शन मैट्रिक्स का मूर-पेनरोज़ सूडोइनवर्स (Moore-Penrose pseudoinverse) निकालता है। यह सिंगुलर वैल्यू डीकंपोजिशन (SVD) का उपयोग करता है और गैर-वर्ग, सिंगुलर, या खराब कंडीशन वाले मैट्रिक्स के लिए भी काम करता है।
सिंटैक्स और पैरामीटर्स
numpy.linalg.pinv(a, rcond=1e-15, hermitian=False)
- a: इनपुट मैट्रिक्स (M, N) आकार का।
- rcond: छोटे सिंगुलर मानों के लिए कटऑफ थ्रेशोल्ड। डिफ़ॉल्ट 1e-15।
- hermitian: यदि True, मैट्रिक्स हर्मिटियन माना जाता है।
- वापसी: सूडोइनवर्स मैट्रिक्स, आकार (N, M)।
उदाहरण: रैंडम 9×6 मैट्रिक्स
import numpy as np
# 9x6 रैंडम मैट्रिक्स (ओवरडिटरमाइंड सिस्टम)
np.random.seed(42) # पुनरुत्पादन के लिए
arr = np.random.randn(9, 6)
print("मूल मैट्रिक्स आकार:", arr.shape)
print("डायमेंशन्स:", arr.ndim)
print("डेटा टाइप:", arr.dtype)
# सूडोइनवर्स निकालें (आकार 6x9 होगा)
pinv_arr = np.linalg.pinv(arr)
print("\nसूडोइनवर्स आकार:", pinv_arr.shape)
# सत्यापन: A @ A⁺ @ A ≈ A
check = arr @ pinv_arr @ arr
print("A @ A⁺ @ A ≈ A:", np.allclose(check, arr))
# A⁺ @ A @ A⁺ ≈ A⁺
check2 = pinv_arr @ arr @ pinv_arr
print("A⁺ @ A @ A⁺ ≈ A⁺:", np.allclose(check2, pinv_arr))
आउटपुट (नमूना)
मूल मैट्रिक्स आकार: (9, 6)
डायमेंशन्स: 2
डेटा टाइप: float64
सूडोइनवर्स आकार: (6, 9)
A @ A⁺ @ A ≈ A: True
A⁺ @ A @ A⁺ ≈ A⁺: True
लीस्ट स्क्वेयर्स समाधान के रूप में उपयोग
सिस्टम Ax = b के लिए जहां A (M, N) और M > N (अधिक समीकरण, कम अननोन):
# रैंडम टार्गेट वेक्टर
b = np.random.randn(9)
# लीस्ट स्क्वेयर्स समाधान: x = A⁺b
x_lstsq = pinv_arr @ b
# तुलना: np.linalg.lstsq से
x_np, residuals, rank, s = np.linalg.lstsq(arr, b, rcond=None)
print("pinv समाधान:", x_lstsq)
print("lstsq समाधान:", x_np)
print("समान:", np.allclose(x_lstsq, x_np))
rcond पैरामीटर का प्रभाव
# खराब कंडीशन वाला मैट्रिक्स
A = np.array([[1, 2], [2, 4], [3, 6]], dtype=float) # रैंक 1
print("डिफ़ॉल्ट pinv:\n", np.linalg.pinv(A))
print("rcond=0.1 pinv:\n", np.linalg.pinv(A, rcond=0.1))
print("rcond=1e-5 pinv:\n", np.linalg.pinv(A, rcond=1e-5))
SVD से संबंध
pinv आंतरिक रूप से SVD का उपयोग करता है:
U, s, Vh = np.linalg.svd(arr, full_matrices=False)
# s में छोटे मानों को rcond * max(s) से नीचे सेट करें
s_inv = np.where(s > rcond * s.max(), 1/s, 0)
pinv_manual = (Vh.T * s_inv) @ U.T
व्यावहारिक अनुप्रयोग
- लीस्ट स्क्वेयर्स रिग्रेशन:
β = (XᵀX)⁻¹Xᵀy = X⁺y। - इमेज रिकंस्ट्रक्शन: इनवर्स प्रॉब्लम्स हल करना।
- रोबोटिक्स: इनवर्स काइनेमेटिक्स (रिडंडेंट मैनिपुलेटर्स)।
- सिग्नल प्रोसेसिंग: डीकॉन्वोल्यूशन।
चेतावनी
pinv inv से धीमा है (SVD बनाम LU)। यदि मैट्रिक्स वर्ग और नॉन-सिंगुलर है, तो inv या solve प्राथमिकता दें।