IlmHamroh
Data Science va sun'iy intellekt/Chiziqli algebra8/10-dars19 daqiqa
Mundarija (22)

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

text
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

text
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 ustunlari

SVD 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)

text
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

text
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

python
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 markazlashtir

SVD 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, lstsq

4. Batafsil misollar

Misollar real numpy bilan (Python 3.14).

Misol 1 — SVD va tiklash

python
"""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:

text
=== 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 × burish

Nima ko'rsatdi: 2.1, 2.3, 2.7-bo'limlar.

Misol 2 — Geometriya: aylana → ellips

python
"""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:

text
=== 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 → burish

Nima ko'rsatdi: 2.2-bo'lim.

Misol 3 — Rasm siqish (past rankli yaqinlashtirish)

python
"""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:

text
=== 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 shovqin

Nima ko'rsatdi: 2.4, 2.6-bo'limlar.

Misol 4 — Tavsiya: yashirin omillar

python
"""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:

text
=== 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

python
v1 = Vt[:, 0]                                                     # ⚠️
v1 = Vt[0]                                                        # ✅

2. full_matrices

python
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

python
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

python
np.linalg.svd(tfidf.toarray())                                    # ⚠️
TruncatedSVD(n_components=100, random_state=0).fit_transform(tfidf)  # ✅

5. Bo'sh = 0

python
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

python
k = argmin(oquv_xato)                # har doim eng katta k          # ⚠️
k = argmin(test_xato)                # yoki cross-validation         # ✅

7. Markazlashtirmasdan PCA

python
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

  1. Doim full_matrices=False.

  2. Vt qatorlari — o'ng singulyar vektorlar.

  3. Singulyar qiymatlar spektrini chizing.

  4. k — energiya ulushi yoki validatsiya bilan.

  5. Katta/siyrak — TruncatedSVD / svds.

  6. Tavsiyada bo'shlarni 0 qilmang.

  7. PCA uchun avval markazlashtiring.

  8. Tiklashni allclose bilan tekshiring.


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
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
  1. Har qanday
  2. Kamayish
  3. Yo'q
  4. Nolmas s lar soni
  5. s1 / s_min
  6. 100 050 son (10%)
  7. Eng yaxshi rank-k (Eckart-Young)
  8. s^2
  9. V (Vt qatorlari)
  10. Ellips
  11. 1-o'ng singulyar vektor
  12. Yo'q (noma'lum)

Vazifa 2: Xatolarni tuzating

python
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 uchun
Javoblar
python
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:

  1. O'z sintetik rasmingiz (200 × 300)
  2. k = 1, 5, 20, 100
  3. Energiya va xato jadvali
  4. matplotlib bilan ko'rsatish

Vazifa 4: Shovqin tozalash

Modellang:

  1. Past rankli toza matritsa (rank 3)
  2. Shovqin qo'shish
  3. k = 3 yaqinlashtirish
  4. Toza matritsaga masofa (shovqinli vs tozalangan)

Vazifa 5: Tavsiya

Modellang:

  1. 200 × 50 baholar, 20% ma'lum
  2. O'rtacha, foydalanuvchi o'rtachasi, SVD bazalari
  3. k tanlash (test RMSE)
  4. Bitta foydalanuvchi uchun top-5 tavsiya

Vazifa 6: Integratsiya

Modellang:

  1. Rank (10.5)
  2. lstsq (10.6)
  3. Xos qiymatlar (10.7)
  4. 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

  1. k ni validatsiya bilan tanlaydi, regularizatsiya qo'shadi
  2. Omillarni talqin qilishda ehtiyotkor, eng katta vaznli filmlarni ko'rib chiqadi
  3. Xilma-xillik va yangilikni alohida o'lchaydi
  4. Sovuq start uchun kontent belgilarini qo'shadi

5. Xulosa

  1. Past rankli model — siyrak baholardan umumiy naqsh
  2. Omillar talqini — gipoteza, yagona emas
  3. Xavflar: mashhurlik, filtr pufagi, sovuq start, overfitting
  4. 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:

  1. 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).

  2. 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).

  3. 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.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
10.8-dars: SVD — singulyar yoyilma — IlmHamroh