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

10.9-dars: PCA — bosh komponentalar tahlili

10-QISM — CHIZIQLI ALGEBRA · 9-dars


1. Kirish va motivatsiya

Bu qismda yig'ilgan hamma narsa — vektorlar, proyeksiya, kovariatsiya matritsasi, xos vektorlar, SVD — bitta mashhur usulda birlashadi: PCA (Principal Component Analysis, bosh komponentalar tahlili). PCA — ko'p o'lchamli ma'lumotni kamroq o'lchamga siqish usuli, shunda iloji boricha ko'p ma'lumot (dispersiya) saqlanadi. 50 ta belgili mijoz ma'lumotini 2 o'lchamga tushirib, grafikda ko'rish; 784 pikselli raqam rasmlarini 50 komponentaga siqish; bir-biriga bog'liq 20 ta so'rovnoma savolini 3 ta "yashirin omil"ga keltirish.

PCA g'oyasi sodda: ma'lumot buluti odatda barcha yo'nalishlarda bir xil tarqalmagan — ba'zi yo'nalishlarda keng, ba'zilarida tor (10.7, ellips). Bosh komponentalar — eng keng tarqalish yo'nalishlari (kovariatsiya matritsasining xos vektorlari = markazlashtirilgan X ning o'ng singulyar vektorlari). Ma'lumotni birinchi k komponentaga proyeksiyalash 10.2-bob — eng kam ma'lumot yo'qotilgan k o'lchamli ko'rinish. Foydalanish: vizualizatsiya, siqish, shovqinni tozalash, multikollinearlikni yo'qotish (komponentalar ortogonal), tezlashtirish (ML modelga kamroq belgi), o'lchamlar la'natiga qarshi 10.1-bob.

Real vaziyat. Marketing bo'limi 1 000 mijoz haqida 5 ta ko'rsatkich yig'di (xaridlar soni, o'rtacha chek, ilova sessiyalari, chegirma va premium mahsulotlar ulushi). Jadvalga qarab hech narsa ko'rinmaydi. Data Scientist ma'lumotni standartlashtirib, PCA qiladi: birinchi ikki komponenta dispersiyaning ~94% ini tushuntiradi (Misol 2). Komponentalar yuklamalariga (loadings) qarab ma'no beradi: 1-komponenta — "umumiy faollik" (hamma xarid ko'rsatkichlari musbat vaznli), 2-komponenta — "chegirma ovchisi ↔ premium xaridor". Endi har mijozni ikki tushunarli o'qli 2D grafikda ko'rish mumkin — keyingi segmentlash va klasterlashga (ML qismi) asos.

Bu darsda PCA ni o'rganamiz.

Bu darsda:

  • PCA g'oyasi: eng katta dispersiya yo'nalishlari
  • PCA qadamlari: markazlashtirish → SVD → proyeksiya
  • Tushuntirilgan dispersiya va komponentalar sonini tanlash
  • Yuklamalar (loadings) va talqin
  • Standartlashtirish: qachon va nega
  • Rekonstruksiya va siqish
  • PCA tuzoqlari
  • Amaliy: sklearn PCA, vizualizatsiya

ℹ Misollar real numpy/sklearn bilan (Python 3.14).


2. Nazariya — chuqur tushuntirish

2.1. PCA g'oyasi

text
Ma'lumot buluti (2D misol): bir yo'nalishda cho'zilgan ellips

   y |        . . ..            PC1 — eng uzun o'q (eng katta dispersiya)
     |     . . .:. .            PC2 — PC1 ga perpendikulyar, qolgan dispersiya
     |  . .:..: .
     |. . .                     2D → 1D: har nuqtani PC1 ga proyeksiyalash
     +------------- x           yo'qotilgan: faqat PC2 bo'ylab (kichik) tarqalish

PC_i — kovariatsiya matritsasining i-xos vektori 10.7-bob = Vt[i] (markazlashtirilgan X ning SVD si, 10.8)
PC_i dispersiyasi = i-xos qiymat = s_i^2 / (n - 1)

PCA — koordinatalar tizimini burish 10.4-bob: yangi o'qlar (bosh komponentalar) — ma'lumot eng ko'p tarqalgan yo'nalishlar, kamayish tartibida, o'zaro ortogonal. Keyin eng kam dispersiyali o'qlar tashlanadi. Nega dispersiya = ma'lumot? Tarqalmagan yo'nalish (hamma nuqta bir xil qiymat) — hech narsani ajratmaydi; keng tarqalgan — kuzatuvlar orasidagi farqlar shu yerda. Muhim: PCA — nazoratsiz (y dan foydalanmaydi) va chiziqli (faqat to'g'ri o'qlar).

2.2. PCA qadamlari

text
1. MARKAZLASHTIRISH:  Xc = X - X.mean(axis=0)           (majburiy!)
   (ixtiyoriy) STANDARTLASHTIRISH: Xs = Xc / X.std(axis=0)  (birliklar farq qilsa)
2. SVD:               U, s, Vt = svd(Xc, full_matrices=False)
3. KOMPONENTALAR:     Vt[:k]                              (k × p) — yo'nalishlar
4. PROYEKSIYA:        Z = Xc @ Vt[:k].T  (= U[:, :k] * s[:k])   (n × k) — yangi koordinatalar
5. DISPERSIYA:        s^2 / (n - 1);  ulush = s^2 / sum(s^2)

sklearn: PCA(n_components=k).fit_transform(X)  — 1, 2, 3, 4 ni o'zi qiladi (markazlashtiradi, lekin standartlashtirmaydi!)

PCA — besh qadam: markazlashtirish (aks holda 1-komponenta o'rtacha tomon yo'naladi — 10.8 tuzog'i), kerak bo'lsa standartlashtirish, SVD (kovariatsiya xos yoyilmasidan barqarorroq), komponentalar (Vt qatorlari), proyeksiya Z = Xc @ V_k (har kuzatuvning yangi koordinatalari — "PC ballari"). sklearn PCA markazlashtirishni o'zi qiladi, standartlashtirishni emas — kerak bo'lsa StandardScaler bilan pipeline.

2.3. Tushuntirilgan dispersiya va k ni tanlash

Tushuntirilgan dispersiya ulushi — lambda_i / sum(lambda) (sklearn: explained_variance_ratio_); kumulyativ — birinchi k tasi yig'indisi. k tanlash usullari: (1) chegara — kumulyativ 90% (yoki 95%) ga yetguncha (PCA(n_components=0.9)); (2) "tirsak" (scree plot) — xos qiymatlar grafigida keskin burilish nuqtasi; (3) maqsad — vizualizatsiya uchun 2-3; (4) keyingi model sifati — cross-validation (PCA pipeline ichida). Ma'lumotda past o'lchamli tuzilma bo'lsa, bir necha komponenta dispersiyaning ko'pini beradi; bo'lmasa (masalan, mustaqil belgilar) — ulushlar deyarli teng, PCA foydasiz.

2.4. Yuklamalar (loadings) va talqin

text
Vt[i] — i-komponentaning belgilar bo'yicha vaznlari (yuklamalar)
  PC1 = 0.45 × xarid_soni + 0.42 × chek + 0.40 × ilova + ... → "umumiy faollik"
  PC2 = 0.60 × chegirma - 0.55 × premium + ...                → "chegirma ↔ premium"

Talqin: katta mutlaq qiymatli vaznlar; ishora — ixtiyoriy (PC va -PC bir xil)

Yuklamalar — komponentani belgilarning chiziqli kombinatsiyasi 10.1-bob sifatida ko'rsatadi; eng katta mutlaq vaznli belgilarga qarab komponentaga ma'no beriladi ("umumiy o'lcham", "kontrast"). Ehtiyot: (1) ishora ixtiyoriy (talqindan oldin qotiring); (2) talqin — gipoteza, ayniqsa keyingi komponentalarda; (3) komponentalar ortogonallik sharti bilan qurilgan — haqiqiy omillar bilan to'liq mos kelmasligi mumkin; (4) standartlashtirilmagan ma'lumotda yuklamalar birliklarni aks ettiradi.

2.5. Standartlashtirish: qachon va nega

PCA dispersiyaga qaraydi — shuning uchun birliklarga sezgir: [yosh, daromad (so'm)] da daromad dispersiyasi milliardlab — 1-komponenta faqat "daromad" bo'ladi (10.1 masshtab muammosi). Qoida: belgilar turli birlikda bo'lsa — standartlashtiring (bu korrelyatsiya matritsasi PCA si); bir xil birlik va masshtab bo'lsa (piksellar, bir xil shkaladagi so'rovnoma javoblari) — faqat markazlashtirish yetarli, standartlashtirish ahamiyatsiz yo'nalishlarning shovqinini sun'iy kuchaytirishi mumkin. Outlierlar — PCA ni kuchli buradi (kvadratlar, 10.6); oldin tekshiring 8.6-bob.

2.6. Rekonstruksiya va siqish

text
Z = Xc @ V_k              (n × k)   — siqilgan ko'rinish
X_tiklangan = Z @ V_k.T + mean     (n × p)   — rekonstruksiya (proyeksiya asl fazoda)
xato = ||X - X_tiklangan||^2  = tashlangan komponentalar dispersiyasi yig'indisi (Eckart-Young)

sklearn: pca.inverse_transform(Z)

Rekonstruksiya — siqilgan koordinatalardan asl fazoga qaytish: Z @ V_k.T + o'rtacha. Bu — k-komponentali tekislikka proyeksiya 10.2-bob: tashlangan yo'nalishlar bo'ylab ma'lumot yo'qoladi. Qo'llanilishi: siqish (k × (n + p) son saqlanadi), shovqin tozalash (kichik komponentalar ko'pincha shovqin), anomaliya aniqlash — rekonstruksiya xatosi katta kuzatuv "odatiy tuzilma"ga mos emas (8.6 ga qo'shimcha usul).

2.7. PCA tuzoqlari

Asosiy tuzoqlar: markazlashtirmaslik (qo'lda SVD da); standartlashtirmaslik (turli birliklar — bitta belgi hukmron); test ma'lumotiga alohida fit (data leakage va noto'g'ri koordinatalar — PCA faqat o'quvda fit, testda transform; pipeline); ishorani talqin qilish (ixtiyoriy); PCA natijasini "eng muhim belgilar" deb o'qish (PCA y ni ko'rmaydi — eng katta dispersiya ≠ bashorat uchun eng foydali; kichik dispersiyali yo'nalish nishonni aniqlashi mumkin); nochiziqli tuzilma (spiral, halqa — chiziqli PCA ko'rmaydi; t-SNE/UMAP, kernel PCA); kategoriyalar (one-hot ustunlarda PCA ma'nosi cheklangan); outlierlar (komponentalarni buradi); talqin qilinuvchanlikni yo'qotish (komponenta — belgilar aralashmasi, model tushuntirish qiyinlashadi).

2.8. PCA — chiziqli algebraning yakuni

PCA: markazlashtirilgan (kerak bo'lsa standartlashtirilgan) X ning SVD si → komponentalar Vt[:k] (kovariatsiya xos vektorlari, ortogonal, dispersiya kamayish tartibida) → proyeksiya Z = Xc @ V_k; tushuntirilgan dispersiya — s^2 ulushlari (k — 90% chegara, tirsak, CV); yuklamalar — belgilar vaznlari (talqin — gipoteza, ishora ixtiyoriy); rekonstruksiya — Z @ V_k.T + o'rtacha (siqish, shovqin, anomaliya); tuzoqlar — masshtab, leakage, nazoratsiz (y ni ko'rmaydi), chiziqli. Bu qism vektorlar 10.1-bob → skalyar ko'paytma va proyeksiya 10.2-bob → kovariatsiya 10.3-bob → o'zgartirish 10.4-bob → rank 10.5-bob → regressiya 10.6-bob → xos vektorlar 10.7-bob → SVD 10.8-bob → PCA ga olib keldi.


3. Tez ma'lumotnoma

python
import numpy as np
from sklearn.decomposition import PCA
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

# QO'LDA
Xc = X - X.mean(axis=0)
U, s, Vt = np.linalg.svd(Xc, full_matrices=False)
Z = Xc @ Vt[:k].T                           # PC ballari
ulush = s ** 2 / (s ** 2).sum()

# SKLEARN
pipe = make_pipeline(StandardScaler(), PCA(n_components=0.9))   # 90% dispersiya
Z = pipe.fit_transform(X_train)
Z_test = pipe.transform(X_test)             # test — faqat transform!
pca = pipe[-1]
pca.explained_variance_ratio_, pca.components_   # ulushlar, yuklamalar (= Vt)
X_tik = pipe.inverse_transform(Z)           # rekonstruksiya
QOIDA: markazlashtir · turli birlik → standartlashtir · fit faqat o'quvda · ishora ixtiyoriy

PCA xulosasi

PCA — dispersiya eng katta ortogonal yo'nalishlarga proyeksiya
Qadamlar: markazlashtirish → (standartlashtirish) → SVD → Z = Xc @ V_k
Ulush — s^2 / sum(s^2); k — 90%, tirsak, CV
Yuklamalar — components_ (Vt); talqin — gipoteza
Rekonstruksiya — Z V_k.T + mean; siqish, shovqin, anomaliya
Nazoratsiz, chiziqli, masshtabga sezgir; fit faqat o'quvda

4. Batafsil misollar

Misollar real numpy/sklearn bilan (Python 3.14).

Misol 1 — PCA qo'lda va sklearn

python
"""PCA: markazlashtirish → SVD → proyeksiya; sklearn bilan solishtirish (real numpy/sklearn)."""

import numpy as np
from sklearn.decomposition import PCA


def main() -> None:
    rng = np.random.default_rng(0)
    n = 500
    z = rng.normal(size=(n, 2))                       # 2 ta yashirin omil
    W = np.array([[2.0, 1.0, 0.5, 1.5], [0.3, -1.0, 2.0, 0.0]])
    X = z @ W + rng.normal(0, 0.3, (n, 4)) + [10, 5, -3, 7]

    print("=== 1. Qo'lda ===")
    Xc = X - X.mean(axis=0)
    U, s, Vt = np.linalg.svd(Xc, full_matrices=False)
    ulush = s ** 2 / (s ** 2).sum()
    print(f"  dispersiya ulushlari: {np.round(ulush, 4)}")
    Z = Xc @ Vt[:2].T
    print(f"  Z shakli: {Z.shape}")

    print("\n=== 2. sklearn ===")
    pca = PCA(n_components=2).fit(X)
    print(f"  explained_variance_ratio_: {np.round(pca.explained_variance_ratio_, 4)}")
    Zs = pca.transform(X)
    bir_xil = np.allclose(np.abs(Z), np.abs(Zs))
    print(f"  koordinatalar (ishoragacha) bir xil: {bir_xil}")

    print("\n=== 3. Komponentalar ortogonal, ballar korrelyatsiyasiz ===")
    print(f"  PC1 · PC2 = {Vt[0] @ Vt[1]:.2e}")
    print(f"  corr(Z1, Z2) = {np.corrcoef(Z[:, 0], Z[:, 1])[0, 1]:.2e}")

    print("\n=== 4. Markazlashtirmasdan (xato) ===")
    _, s0, Vt0 = np.linalg.svd(X, full_matrices=False)
    print(f"  1-'komponenta' ≈ o'rtacha yo'nalishi: {np.round(Vt0[0] * np.sign(Vt0[0, 0]), 3)}")
    print(f"  o'rtacha / ||o'rtacha||:             {np.round(X.mean(0) / np.linalg.norm(X.mean(0)), 3)}")
    print("  ⭐ 4 belgi, 2 omil → 2 komponenta ~99%")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Qo'lda ===
  dispersiya ulushlari: [0.6042 0.3812 0.0073 0.0072]
  Z shakli: (500, 2)

=== 2. sklearn ===
  explained_variance_ratio_: [0.6042 0.3812]
  koordinatalar (ishoragacha) bir xil: True

=== 3. Komponentalar ortogonal, ballar korrelyatsiyasiz ===
  PC1 · PC2 = 1.53e-16
  corr(Z1, Z2) = 1.91e-16

=== 4. Markazlashtirmasdan (xato) ===
  1-'komponenta' ≈ o'rtacha yo'nalishi: [ 0.738  0.371 -0.222  0.518]
  o'rtacha / ||o'rtacha||:             [ 0.738  0.368 -0.231  0.516]
  ⭐ 4 belgi, 2 omil → 2 komponenta ~99%

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

Misol 2 — Standartlashtirish va yuklamalar

python
"""Turli birliklar: standartlashtirishsiz PCA bitta belgiga 'yopishadi'; yuklamalar (real numpy/sklearn)."""

import numpy as np
from sklearn.decomposition import PCA
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler


def main() -> None:
    rng = np.random.default_rng(1)
    n = 1000
    faollik = rng.normal(size=n)
    chegirma = rng.normal(size=n)
    X = np.column_stack([
        5 + 2 * faollik + rng.normal(0, 0.5, n),              # xaridlar soni (oyiga)
        300_000 + 80_000 * faollik + rng.normal(0, 30_000, n),  # o'rtacha chek (so'm)
        20 + 8 * faollik + rng.normal(0, 3, n),               # ilova sessiyalari
        0.3 + 0.1 * chegirma + rng.normal(0, 0.03, n),        # chegirma ulushi
        0.2 - 0.08 * chegirma + rng.normal(0, 0.03, n),       # premium ulushi
    ])
    nom = ["xaridlar", "chek", "sessiya", "chegirma", "premium"]

    print("=== 1. Standartlashtirishsiz ===")
    p1 = PCA(2).fit(X)
    print(f"  ulushlar: {np.round(p1.explained_variance_ratio_, 4)}")
    print(f"  PC1 yuklamalari: {dict((k, round(float(v), 3)) for k, v in zip(nom, p1.components_[0]))}")

    print("\n=== 2. Standartlashtirilgan ===")
    pipe = make_pipeline(StandardScaler(), PCA(2)).fit(X)
    p2 = pipe[-1]
    print(f"  ulushlar: {np.round(p2.explained_variance_ratio_, 3)}, jami {p2.explained_variance_ratio_.sum():.1%}")
    for i in range(2):
        v = p2.components_[i] * np.sign(p2.components_[i][np.argmax(np.abs(p2.components_[i]))])
        print(f"  PC{i + 1}: {dict((k, round(float(x), 2)) for k, x in zip(nom, v))}")
    print("  ⭐ PC1 — umumiy faollik; PC2 — chegirma ↔ premium")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Standartlashtirishsiz ===
  ulushlar: [1. 0.]
  PC1 yuklamalari: {'xaridlar': 0.0, 'chek': 1.0, 'sessiya': 0.0, 'chegirma': 0.0, 'premium': -0.0}

=== 2. Standartlashtirilgan ===
  ulushlar: [0.558 0.381], jami 93.9%
  PC1: {'xaridlar': 0.58, 'chek': 0.57, 'sessiya': 0.58, 'chegirma': 0.02, 'premium': -0.02}
  PC2: {'xaridlar': -0.01, 'chek': -0.02, 'sessiya': -0.02, 'chegirma': 0.71, 'premium': -0.71}
  ⭐ PC1 — umumiy faollik; PC2 — chegirma ↔ premium

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

Misol 3 — Komponentalar sonini tanlash

python
"""k tanlash: kumulyativ dispersiya, 90% chegara, tuzilmasiz ma'lumot (real numpy/sklearn)."""

import numpy as np
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA


def main() -> None:
    X = load_digits().data                           # 1797 × 64 (8×8 raqam rasmlari)

    print("=== 1. Raqam rasmlari: kumulyativ dispersiya ===")
    pca = PCA().fit(X)
    kum = np.cumsum(pca.explained_variance_ratio_)
    for k in [2, 5, 10, 20, 30, 40]:
        print(f"  k={k:>2}: {kum[k - 1]:.1%}")

    print("\n=== 2. n_components=0.9 ===")
    p90 = PCA(n_components=0.9).fit(X)
    print(f"  90% uchun kerak: {p90.n_components_} komponenta (64 dan)")

    print("\n=== 3. Tuzilmasiz ma'lumot (mustaqil belgilar) ===")
    R = np.random.default_rng(2).normal(size=(1797, 64))
    kum_r = np.cumsum(PCA().fit(R).explained_variance_ratio_)
    print(f"  k=10: {kum_r[9]:.1%}, 90% uchun: {np.searchsorted(kum_r, 0.9) + 1} komponenta")
    print("  ⭐ Tuzilma bor — kam komponenta; yo'q — PCA foydasiz")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Raqam rasmlari: kumulyativ dispersiya ===
  k= 2: 28.5%
  k= 5: 54.5%
  k=10: 73.8%
  k=20: 89.4%
  k=30: 95.9%
  k=40: 98.8%

=== 2. n_components=0.9 ===
  90% uchun kerak: 21 komponenta (64 dan)

=== 3. Tuzilmasiz ma'lumot (mustaqil belgilar) ===
  k=10: 20.3%, 90% uchun: 56 komponenta
  ⭐ Tuzilma bor — kam komponenta; yo'q — PCA foydasiz

Nima ko'rsatdi: 2.3-bo'lim.

Misol 4 — Rekonstruksiya, anomaliya va leakage'siz pipeline

python
"""Rekonstruksiya xatosi bilan anomaliya; PCA pipeline ichida (real numpy/sklearn)."""

import numpy as np
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler


def main() -> None:
    X, y = load_digits(return_X_y=True)
    X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=0, stratify=y)

    print("=== 1. Rekonstruksiya xatosi ===")
    pca = PCA(n_components=20).fit(X_tr)
    tik = pca.inverse_transform(pca.transform(X_te))
    xato = ((X_te - tik) ** 2).mean(axis=1)
    print(f"  oddiy raqamlar: median xato {np.median(xato):.2f}")

    rng = np.random.default_rng(3)
    shovqin = rng.uniform(0, 16, (20, 64))              # "raqam emas" rasmlar
    x_sh = ((shovqin - pca.inverse_transform(pca.transform(shovqin))) ** 2).mean(axis=1)
    chegara = np.quantile(xato, 0.99)
    print(f"  shovqin rasmlar: median xato {np.median(x_sh):.2f}")
    print(f"  99% chegaradan oshgan: {(x_sh > chegara).mean():.0%} shovqin, {(xato > chegara).mean():.0%} oddiy")

    print("\n=== 2. Klassifikatsiya: PCA pipeline ichida ===")
    for k in [5, 10, 20, 40]:
        pipe = make_pipeline(StandardScaler(), PCA(n_components=k), LogisticRegression(max_iter=2000))
        pipe.fit(X_tr, y_tr)
        print(f"  k={k:>2}: test aniqlik {pipe.score(X_te, y_te):.3f}")
    print("  ⭐ PCA faqat o'quvda fit — pipeline leakage'dan saqlaydi")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Rekonstruksiya xatosi ===
  oddiy raqamlar: median xato 1.94
  shovqin rasmlar: median xato 35.53
  99% chegaradan oshgan: 100% shovqin, 1% oddiy

=== 2. Klassifikatsiya: PCA pipeline ichida ===
  k= 5: test aniqlik 0.815
  k=10: test aniqlik 0.876
  k=20: test aniqlik 0.952
  k=40: test aniqlik 0.969
  ⭐ PCA faqat o'quvda fit — pipeline leakage'dan saqlaydi

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


5. To'g'ri va noto'g'ri tushunishlar

Noto'g'ri fikr To'g'risi
"PCA eng muhim belgilarni tanlaydi" Yangi belgilar (kombinatsiya) yaratadi
"Katta dispersiya — bashorat uchun muhim" PCA y ni ko'rmaydi
"sklearn PCA standartlashtiradi" Faqat markazlashtiradi
"PCA testga ham alohida fit" Faqat transform (leakage)
"PC1 ishorasi ma'noli" Ixtiyoriy
"PCA har doim foydali" Tuzilma bo'lmasa — yo'q
"PCA nochiziqli tuzilmani ko'radi" Faqat chiziqli
"Komponentalar o'zaro bog'liq" Ortogonal, ballar korrelyatsiyasiz

6. Keng tarqalgan xatolar va yechimlari

1. Markazlashtirmasdan

python
U, s, Vt = np.linalg.svd(X, full_matrices=False)                  # ⚠️
U, s, Vt = np.linalg.svd(X - X.mean(0), full_matrices=False)      # ✅

2. Standartlashtirmasdan (turli birliklar)

python
PCA(2).fit_transform(df[["yosh", "daromad_som"]])                 # ⚠️
make_pipeline(StandardScaler(), PCA(2)).fit_transform(...)        # ✅

3. Test ma'lumotiga fit

python
Z_test = PCA(10).fit_transform(X_test)                            # ⚠️
Z_test = pca.transform(X_test)          # o'quvda fit qilingan     # ✅

4. Pipeline'dan tashqarida CV

python
Z = PCA(10).fit_transform(X); cross_val_score(model, Z, y)        # ⚠️
cross_val_score(make_pipeline(StandardScaler(), PCA(10), model), X, y)  # ✅

5. components_ ni ustun deb

python
pc1 = pca.components_[:, 0]                                       # ⚠️
pc1 = pca.components_[0]                # qator = komponenta       # ✅

6. Ishorani talqin qilish

python
if pca.components_[0][2] < 0: print("teskari ta'sir")             # ⚠️
# ishorani qotirib, katta mutlaq vaznlarga qarang                  # ✅

7. k ni bir martada

python
PCA(n_components=2)     # "har doim 2"                            # ⚠️
PCA(n_components=0.9)   # yoki tirsak / CV bilan tanlang            # ✅

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 10.1-10.8-darslar (o'tilgan): Vektorlar, proyeksiya, kovariatsiya, xos vektorlar, SVD
  • 6.6-dars (o'tilgan): Standartlashtirish
  • 8.6-dars (o'tilgan): Anomaliyalar
  • Nazoratsiz o'rganish qismi: Klasterlash, t-SNE/UMAP
  • Feature engineering qismi: O'lchamni kamaytirish, pipeline

8. Eng yaxshi amaliyotlar

  1. Har doim markazlashtiring (sklearn o'zi qiladi).

  2. Turli birliklar — StandardScaler.

  3. PCA ni pipeline ichida ishlating.

  4. k — kumulyativ dispersiya va CV bilan.

  5. Yuklamalarni talqin qiling, ishorani qotiring.

  6. Outlierlarni oldin tekshiring.

  7. Vizualizatsiya uchun 2-3 komponenta.

  8. PCA y ni ko'rmasligini unutmang.


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
1.  # PCA nazoratli yoki nazoratsiz?
2.  # PC1 qanday yo'nalish?
3.  # PC1 va PC2 burchagi?
4.  # PCA'dan oldin majburiy qadam?
5.  # sklearn PCA standartlashtiradimi?
6.  # PC_i dispersiyasi = ?
7.  # n_components=0.95 nima?
8.  # components_ shakli (k=3, p=10)?
9.  # Z shakli (n=500, k=3)?
10. # rekonstruksiya formulasi?
11. # test uchun fit yoki transform?
12. # mustaqil belgilarda PCA foydalimi?
Javoblar
  1. Nazoratsiz
  2. Eng katta dispersiya yo'nalishi
  3. 90°
  4. Markazlashtirish
  5. Yo'q
  6. i-xos qiymat (s_i^2 / (n-1))
  7. 95% dispersiyaga yetadigan k
  8. (3, 10)
  9. (500, 3)
  10. Z @ V_k.T + o'rtacha
  11. transform
  12. Yo'q

Vazifa 2: Xatolarni tuzating

python
1.  Z = PCA(2).fit_transform(df[["yosh", "daromad", "ball"]])   # turli birlik

2.  pca_test = PCA(5).fit(X_test)

3.  U, s, Vt = np.linalg.svd(X); Z = X @ Vt[:2].T

4.  pc2 = pca.components_[:, 1]

5.  Z = PCA(10).fit_transform(X); cross_val_score(LogisticRegression(), Z, y)
Javoblar
python
1.  Z = make_pipeline(StandardScaler(), PCA(2)).fit_transform(df[["yosh", "daromad", "ball"]])

2.  Z_test = pca.transform(X_test)   # o'quvda fit qilingan pca

3.  Xc = X - X.mean(0); U, s, Vt = np.linalg.svd(Xc, full_matrices=False); Z = Xc @ Vt[:2].T

4.  pc2 = pca.components_[1]

5.  cross_val_score(make_pipeline(StandardScaler(), PCA(10), LogisticRegression()), X, y)

Vazifa 3: Mijozlar

Modellang:

  1. 8 belgili mijoz ma'lumoti (2 yashirin omil)
  2. Standartlashtirish + PCA
  3. Yuklamalar talqini
  4. 2D scatter (matplotlib)

Vazifa 4: k tanlash

Modellang:

  1. load_digits
  2. Scree plot va kumulyativ grafik
  3. 80%, 90%, 95% uchun k
  4. Pipeline aniqligi bilan solishtirish

Vazifa 5: Anomaliya

Modellang:

  1. Oddiy ma'lumot + 2% anomal nuqta
  2. PCA rekonstruksiya xatosi
  3. Chegara (99% kvantil)
  4. Precision/recall

Vazifa 6: Integratsiya

Modellang:

  1. Kovariatsiya xos vektorlari (10.7)
  2. SVD (10.8)
  3. Standartlashtirish (6.6)
  4. Anomaliya (8.6)

Vazifa 7: O'ylash

PCA eng katta dispersiya yo'nalishlarini saqlaydi va kichiklarini tashlaydi. Tasavvur qiling: kasallikni aniqlashda eng muhim signal — kichik dispersiyali bitta biomarker, qolgan 50 ta belgi esa katta, lekin ahamiyatsiz tebranishlarga ega. PCA bu holatda nima qiladi? Nima uchun "ko'p dispersiya = ko'p ma'lumot" farazi har doim ham to'g'ri emas, va qanday alternativalar bor?

Javob

Qisqa javob: PCA nazoratsiz — nishonni (kasallik) ko'rmaydi. Kichik dispersiyali biomarker oxirgi komponentalarga tushadi va k kichik tanlansa — tashlanadi. Model aynan eng muhim signalni yo'qotadi. "Dispersiya = ma'lumot" — faqat tuzilma haqida, bashorat foydaliligi haqida emas.

1. PCA nima qiladi

  • 50 ta shovqinli belgi — birinchi komponentalarni egallaydi
  • Biomarker — kichik dispersiya, oxirgi komponentalarda
  • PCA(n_components=0.9) → biomarker yo'qoladi → model sifati tushadi

2. Nega farazi buziladi

Faraz Haqiqat
Katta dispersiya — muhim Katta shovqin ham katta dispersiya
Kichik dispersiya — shovqin Aniq o'lchangan kichik signal bo'lishi mumkin
Birliklar ta'sir qilmaydi Masshtab dispersiyani belgilaydi

3. Alternativalar

  • Nazoratli o'lcham kamaytirish: PLS (y bilan kovariatsiyani maksimallashtiradi), LDA (sinflarni ajratish)
  • Belgi tanlash: Lasso, daraxt modellari muhimligi, mutual information
  • PCA'ni CV bilan tekshirish: k ni model sifati bo'yicha tanlash
  • PCA'siz model: Ridge/daraxtlar ko'p belgi bilan yaxshi ishlaydi

4. Data Scientist qanday

  1. PCA'ni maqsadga qarab ishlatadi (vizualizatsiya — ha; bashorat — tekshirib)
  2. k ni pipeline + cross-validation bilan tanlaydi
  3. Muhim belgilarning komponentalardagi yuklamasini tekshiradi
  4. Nazoratli alternativalar bilan solishtiradi

5. Xulosa

  1. PCA — y ni ko'rmaydi
  2. Dispersiya ≠ bashorat foydaliligi
  3. Kichik, lekin muhim signal yo'qolishi mumkin
  4. Nazoratli usullar va CV — himoya

Nimani mustahkamlaydi: 2.1, 2.7-bo'limlar.


Xulosa

Bu darsda PCA ni o'rgandik.

Eng muhim uch fikr:

  1. PCA — burish va proyeksiya. Bosh komponentalar — markazlashtirilgan ma'lumotning eng katta dispersiya yo'nalishlari (kovariatsiya xos vektorlari = SVD Vt qatorlari), ortogonal, kamayish tartibida. Qadamlar: markazlashtirish → (turli birliklarda standartlashtirish) → SVD → Z = Xc @ V_k.

  2. Dispersiya, k va talqin. Tushuntirilgan dispersiya ulushi — s^2 / sum(s^2); k — 90% chegara, tirsak yoki CV. Yuklamalar (components_) — komponentaning belgilar vaznlari; talqin — gipoteza, ishora ixtiyoriy. Tuzilma bo'lmasa (mustaqil belgilar) — PCA foydasiz.

  3. Amaliyot va tuzoqlar. Rekonstruksiya (Z V_k.T + o'rtacha) — siqish, shovqin tozalash, anomaliya (katta xato). PCA faqat o'quvda fit — pipeline (leakage). PCA nazoratsiz va chiziqli: katta dispersiya ≠ bashorat uchun muhim; masshtab va outlierlarga sezgir.

Keyingi darsda Chiziqli algebra amaliy loyihasini qilamiz: tavsiya va o'xshashlik tizimi — vektorlar va kosinus, SVD bilan yashirin omillar, PCA vizualizatsiya, regressiya — 10-qismning barcha bilimlari bitta loyihada.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
10.9-dars: PCA — bosh komponentalar tahlili — IlmHamroh