Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. A = U @ diag(s) @ Vt
- 2.2. Geometriya: burish → cho'zish → burish
- 2.3. Singulyar qiymatlar va rank
- 2.4. Past rankli yaqinlashtirish (Eckart-Young)
- 2.5. SVD va xos qiymatlar aloqasi
- 2.6. Rasm siqish
- 2.7. SVD tuzoqlari
- 2.8. SVD — har qanday matritsaning skeleti
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — SVD va tiklash
- Misol 2 — Geometriya: aylana → ellips
- Misol 3 — Rasm siqish (past rankli yaqinlashtirish)
- Misol 4 — Tavsiya: yashirin omillar
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
10.8-dars: SVD — singulyar yoyilma
10-QISM — CHIZIQLI ALGEBRA · 8-dars
1. Kirish va motivatsiya
Xos qiymatlar 10.7-bob faqat kvadrat matritsalar uchun ishlaydi, va eng yaxshi xossalari faqat simmetrik matritsalarda. Lekin Data Science'dagi matritsalar ko'pincha to'rtburchak: 10 000 mijoz × 50 belgi, 1 000 foydalanuvchi × 5 000 film, 600 × 800 piksel rasm. SVD (Singular Value Decomposition, singulyar yoyilma) — har qanday matritsa uchun ishlaydigan "xos" yoyilma: A = U @ diag(s) @ Vt. Ko'pchilik matematiklar uni chiziqli algebraning eng muhim teoremasi deb biladi.
SVD geometrik jihatdan juda sodda: har qanday chiziqli o'zgartirish = burish (Vt) → o'qlar bo'yicha cho'zish (s) → yana burish (U). Uning eng kuchli qo'llanilishi — past rankli yaqinlashtirish: faqat eng katta k ta singulyar qiymatni saqlab, matritsani eng yaxshi tarzda "siqish" (Eckart-Young teoremasi). Bu rasm siqish, tavsiya tizimlari (Netflix mukofoti), shovqinni tozalash, matndagi yashirin mavzular (LSA), PCA 10.9-bob va lstsq 10.6-bob ning ichki mexanizmi.
Real vaziyat. Kinoteatr ilovasida 300 foydalanuvchi × 80 film baholari bor, lekin baholarning atigi 20% i ma'lum. Savol: foydalanuvchi ko'rmagan filmni qanday baholardi? SVD g'oyasi: baholarni bir nechta yashirin omil tushuntiradi (masalan, "jangari ↔ drama", "yangi ↔ klassik"). Har foydalanuvchi — shu omillarga moyillik vektori, har film — shu omillar bo'yicha profil. Past rankli (k = 3) yaqinlashtirish bo'sh kataklarni to'ldiradi. Ma'lum baholarning bir qismini yashirib tekshirishda xato (RMSE) "o'rtacha baho" usulidagi 0.91 dan 0.62 ga tushadi (Misol 4).
Bu darsda SVD ni o'rganamiz.
Bu darsda:
- A = U @ diag(s) @ Vt
- Geometriya: burish → cho'zish → burish
- Singulyar qiymatlar va rank
- Past rankli yaqinlashtirish (Eckart-Young)
- SVD va xos qiymatlar aloqasi
- Rasm siqish
- SVD tuzoqlari
- Amaliy: tavsiya tizimi (yashirin omillar)
ℹ Misollar real numpy bilan (Python 3.14).
2. Nazariya — chuqur tushuntirish
2.1. A = U @ diag(s) @ Vt
A (m × n) = U (m × m) @ Sigma (m × n) @ Vt (n × n)
U — ortogonal (U.T @ U = I): ustunlari — "chap singulyar vektorlar" (qatorlar fazosi uchun)
s — singulyar qiymatlar: s1 >= s2 >= ... >= 0 (kamayish tartibida, doim manfiy emas)
Vt — ortogonal: qatorlari — "o'ng singulyar vektorlar" (ustunlar/belgilar fazosi uchun)
"Iqtisodiy" SVD (full_matrices=False): U (m × r), s (r), Vt (r × n), r = min(m, n)
U, s, Vt = np.linalg.svd(A, full_matrices=False)
A == U @ np.diag(s) @ Vt SVD — har qanday matritsani uchta sodda matritsaga ajratadi: ikkita ortogonal (burish/aks) va bitta diagonal (cho'zish). NumPy svd — s ni kamayish tartibida qaytaradi (eigh dan farqli!), Vt — allaqachon transponirlangan (qatorlari — vektorlar). Ma'lumot matritsasi X (n × p) uchun: Vt qatorlari — belgilar fazosidagi asosiy yo'nalishlar (PCA komponentalari, 10.9), U @ diag(s) — kuzatuvlarning shu yo'nalishlardagi koordinatalari.
2.2. Geometriya: burish → cho'zish → burish
A @ x = U @ (s × (Vt @ x))
1. Vt @ x — x ni burish (yangi o'qlarga o'tkazish)
2. s × ... — har o'q bo'yicha s_i marta cho'zish (o'lcham o'zgarishi ham mumkin)
3. U @ ... — natijani chiqish fazosida burish
Birlik aylana → A → ellips: yarim o'qlari uzunligi = s1, s2; yo'nalishlari = U ustunlariSVD geometrik jihatdan har qanday chiziqli o'zgartirish faqat uch qadamdan iboratligini aytadi: burish, o'qlar bo'yicha cho'zish, burish. Birlik aylana (sfera) har doim ellipsga (ellipsoidga) o'tadi: eng katta s — eng uzun yarim o'q (eng ko'p cho'zilgan yo'nalish), eng kichik — eng qisqa. s_i = 0 — shu yo'nalish "yassilanadi" (rank kamayadi, 10.5).
2.3. Singulyar qiymatlar va rank
Singulyar qiymatlar matritsaning "kuchi"ni o'lchaydi: rank = nolmas s lar soni (amalda: s > tol; matrix_rank aynan shunday ishlaydi); L2 norma (eng katta cho'zish) = s1; shart soni = s1 / s_min 10.5-bob — np.linalg.cond aynan shu; Frobenius norma (barcha elementlar kvadratlari yig'indisining ildizi) = sqrt(sum(s^2)). Singulyar qiymatlar spektri ma'lumot haqida ko'p gapiradi: tez so'nsa — ma'lumotda past o'lchamli tuzilma bor (siqish mumkin); tekis bo'lsa — tuzilma yo'q (shovqin).
2.4. Past rankli yaqinlashtirish (Eckart-Young)
A_k = U[:, :k] @ diag(s[:k]) @ Vt[:k, :] — faqat eng katta k ta singulyar qiymat
Eckart-Young teoremasi: rank-k matritsalar orasida A ga ENG YAQINI — A_k
xato ||A - A_k||_F = sqrt(s_{k+1}^2 + ... + s_r^2)
"saqlangan energiya" = sum(s[:k]^2) / sum(s^2)
Saqlash: m × n → k × (m + n + 1) son
1000 × 1000 rasm, k = 50: 1 000 000 → 100 050 (≈ 10%)Past rankli yaqinlashtirish — SVD ning eng muhim amaliy natijasi: A ni k ta "qatlam" (s_i × u_i × v_i.T) yig'indisi sifatida ko'rish mumkin, har qatlam — rank-1 matritsa, muhimligi s_i bilan. Birinchi k qatlamni saqlash — optimal siqish (Eckart-Young: boshqa hech bir rank-k matritsa yaqinroq emas). Qo'llanilishi: siqish (rasm, matritsa), shovqinni tozalash (kichik s — ko'pincha shovqin), yashirin omillar (tavsiya, LSA). k ni tanlash — "saqlangan energiya" (masalan, 90%) yoki validatsiya bilan.
2.5. SVD va xos qiymatlar aloqasi
X = U S Vt → X.T @ X = V S^2 Vt (belgilar, p × p)
X @ X.T = U S^2 U.T (kuzatuvlar, n × n)
X.T X ning xos vektorlari = V (o'ng singulyar vektorlar)
X.T X ning xos qiymatlari = s^2
Markazlashtirilgan X uchun: kovariatsiya xos qiymatlari = s^2 / (n - 1) → PCA (10.9) SVD va xos yoyilma chambarchas bog'liq: X ning o'ng singulyar vektorlari — X.T X ning (markazlashtirilganda — kovariatsiyaning) xos vektorlari; singulyar qiymatlar kvadratlari — xos qiymatlar. Amaliy xulosa: PCA ni kovariatsiya xos yoyilmasi 10.7-bob orqali ham, to'g'ridan-to'g'ri X ning SVD si orqali ham qilish mumkin — ikkinchisi barqarorroq (X.T X ni hisoblash shart sonini kvadratga oshiradi, 10.6); sklearn PCA va lstsq SVD ishlatadi.
2.6. Rasm siqish
Oq-qora rasm — matritsa 10.3-bob; SVD bilan k ta qatlam saqlanadi: k kichik — xira, lekin asosiy shakllar ko'rinadi; k oshgan sari tafsilotlar qaytadi. Tabiiy rasmlarda singulyar qiymatlar tez so'nadi — shuning uchun kichik k bilan yaxshi sifat. Rangli rasm — har kanal (R, G, B) alohida. Amalda JPEG boshqa usul (DCT) ishlatadi, lekin SVD siqish — past rankli yaqinlashtirishni ko'z bilan ko'rish uchun eng yaxshi misol.
2.7. SVD tuzoqlari
Asosiy tuzoqlar: Vt ni V deb olish (NumPy allaqachon transponirlangan qaytaradi — vektorlar qatorlarda: Vt[0]); full_matrices=True (standart! katta m da U — m × m ulkan matritsa; odatda full_matrices=False); s — vektor (np.diag(s) bilan matritsaga); ishora ixtiyoriy (u_i va v_i ikkalasi -1 ga ko'paysa — yoyilma o'zgarmaydi); markazlashtirmasdan PCA (SVD o'rtachani ham "komponenta" deb oladi — 10.9); katta siyrak matritsaga to'liq SVD (sekin, xotira — scipy.sparse.linalg.svds yoki TruncatedSVD, faqat k ta); bo'sh kataklarni 0 deb (tavsiya: 0 — "yomon baho" emas, "noma'lum"; to'ldirish usuli muhim); k ni o'quv xatosi bilan tanlash (k oshsa har doim yaxshilanadi — validatsiya kerak).
2.8. SVD — har qanday matritsaning skeleti
SVD: A = U diag(s) Vt — har qanday matritsa uchun; U, V — ortogonal (burish), s — kamayish tartibidagi cho'zishlar; geometriya — aylana → ellips; rank = nolmas s soni, cond = s1/s_min; past rankli yaqinlashtirish A_k — optimal (Eckart-Young), energiya ulushi sum(s[:k]^2)/sum(s^2); X.T X xos vektorlari = V, xos qiymatlari = s^2 (PCA, lstsq ichida); rasm siqish, shovqin tozalash, tavsiya (yashirin omillar), LSA. Keyingi dars — PCA: SVD ni ma'lumot tahliliga qo'llash.
3. Tez ma'lumotnoma
import numpy as np
U, s, Vt = np.linalg.svd(A, full_matrices=False) # iqtisodiy SVD
np.allclose(A, U @ np.diag(s) @ Vt) # tiklash
k = 10
A_k = U[:, :k] @ np.diag(s[:k]) @ Vt[:k] # past rankli yaqinlashtirish
energiya = (s[:k] ** 2).sum() / (s ** 2).sum()
np.sum(s > 1e-10) # rank
s[0] / s[-1] # shart soni
Vt[0] # 1-o'ng singulyar vektor (QATOR)
# katta/siyrak — faqat k ta
from sklearn.decomposition import TruncatedSVD
TruncatedSVD(n_components=k, random_state=0).fit_transform(X)
QOIDA: full_matrices=False · Vt qatorlari · s kamayish tartibida · PCA — avval markazlashtirSVD xulosasi
A = U diag(s) Vt — har qanday matritsa; U, V ortogonal, s >= 0 kamayuvchi
Geometriya: burish → cho'zish → burish; aylana → ellips
rank = nolmas s soni; cond = s1 / s_min
A_k — eng yaxshi rank-k yaqinlashtirish (Eckart-Young)
X.T X: xos vektorlar = V, xos qiymatlar = s^2
Siqish, shovqin, tavsiya, LSA, PCA, lstsq4. Batafsil misollar
Misollar real numpy bilan (Python 3.14).
Misol 1 — SVD va tiklash
"""SVD: U, s, Vt; ortogonallik, tiklash, rank, cond (real numpy)."""
import numpy as np
def main() -> None:
rng = np.random.default_rng(0)
A = rng.normal(size=(5, 3))
print("=== 1. Shakllar (iqtisodiy SVD) ===")
U, s, Vt = np.linalg.svd(A, full_matrices=False)
print(f" U {U.shape}, s {s.shape}, Vt {Vt.shape}")
print(f" s = {np.round(s, 3)} (kamayish tartibida)")
print("\n=== 2. Ortogonallik ===")
print(f" U.T @ U = I: {np.allclose(U.T @ U, np.eye(3))}")
print(f" Vt @ Vt.T = I: {np.allclose(Vt @ Vt.T, np.eye(3))}")
print("\n=== 3. Tiklash ===")
print(f" A == U diag(s) Vt: {np.allclose(A, U @ np.diag(s) @ Vt)}")
print("\n=== 4. Rank va shart soni ===")
B = np.column_stack([A[:, 0], A[:, 1], A[:, 0] + A[:, 1]]) # bog'liq ustun
sB = np.linalg.svd(B, compute_uv=False)
print(f" bog'liq matritsa s = {np.round(sB, 6)}")
print(f" rank = {np.sum(sB > 1e-10)}, matrix_rank = {np.linalg.matrix_rank(B)}")
print(f" cond(A) = s1/s3 = {s[0] / s[-1]:.3f}, np.linalg.cond = {np.linalg.cond(A):.3f}")
print("\n=== 5. full_matrices=True ===")
U_full = np.linalg.svd(A)[0]
print(f" U shakli: {U_full.shape} (katta m da ulkan)")
print(" ⭐ Har qanday matritsa = burish × cho'zish × burish")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Shakllar (iqtisodiy SVD) ===
U (5, 3), s (3,), Vt (3, 3)
s = [3.151 1.709 0.335] (kamayish tartibida)
=== 2. Ortogonallik ===
U.T @ U = I: True
Vt @ Vt.T = I: True
=== 3. Tiklash ===
A == U diag(s) Vt: True
=== 4. Rank va shart soni ===
bog'liq matritsa s = [4.965774 1.002119 0. ]
rank = 2, matrix_rank = 2
cond(A) = s1/s3 = 9.410, np.linalg.cond = 9.410
=== 5. full_matrices=True ===
U shakli: (5, 5) (katta m da ulkan)
⭐ Har qanday matritsa = burish × cho'zish × burishNima ko'rsatdi: 2.1, 2.3, 2.7-bo'limlar.
Misol 2 — Geometriya: aylana → ellips
"""SVD geometriyasi: birlik aylana ellipsga, yarim o'qlar = singulyar qiymatlar (real numpy)."""
import numpy as np
def main() -> None:
A = np.array([[3.0, 1.0], [1.0, 2.0]])
U, s, Vt = np.linalg.svd(A)
t = np.linspace(0, 2 * np.pi, 3601)
aylana = np.vstack([np.cos(t), np.sin(t)])
ellips = A @ aylana
uzunlik = np.linalg.norm(ellips, axis=0)
print("=== 1. Ellips yarim o'qlari ===")
print(f" eng uzun: {uzunlik.max():.4f}, s1 = {s[0]:.4f}")
print(f" eng qisqa: {uzunlik.min():.4f}, s2 = {s[1]:.4f}")
print("\n=== 2. Eng uzun yo'nalish = U ning 1-ustuni ===")
i = uzunlik.argmax()
yo = ellips[:, i] / uzunlik[i]
print(f" ellipsdan: {np.round(yo * np.sign(yo[0]), 4)}, U[:, 0]: {np.round(U[:, 0] * np.sign(U[0, 0]), 4)}")
print("\n=== 3. Uch qadam ===")
x = np.array([1.0, 0.0])
q1 = Vt @ x
q2 = s * q1
q3 = U @ q2
print(f" Vt x = {np.round(q1, 3)} → s × ... = {np.round(q2, 3)} → U ... = {np.round(q3, 3)}")
print(f" A x = {A @ x}")
print(" ⭐ Burish → cho'zish → burish")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Ellips yarim o'qlari ===
eng uzun: 3.6180, s1 = 3.6180
eng qisqa: 1.3820, s2 = 1.3820
=== 2. Eng uzun yo'nalish = U ning 1-ustuni ===
ellipsdan: [0.8507 0.5256], U[:, 0]: [0.8507 0.5257]
=== 3. Uch qadam ===
Vt x = [-0.851 -0.526] → s × ... = [-3.078 -0.727] → U ... = [3. 1.]
A x = [3. 1.]
⭐ Burish → cho'zish → burishNima ko'rsatdi: 2.2-bo'lim.
Misol 3 — Rasm siqish (past rankli yaqinlashtirish)
"""Sintetik 'rasm' ni SVD bilan siqish: k, energiya, xato, saqlash (real numpy)."""
import numpy as np
def main() -> None:
# 120 × 160 sintetik rasm: gradient + doira + chiziqlar + shovqin
y, x = np.mgrid[0:120, 0:160]
rasm = 100 + 0.5 * x
rasm += 80 * ((x - 80) ** 2 + (y - 60) ** 2 < 30 ** 2)
rasm += 40 * (np.sin(x / 6) > 0.9)
rasm += np.random.default_rng(0).normal(0, 5, rasm.shape)
U, s, Vt = np.linalg.svd(rasm, full_matrices=False)
print("=== 1. Singulyar qiymatlar tez so'nadi ===")
print(f" s[:6] = {np.round(s[:6], 0)}")
print(f" s[50] = {s[50]:.1f}, s[-1] = {s[-1]:.1f}")
print("\n=== 2. k bo'yicha sifat va hajm ===")
m, n = rasm.shape
for k in [1, 5, 20, 50]:
A_k = U[:, :k] @ np.diag(s[:k]) @ Vt[:k]
xato = np.linalg.norm(rasm - A_k) / np.linalg.norm(rasm)
energiya = (s[:k] ** 2).sum() / (s ** 2).sum()
hajm = k * (m + n + 1) / (m * n)
print(f" k={k:>2}: energiya {energiya:.4f}, nisbiy xato {xato:.3f}, hajm {hajm:.0%}")
print("\n=== 3. Eckart-Young: xato = qolgan s lar ===")
k = 20
A_k = U[:, :k] @ np.diag(s[:k]) @ Vt[:k]
print(f" ||A - A_k||_F = {np.linalg.norm(rasm - A_k):.2f}, sqrt(sum(s[k:]^2)) = {np.sqrt((s[k:] ** 2).sum()):.2f}")
print(" ⭐ Kam qatlam — asosiy tuzilma; qolgani — tafsilot va shovqin")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Singulyar qiymatlar tez so'nadi ===
s[:6] = [22313. 2206. 954. 556. 388. 313.]
s[50] = 66.2, s[-1] = 9.2
=== 2. k bo'yicha sifat va hajm ===
k= 1: energiya 0.9861, nisbiy xato 0.118, hajm 1%
k= 5: energiya 0.9984, nisbiy xato 0.040, hajm 7%
k=20: energiya 0.9993, nisbiy xato 0.026, hajm 29%
k=50: energiya 0.9998, nisbiy xato 0.015, hajm 73%
=== 3. Eckart-Young: xato = qolgan s lar ===
||A - A_k||_F = 573.29, sqrt(sum(s[k:]^2)) = 573.29
⭐ Kam qatlam — asosiy tuzilma; qolgani — tafsilot va shovqinNima ko'rsatdi: 2.4, 2.6-bo'limlar.
Misol 4 — Tavsiya: yashirin omillar
"""Tavsiya tizimi: past rankli SVD bilan bo'sh baholarni bashorat qilish (real numpy)."""
import numpy as np
def main() -> None:
rng = np.random.default_rng(1)
n_user, n_film, k_haqiqiy = 300, 80, 3
P = rng.normal(size=(n_user, k_haqiqiy)) # foydalanuvchi moyilliklari
Q = rng.normal(size=(n_film, k_haqiqiy)) # film profillari
toliq = np.clip(3 + P @ Q.T * 0.6 + rng.normal(0, 0.3, (n_user, n_film)), 1, 5)
maska = rng.random(toliq.shape) < 0.25 # 25% baho ma'lum
test = maska & (rng.random(toliq.shape) < 0.2) # ma'lumlarning bir qismi — test
oquv = maska & ~test
print("=== 1. Ma'lumot ===")
print(f" ma'lum baholar: {oquv.sum()} o'quv, {test.sum()} test ({oquv.mean():.0%} to'la)")
ortacha = toliq[oquv].mean()
R = np.where(oquv, toliq, ortacha) # bo'shlar — o'rtacha bilan
def rmse(bashorat: np.ndarray) -> float:
return float(np.sqrt(np.mean((bashorat[test] - toliq[test]) ** 2)))
print("\n=== 2. Baza: umumiy o'rtacha ===")
print(f" RMSE = {rmse(np.full_like(R, ortacha)):.3f}")
print("\n=== 3. Past rankli SVD (iterativ to'ldirish) ===")
for k in [1, 3, 10, 30]:
X = R.copy()
for _ in range(30):
U, s, Vt = np.linalg.svd(X, full_matrices=False)
X_k = U[:, :k] @ np.diag(s[:k]) @ Vt[:k]
X = np.where(oquv, toliq, X_k) # ma'lumlar joyida, bo'shlar — bashorat
print(f" k={k:>2}: test RMSE = {rmse(np.clip(X_k, 1, 5)):.3f}")
print(" ⭐ Juda katta k — overfitting (k ni validatsiya bilan tanlang)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Ma'lumot ===
ma'lum baholar: 4729 o'quv, 1208 test (20% to'la)
=== 2. Baza: umumiy o'rtacha ===
RMSE = 0.908
=== 3. Past rankli SVD (iterativ to'ldirish) ===
k= 1: test RMSE = 0.942
k= 3: test RMSE = 0.621
k=10: test RMSE = 0.620
k=30: test RMSE = 0.862
⭐ Juda katta k — overfitting (k ni validatsiya bilan tanlang)Nima ko'rsatdi: 2.4, 2.7-bo'limlar.
5. To'g'ri va noto'g'ri tushunishlar
| Noto'g'ri fikr | To'g'risi |
|---|---|
| "SVD faqat kvadrat matritsa uchun" | Har qanday matritsa |
| "Vt[:, 0] — 1-vektor" | Vt[0] (qator) |
| "s o'sish tartibida" | Kamayish (eigh dan farqli) |
| "full_matrices standart yaxshi" | False — tejamli |
| "Bo'sh baho = 0" | Noma'lum (to'ldirish usuli muhim) |
| "Katta k — doim yaxshi" | Test xatosi o'sishi mumkin |
| "PCA uchun X ni to'g'ridan-to'g'ri SVD" | Avval markazlashtirish |
| "SVD va xos yoyilma — boshqa-boshqa" | X.T X: V va s^2 |
6. Keng tarqalgan xatolar va yechimlari
1. Vt ni ustun deb
v1 = Vt[:, 0] # ⚠️
v1 = Vt[0] # ✅2. full_matrices
U, s, Vt = np.linalg.svd(X) # X: 100000 × 50 → U 100000^2 # ⚠️
U, s, Vt = np.linalg.svd(X, full_matrices=False) # ✅3. s ni matritsa deb
A_k = U[:, :k] @ s[:k] @ Vt[:k] # shakl xatosi # ⚠️
A_k = U[:, :k] @ np.diag(s[:k]) @ Vt[:k] # ✅4. Siyrak matritsaga to'liq SVD
np.linalg.svd(tfidf.toarray()) # ⚠️
TruncatedSVD(n_components=100, random_state=0).fit_transform(tfidf) # ✅5. Bo'sh = 0
R = np.where(maska, baholar, 0) # 0 — "eng yomon baho" # ⚠️
R = np.where(maska, baholar, baholar[maska].mean()) # ✅6. k ni o'quv xatosi bilan
k = argmin(oquv_xato) # har doim eng katta k # ⚠️
k = argmin(test_xato) # yoki cross-validation # ✅7. Markazlashtirmasdan PCA
U, s, Vt = np.linalg.svd(X) # 1-komponenta ≈ o'rtacha # ⚠️
U, s, Vt = np.linalg.svd(X - X.mean(0), full_matrices=False) # ✅7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 10.5-10.6-darslar (o'tilgan): Rank, shart soni, lstsq
- 10.7-dars (o'tilgan): Xos qiymatlar (X.T X)
- 10.9-dars: PCA — SVD orqali
- 10.10-dars: Amaliy loyiha
- NLP va tavsiya qismlari: LSA, matritsa faktorizatsiyasi
8. Eng yaxshi amaliyotlar
Doim full_matrices=False.
Vt qatorlari — o'ng singulyar vektorlar.
Singulyar qiymatlar spektrini chizing.
k — energiya ulushi yoki validatsiya bilan.
Katta/siyrak — TruncatedSVD / svds.
Tavsiyada bo'shlarni 0 qilmang.
PCA uchun avval markazlashtiring.
Tiklashni allclose bilan tekshiring.
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
1. # SVD qaysi matritsalar uchun?
2. # s tartibi?
3. # s manfiy bo'la oladimi?
4. # rank = ?
5. # cond = ?
6. # 1000 × 1000, k = 50 saqlash hajmi?
7. # A_k qanday yaqinlashtirish?
8. # X.T X xos qiymatlari?
9. # X.T X xos vektorlari?
10. # aylana → ?
11. # Vt[0] nima?
12. # tavsiyada bo'sh katak = 0 to'g'rimi?Javoblar
- Har qanday
- Kamayish
- Yo'q
- Nolmas s lar soni
- s1 / s_min
100 050 son (10%)- Eng yaxshi rank-k (Eckart-Young)
- s^2
- V (Vt qatorlari)
- Ellips
- 1-o'ng singulyar vektor
- Yo'q (noma'lum)
Vazifa 2: Xatolarni tuzating
1. U, s, Vt = np.linalg.svd(X) # X: 50000 × 20
2. v1 = Vt[:, 0]
3. A_k = U[:, :k] * s[:k] @ Vt # k qatlam
4. R = np.nan_to_num(baholar) # NaN → 0, keyin SVD
5. U, s, Vt = np.linalg.svd(X, full_matrices=False) # PCA uchunJavoblar
1. U, s, Vt = np.linalg.svd(X, full_matrices=False)
2. v1 = Vt[0]
3. A_k = U[:, :k] @ np.diag(s[:k]) @ Vt[:k]
4. R = np.where(np.isnan(baholar), np.nanmean(baholar), baholar)
5. U, s, Vt = np.linalg.svd(X - X.mean(axis=0), full_matrices=False)Vazifa 3: Rasm siqish
Modellang:
- O'z sintetik rasmingiz (200 × 300)
- k = 1, 5, 20, 100
- Energiya va xato jadvali
- matplotlib bilan ko'rsatish
Vazifa 4: Shovqin tozalash
Modellang:
- Past rankli toza matritsa (rank 3)
- Shovqin qo'shish
- k = 3 yaqinlashtirish
- Toza matritsaga masofa (shovqinli vs tozalangan)
Vazifa 5: Tavsiya
Modellang:
- 200 × 50 baholar, 20% ma'lum
- O'rtacha, foydalanuvchi o'rtachasi, SVD bazalari
- k tanlash (test RMSE)
- Bitta foydalanuvchi uchun top-5 tavsiya
Vazifa 6: Integratsiya
Modellang:
- Rank (10.5)
- lstsq (10.6)
- Xos qiymatlar (10.7)
- Rasm matritsa (10.3)
Vazifa 7: O'ylash
Netflix mukofoti (2006-2009) tanlovida g'oliblar asosan matritsa faktorizatsiyasi (SVD ga o'xshash yashirin omillar) dan foydalandi. Yashirin omillar ko'pincha talqin qilinadi: "birinchi omil — jangari/drama", "ikkinchisi — oilaviy/kattalar uchun". Nima uchun bunday talqin qiziqarli, lekin ehtiyotkorlik talab qiladi? Past rankli modellar qanday afzallik va xavflarga ega?
Javob
Qisqa javob: yashirin omillar baholardagi eng kuchli umumiy naqshlarni oladi — ular ba'zan inson tushunadigan janrlarga mos keladi, ba'zan yo'q. Omil yo'nalishi (ishora, burish) matematik jihatdan yagona emas — bir xil yaqinlashtirishni cheksiz ko'p "burilgan" omillar beradi. Shuning uchun omilga nom berish — gipoteza, fakt emas.
1. Nega kuchli
- Siyrak ma'lumotdan (10% to'la) umumlashtiradi
- Foydalanuvchi va filmni bir fazoda ko'rsatadi (o'xshashlik, 10.2)
- Hisoblash tejamli: k × (m + n) parametr
2. Talqin ehtiyotkorligi
| Muammo | Sababi |
|---|---|
| Omil yagona emas | Burish ham bir xil yaqinlashtirish beradi |
| Ishora ixtiyoriy | u_i, v_i ikkalasi -1 ga ko'paysa — bir xil |
| Omil aralash | "Jangari + yangi + katta byudjet" birga |
| Ma'lumot tarafkashligi | Kim baholaydi — omilni belgilaydi |
3. Xavflar
- Mashhur filmlar hukmron (ko'p baho) — "uzun dum" filmlar e'tiborsiz
- Filtr pufagi: foydalanuvchiga faqat o'xshash narsa tavsiya etiladi
- Yangi foydalanuvchi/film (sovuq start) — omillar yo'q
- Katta k — shovqinni yodlash (Misol 4)
4. Data Scientist qanday
- k ni validatsiya bilan tanlaydi, regularizatsiya qo'shadi
- Omillarni talqin qilishda ehtiyotkor, eng katta vaznli filmlarni ko'rib chiqadi
- Xilma-xillik va yangilikni alohida o'lchaydi
- Sovuq start uchun kontent belgilarini qo'shadi
5. Xulosa
- Past rankli model — siyrak baholardan umumiy naqsh
- Omillar talqini — gipoteza, yagona emas
- Xavflar: mashhurlik, filtr pufagi, sovuq start, overfitting
- Validatsiya va xilma-xillik o'lchovi — muvozanat
Nimani mustahkamlaydi: 2.4, 2.7-bo'limlar.
Xulosa
Bu darsda SVD ni o'rgandik.
Eng muhim uch fikr:
A = U diag(s) Vt. Har qanday (to'rtburchak) matritsa: U, V — ortogonal (burish), s — kamayuvchi manfiy bo'lmagan cho'zishlar. Geometriya: aylana → ellips (yarim o'qlar = s). NumPy:
svd(A, full_matrices=False); Vt — qatorlar; s — vektor (np.diag).Past rankli yaqinlashtirish. A_k = birinchi k qatlam — rank-k matritsalar orasida eng yaxshisi (Eckart-Young); xato — qolgan s lar; energiya ulushi sum(s[:k]^2)/sum(s^2). Rasm siqish, shovqin tozalash, tavsiya (yashirin omillar); k — validatsiya bilan (katta k — overfitting).
Hamma narsaning ichida. rank = nolmas s soni, cond = s1/s_min; X.T X: xos vektorlar = V, xos qiymatlar = s^2 → PCA va lstsq SVD ga tayanadi (barqarorroq). Katta/siyrak — TruncatedSVD.
Keyingi darsda PCA (bosh komponentalar tahlili)ni o'rganamiz: markazlashtirish, SVD orqali komponentalar, tushuntirilgan dispersiya, o'lchamni kamaytirish va vizualizatsiya, sklearn PCA va uning tuzoqlari.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!