چیتشیت
جبر خطی برای یادگیری ماشین
Linear Algebra for ML
بردارها، تبدیلها، مقادیر ویژه، SVD و حلکنندههای Ax = b. پایتون از صفر و NumPy برگرفته از درسها.
فهرست مطالب
SVD: دوران، مقیاس، دوران
معماریحذف گاوسی با محورگیری جزئی
گامبهگام- محور (Pivot)در ستون k، بزرگترین درایه را در سطر k یا زیر آن پیدا کنید.
- جابجاییآن سطر را با سطر k جابجا کنید. محور کوچک خطاهای گردکردن را تشدید میکند.
- بررسیمحور کمتر از
1e-12خطایValueErrorصادر میکند. - حذفبرای هر سطر i زیر k، مقدار m = A[i][k] / A[k][k] را محاسبه کنید. سپس m برابر سطر k را کم کنید.
- جانشینی پسروابتدا آخرین معادله را حل کنید، سپس به سمت بالا بروید.
- استفاده مجددماتریس L ضرایب را ذخیره میکند. U ماتریس حاصل از حذف است. PA = LU.
وظایف در NumPy
کار و کد| وظیفه | کد |
|---|---|
| ضرب داخلی و طول | `np.dot(a, b)`, `np.linalg.norm(a)` |
| ضرب ماتریسی | A @ B |
| ضرب نظیربهنظیر | A * B |
| رتبه | np.linalg.matrix_rank(A) |
| مقادیر ویژه و بردارهای ویژه | np.linalg.eig(A) |
| Thin SVD | np.linalg.svd(A, full_matrices=False) |
| کمترین مربعات | np.linalg.lstsq(A, b, rcond=None)[0] |
| QR، بررسی Q | np.allclose(Q @ Q.T, np.eye(3)) |
مقطوعسازی، فشردهسازی و وارونسازی با SVD
کدpython
U, S, Vt = np.linalg.svd(A, full_matrices=False) # S مرتبشده به صورت نزولی
A_k = U[:, :k] @ np.diag(S[:k]) @ Vt[:k, :] # بهترین تقریب با رتبه k
compressed_size = k * (rows + cols + 1) # حافظه لازم برای رتبه k
A_pinv = Vt.T @ np.diag(1.0 / S) @ U.T # شبهوارون، فقط برای S غیرصفر
x_svd = A_pinv @ b # پاسخ کمترین مربعات
x_pinv = np.linalg.pinv(A) @ b # همان نتیجه از NumPy
U, S, V = svd_from_scratch(A) # تکرار توانی و کاهش رتبه (deflation)
A_pinv = pseudoinverse_via_svd(A, tol=1e-10) # 1/s تنها برای s بالاتر از tol
حل Ax = b از صفر
کدpython
x = gaussian_elimination(A, b) # محورگیری جزئی، O(n^3)
P, L, U = lu_decompose(A) # PA = LU، فقط یکبار پرداخت هزینه O(n^3)
x = lu_solve(P, L, U, b) # O(n^2) برای هر b جدید
L = cholesky(A) # A = L L^T، فقط برای متقارن معین مثبت
x = cholesky_solve(L, b) # جانشینی پیشرو، سپس جانشینی پسرو
w_ols = least_squares_normal(X, y) # معادله A^T A x = A^T b را حل میکند
w_ridge = ridge_regression(X, y, lam=1.0) # اضافه کردن lam * np.eye(n)
x, iters = conjugate_gradient(A, b) # SPD، حداکثر n تکرار
kappa = condition_number(A) # S[0] / S[-1]، بینهایت اگر منفرد باشد
ماتریسهای تبدیل
دستورها| دستور | عملکرد |
|---|---|
rotation_2d(theta) | [[c, -s], [s, c]]. فواصل را حفظ میکند. دترمینان 1 |
scaling_2d(sx, sy) | [[sx, 0], [0, sy]]. دترمینان sx * sy است |
shearing_2d(kx, ky) | [[1, kx], [ky, 1]]. مستطیلها به متوازیالاضلاع تبدیل میشوند |
reflection_y() | [[-1, 0], [0, 1]]. جهتگیری را وارونه میکند. دترمینان -1 |
reflection_x() | [[1, 0], [0, -1]]. دترمینان -1 |
mat_mul(S, R) | ابتدا دوران، سپس تغییر مقیاس. ترتیب مهم است |
eigenvalues_2x2(matrix) | ریشههای معادلهی مشخصه. اگر مبین < 0 باشد مختلط است |
eigenvector_2x2(matrix, eigenvalue) | بردار ویژه یکه برای یک مقدار ویژه |
فرمولهای کلیدی
مفهومها- ابعاد
- (m x n) @ (n x p) = (m x p). ابعاد درونی باید مطابقت داشته باشند.
- کسینوس
- $\cos\theta = \frac{a \cdot b}{\lvert a\rvert \lvert b\rvert}$. مقدار 1 همجهت و 0 متعامد است.
- تصویر
- $\text{proj}_b a = \frac{a \cdot b}{b \cdot b} b$. باقیمانده بر $b$ عمود است.
- ویژه
- $Av = \lambda v$. مقادیر ویژه ریشههای $\det(A - \lambda I) = 0$ هستند.
- مقادیر ویژه ماتریس 2x2
- $\lambda^2 - (a+d)\lambda + (ad - bc) = 0$.
- تجزیه مقادیر منفرد (SVD)
- $A = U \Sigma V^T$ و $A v_i = \sigma_i u_i$. رتبه تعداد $\sigma_i$ غیرصفر است.
- معادلات نرمال
- $A^T A x = A^T b$. رگرسیون ریج $\lambda I$ را به $A^T A$ اضافه میکند.
- عدد حالت
- $\kappa = \sigma_{\max} / \sigma_{\min}$.
انتخاب حلکننده
دستورها| دستور | عملکرد |
|---|---|
Gaussian elimination | ماتریس A مربعی و نامنفرد. O(n^3). یکبار حل |
LU decomposition | چندین حل با همان ماتریس A. برای هر حل O(n^2) |
QR decomposition | کمترین مربعات با m >= n. از نظر عددی پایدار |
Cholesky | ماتریس A متقارن معین مثبت. دو برابر سریعتر از LU |
Normal equations | فرامعین، n کوچک. رگرسیون خطی |
SVD / pseudoinverse | ماتریس A با رتبه ناقص. پاسخ با کمترین نرم |
Conjugate gradient | ماتریس A بزرگ، خلوت و SPD. روش تکراری |
اعداد و مقادیر پیشفرض
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
Zero test in `rank()` | 1e-10 | درایههای کوچکتر صفر به شمار میروند |
Pivot test in elimination | 1e-12 | محور کوچکتر خطا صادر میکند: ValueError |
`power_iteration` `num_iters` | 200 | توقف زودهنگام در tol=1e-10 |
`conjugate_gradient` `tol` | 1e-10 | مقدار پیشفرض max_iter برابر n است |
Safe condition number | < 100 | پاسخ دقیق است |
Meaningless for float64 | 10^{16} | ماتریس عملاً منفرد است |
Image at rank k=50 | 14.6% | از بین مقادیر 800 x 600 |
LoRA rank | 16 | 131K پارامتر، نه 16M |
عیبیابی
عیبیابیخطای عدم تطابق ابعاد
- علت
- ابعاد درونی با هم تفاوت دارند
- راهحل
- قبل از ضرب کردن، ابعاد هر کدام را بنویسید
تابع
inverse_2x2خطای ValueError میدهد- علت
- دترمینان 0 است
- راهحل
- از شبهوارون استفاده کنید
"Matrix is not positive definite"
- علت
- ماتریس A از نوع SPD نیست
- راهحل
- مقدار lambda I را اضافه کنید، یا از LU استفاده کنید
نوسان شدید وزنها با تغییرات کوچک ورودی
- علت
- ویژگیهای همخط، رتبه ناقص
- راهحل
- حذف ویژگیها یا افزودن منظمسازی
پاسخ ارقام بااهمیت خود را از دست میدهد
- علت
- kappa نزدیک به 10^k باعث از دست رفتن k رقم میشود
- راهحل
- منظمسازی کنید، یا از QR یا SVD استفاده نمایید
دستور
np.linalg.eig(A.T @ A)نادقیق است- علت
- عدد حالت را به توان دو میرساند
- راهحل
- از
np.linalg.svd(A)استفاده کنید
ترکیب توابع به نقطه اشتباهی ختم میشود
- علت
- عملگر B @ A ابتدا A را اعمال میکند
- راهحل
- به ترتیب معکوس اعمال، ضرب کنید
ضربهای داخلی Gram-Schmidt دقیقاً 0 نیستند
- علت
- محاسبات ممیز شناور
- راهحل
- با یک آستانه تحمل مانند 1e-9 مقایسه کنید
پرسشها
پرسش و پاسخ- چرا فاکتورگیری با LU؟
- هزینه O(n^3) فقط یک بار پرداخت میشود. هر b جدید هزینهای برابر O(n^2) دارد.
- چه زمانی روش Cholesky پاسخ میدهد؟
- ماتریس A متقارن معین مثبت باشد. ماتریس $X^T X + \lambda I$ برای $\lambda > 0$ از نوع SPD است.
- دترمینان چه چیزی را نشان میدهد؟
- ضریب مقیاس مساحت را. مقدار 0 یک بعد را فشرده و محو میکند. -1 جهتگیری را وارونه میسازد.
- چرا تجزیه مقادیر منفرد مقطوع بهترین رتبه k است؟
- قضیه Eckart-Young. خطای طیفی برابر است با $\sigma_{k+1}$.
- مقادیر ویژه چه چیزی درباره پایداری میگویند؟
- اندازه بزرگتر از 1 منفجر میشود. اندازه زیر 1 ناپدید (صفر) میشود.
نکات
نکتهها- تحلیل مؤلفههای اصلی (PCA) همان SVD روی دادههای میانگینصفر است. مؤلفهها همان بردارهای منفرد راست V هستند.
- واریانس تبیینشده برای هر مؤلفه برابر sigma_i^2 / (n-1) است.
- به دنبال یک شکاف واضح در مقادیر منفرد باشید. مقادیر بالاتر از آن را برای نویززدایی نگه دارید.
- ریج، عدد حالت را به $(\sigma_{\max} + \lambda) / (\sigma_{\min} + \lambda)$ بهبود میبخشد.
- در حالتی که چندین پاسخ وجود دارد، شبهوارون پاسخی با کوچکترین نرم را به دست میدهد.
- مقداردهی اولیه متعامد از QR برای ساختن ستونهای وزنی راستهنجار استفاده میکند.