Unsupervised model-lər: PCA, manifold learning, clustering və density
Unsupervised model-lər: PCA, manifold learning, clustering və density
Əvvəlki fəsildə hər nümunənin label-ı var idi və model-in vəzifəsi aydın idi: label-ı proqnozlaşdır. Bu fəsildə label yoxdur. Yalnız feature matrisi X var və suallar başqadır: bu data-nın əsl ölçüsü neçədir? Nöqtələr təbii qruplara bölünürmü? Hansı bölgələr sıx, hansı seyrəkdir? Unsupervised learning bu suallara cavab verən model-lərdir. Onların qiymətləndirilməsi supervised model-lərdən çətindir, çünki "düzgün cavab" yoxdur; nəticəni çox vaxt vizual yoxlama, downstream məsələdə fayda və ya ehtimal əsaslı kriteriyalar müəyyən edir. Beş alətə baxacağıq: PCA, manifold learning, k-means, Gaussian mixture model-lər və kernel density estimation. Hər biri data-ya fərqli sual verir.
Principal component analysis
PCA data-da variance-ın ən böyük olduğu istiqamətləri tapır. İki ölçülü uzunsov nöqtə buludunu təsəvvür edin: birinci principal component buludun uzun oxudur, ikinci ona perpendikulyar qısa oxdur. Hər component bir vektor (istiqamət) və bir ədəddir (həmin istiqamətdə variance). Component-lər ortogonaldır və variance-a görə azalan sırada düzülür.
from sklearn.decomposition import PCA
pca = PCA(n_components=2).fit(X)
print(pca.components_) # istiqamətlər
print(pca.explained_variance_ratio_) # məs. [0.76, 0.18]
Explained variance ratio hər component-in ümumi variance-ın neçə faizini daşıdığını göstərir. Component sayını seçmək üçün bu nisbətin kumulyativ cəmini çəkin: əyri 95%-ə çatan nöqtə adətən kifayətdir. PCA(n_components=0.95) yazsanız, scikit-learn bu sayı özü tapır.
PCA-nın dörd tipik istifadəsi var:
- Dimensionality reduction.
transformdata-nı ilkkcomponent-ə proyeksiya edir. Yüksək ölçülü feature-lərin böyük hissəsi bir-biri ilə korrelyasiyalıdırsa, az sayda component məlumatın çoxunu saxlayır.inverse_transformorijinal fəzaya qayıdır, amma atılan component-lər itirilmiş olur. - Vizuallaşdırma. 64 ölçülü digits dataset-ini 2 component-ə proyeksiya edəndə rəqəmlərin class-ları hələ də aydın qruplar şəklində görünür. 64 ölçülü nöqtələri başqa heç cür görə bilməzdiniz.
- Noise filtering. Noise variance-ı bütün ölçülərə bərabər paylayır, siqnal isə az sayda istiqamətdə cəmlənir. Yalnız yüksək variance-lı component-ləri saxlayıb
inverse_transformetmək noise-un böyük hissəsini silir. - Feature extraction. Üz şəkillərində PCA eigenface-lər verir: hər component bir üz şablonudur və hər real üz 150 belə şablonun çəkili cəmi kimi yaxşı təqdim olunur. 3000 piksel əvəzinə 150 əmsal sonrakı classifier üçün əla giriş feature-idir.
Böyük matrislərdə tam SVD bahadır; svd_solver="randomized" ilk component-ləri təsadüfi proyeksiya ilə sürətlə yaxınlaşdırır və böyük data üçün default seçim olmalıdır.
PCA-nın fərziyyəsi aydındır: maraqlı struktur xəttidir. Data spiral və ya əyilmiş səth üzərindədirsə, ən böyük variance istiqamətləri bu əyriliyi görmür.
Manifold learning
S-curve və ya Swiss roll kimi dataset-lər iki ölçülü səthin üç ölçüyə əyilmiş formasıdır. PCA bu səthi yastılayır və əyrinin fərqli hissələrini üst-üstə salır. Manifold learning alqoritmləri isə aşağı ölçülü manifold-un özünü açmağa çalışır.
MDS (multidimensional scaling) nöqtələr arasındakı cüt-cüt məsafələri qoruyan aşağı ölçülü yerləşmə axtarır. Data-nı fırlatmaq və ya daha yüksək ölçüyə yerləşdirmək məsafələri dəyişmir, ona görə MDS belə çevrilmələri geri qaytarır. Amma səthi əyəndə nöqtələr arasındakı düz məsafələr dəyişir və MDS də uğursuz olur. Problem məsafənin tərifindədir: əyilmiş kağızda iki nöqtənin əsl məsafəsi kağız boyunca gedən yoldur, havadan kəsən düz xətt yox.
Isomap məhz bunu edir: hər nöqtəni ən yaxın qonşuları ilə birləşdirən graph qurur, məsafəni bu graph üzərindəki ən qısa yol kimi ölçür və sonra MDS tətbiq edir. LLE (locally linear embedding) daha lokal düşünür: hər nöqtəni qonşularının xətti kombinasiyası kimi ifadə edən çəkiləri tapır və aşağı ölçüdə eyni çəkiləri saxlayan yerləşmə axtarır. Yalnız lokal məsafələri qorumaq qlobal əyilmələrə qarşı daha dayanıqlıdır.
Vizuallaşdırma üçün bu gün ən populyar alətlər t-SNE və UMAP-dır. Hər ikisi qonşuluq münasibətlərini ehtimal kimi təsvir edir və aşağı ölçüdə oxşar ehtimalları saxlamağa çalışır. Nəticə çox vaxt cluster-lərin aydın göründüyü heyranedici şəkillərdir. Amma bu şəkilləri oxumağın qaydaları var:
- Cluster-lərin ölçüsü və cluster-lər arasındakı məsafə məna daşımır; alqoritm sıx bölgələri genişləndirir, seyrəkləri sıxır.
perplexity(t-SNE) vən_neighbors(UMAP) nəticəni kökündən dəyişə bilər; bir neçə dəyərlə yoxlamadan nəticə çıxarmayın.- Adətən
inverse_transformyoxdur və yeni nöqtəni mövcud şəklə əlavə etmək ya mümkün deyil, ya da etibarsızdır. - Noise-a həssasdır və tam təsadüfi data-da belə cluster göstərə bilər.
Qısası, manifold learning kəşfiyyat alətidir: preprocessing üçün PCA, insan gözü üçün t-SNE və UMAP.
k-means clustering
Clustering nöqtələri qruplara bölür. k-means ən sadə və ən çox istifadə olunan alqoritmdir: k cluster mərkəzi axtarır ki, hər nöqtə öz mərkəzinə digərlərindən daha yaxın olsun və mərkəz öz nöqtələrinin ortası olsun.
Bu iki şərt bir-birindən asılıdır və alqoritm onları növbə ilə təmin edir. Bu, expectation-maximization sxeminin ən sadə formasıdır:
1. k mərkəzi təsadüfi seç
2. təkrarla:
E-addımı: hər nöqtəni ən yaxın mərkəzə təyin et
M-addımı: hər mərkəzi öz nöqtələrinin ortasına köçür
mərkəzlər dəyişmirsə, dayan
Hər addım məqsəd funksiyasını azaldır, ona görə alqoritm həmişə yaxınlaşır. Amma qlobal minimuma yox. Pis başlanğıc pis nəticə verir; n_init parametri fərqli başlanğıclarla bir neçə dəfə işlədib ən yaxşısını seçir, k-means++ isə başlanğıc mərkəzləri bir-birindən uzaq seçir.
from sklearn.cluster import KMeans
km = KMeans(n_clusters=4, n_init=10, random_state=0).fit(X)
labels = km.labels_
centers = km.cluster_centers_
k-means-in məhdudiyyətləri onun tərifindən çıxır:
kəvvəlcədən verilməlidir. 2 qruplu data-da 6 cluster istəsəniz, alqoritm 6 verəcək. Silhouette score və ya elbow metodu kömək edir, amma qəti cavab vermir.- Sərhədlər xəttidir: hər nöqtə ən yaxın mərkəzə gedir, bu isə fəzanı Voronoi hücrələrinə bölür. İç-içə iki halqa heç vaxt düzgün ayrılmaz.
- Hər iterasiya bütün nöqtələrə baxır; milyonlarla sətirdə yavaşdır.
MiniBatchKMeanshər addımda kiçik alt çoxluq istifadə edir və keyfiyyətdə az itki ilə dəfələrlə sürətlidir.
Qeyri-xətti sərhədlər üçün spectral clustering ideyası sadədir: nöqtələri qonşuluq graph-ına çevirin, graph-ın spektral embedding-ini hesablayın (manifold learning-ə bənzər addım), sonra həmin embedding-də k-means işlədin. Halqalar embedding fəzasında xətti ayrılabilən olur.
k-means-in gözlənilməz tətbiqi colour compression-dır. Şəkil milyonlarla piksel, hər piksel RGB fəzasında bir nöqtədir. 16 cluster tapıb hər pikseli öz mərkəzinin rəngi ilə əvəz etsəniz, 16 milyon mümkün rəng 16-ya enir və şəkil hələ də tanınır. Burada clustering qrup tapmaq yox, vector quantization rolunu oynayır.
Gaussian mixture model-lər
k-means hər nöqtəni bir cluster-ə qəti təyin edir və bu təyinatın əminliyi haqqında heç nə demir. Üstəlik, mərkəzə məsafə ilə işlədiyi üçün cluster-lərin dairəvi və təxminən eyni ölçülü olduğunu gizli fərz edir. Uzunsov və ya fərqli ölçülü cluster-lərdə nəticə yanlışdır.
Gaussian mixture model (GMM) hər cluster-i tam Gaussian paylanma kimi modelləşdirir: mərkəz, kovaryans matrisi və çəki. covariance_type parametri kovaryansın formasını seçir: spherical (k-means-ə yaxın), diag (oxlar boyu uzanmış ellips), full (istənilən istiqamətdə ellips), tied (bütün cluster-lər üçün eyni forma). Fit yenə expectation-maximization ilə gedir, amma E-addımı qəti yox, soft təyinat verir: hər nöqtənin hər cluster-ə aid olma ehtimalı.
from sklearn.mixture import GaussianMixture
gmm = GaussianMixture(n_components=4, covariance_type="full").fit(X)
probs = gmm.predict_proba(X) # shape: (n, 4), hər sətrin cəmi 1
GMM-in əsl təbiəti clustering alqoritmi deyil, density estimator olmasıdır. O, data-nı yaradan ehtimal paylanmasını approximate edir; score_samples istənilən nöqtədə log-density qaytarır. Bu baxış component sayını seçməyi də dəyişir: sual "neçə cluster var?" yox, "paylanmanı neçə component yaxşı təsvir edir?" olur. AIC və BIC kriteriyaları fit keyfiyyətini parametr sayı ilə cəzalandırır; ən aşağı dəyəri verən n_components seçilir. Qeyd edin ki, BIC-in seçdiyi say çox vaxt gözlə görünən cluster sayından böyükdür, çünki qeyri-Gaussian formalı bir cluster-i təsvir etmək üçün bir neçə Gaussian lazım gəlir.
Density estimator olmağın gözəl nəticəsi var: ondan nümunə çəkmək olar. Digits dataset-ini PCA ilə 40 ölçüyə endirib üzərində GMM fit etsəniz, gmm.sample(100) əvvəl görünməmiş, amma inandırıcı rəqəm şəkilləri yaradır. Bu, generative model-in ən sadə formasıdır.
Kernel density estimation
Histogram ən köhnə density estimator-dur, amma sürprizlərlə doludur. Bin eni və bin-lərin başlanğıc nöqtəsi dəyişəndə eyni data-nın histogramı tamam fərqli hekayə danışa bilər: bir halda iki təpə, digərində bir. Səbəb odur ki, histogram hər nöqtəni bin sərhədinin hansı tərəfinə düşdüyündən asılı olaraq sayır.
Kernel density estimation (KDE) bu asılılığı aradan qaldırır: hər nöqtənin üzərinə kiçik hamar kernel (adətən Gaussian) qoyur və bütün kernel-ləri toplayır:
density(x) = (1/n) · Σ K((x − x_i) / h)
Burada h bandwidth-dir, yəni hər kernel-in eni. Bu, KDE-nin yeganə həqiqi hiperparametridir və bias–variance trade-off-unun klassik nümunəsidir: kiçik h hər nöqtədə ayrıca təpə göstərən tikanlı əyri, böyük h isə bütün strukturu yuyan hamar təpə verir. Bandwidth-i cross-validation ilə seçmək olar, çünki KDE scikit-learn estimator-udur və score metodu held-out data-nın log-likelihood-unu qaytarır:
from sklearn.neighbors import KernelDensity
from sklearn.model_selection import GridSearchCV
import numpy as np
grid = GridSearchCV(KernelDensity(kernel="gaussian"),
{"bandwidth": np.logspace(-1, 1, 20)}, cv=5)
grid.fit(x[:, None])
print(grid.best_params_) # {'bandwidth': 1.12}
KDE-nin maraqlı tətbiqi naive Bayes-ə qayıdır. Əvvəlki fəsildə Gaussian naive Bayes hər class üçün Gaussian fərz edirdi. Bu fərziyyəni KDE ilə əvəz edin: hər class üçün ayrıca KDE fit edin, prior kimi class-ın payını götürün və yeni nöqtə üçün prior × density ən böyük olan class-ı seçin. Nəticə forma fərziyyəsi olmayan generative classifier-dir. scikit-learn-də bunu BaseEstimator və ClassifierMixin-dən miras alan iyirmi sətirlik class ilə yazmaq olar və o, GridSearchCV daxil olmaqla bütün alətlərlə uyğun işləyir. Bu, kitabxananın dizaynının gücüdür: standart interface-ə riayət edən hər şey ekosistemin tam gücünü alır.
Hansı sual, hansı alət
| Sual | Alət | Diqqət |
|---|---|---|
| Data-nın əsas ölçüsü neçədir, hansı feature-lər birlikdə dəyişir? | PCA | Yalnız xətti struktur; feature-ləri əvvəlcə scale edin |
| Yüksək ölçülü data-nı gözlə necə görüm? | PCA (sürətli, dürüst), t-SNE/UMAP (ifadəli, ehtiyatlı) | Cluster məsafələrini şərh etməyin |
| Hansı nöqtələr bir qrupa aiddir? | k-means (sadə), spectral (qeyri-xətti), GMM (soft) | k seçimi həmişə sizin qərarınızdır |
| Bu nöqtə nə qədər normaldır? | GMM və ya KDE ilə density | Bandwidth və component sayı cross-validation ilə |
| Yeni, inandırıcı nümunə yarada bilərəmmi? | GMM (sample) | Aşağı ölçüdə işləyin, PCA ilə birləşdirin |
Unsupervised alətlərin ortaq xüsusiyyəti: onlar cavab vermir, hipotez verir. k-means-in tapdığı qrup real seqmentdirmi, yoxsa alqoritmin artefaktıdır? Bunu yalnız domain biliyi və sonrakı supervised yoxlama deyə bilər.
Tapşırıqlar
- Digits dataset-ini
PCAilə 2 ölçüyə endirib class-lara görə rəngləyin. Sonra eyni data-daTSNEvəIsomaptətbiq edin. Üç şəkli yan-yana qoyun; hansı rəqəm cütləri hər üç metodda qarışır və bu nə deməkdir? make_moonsdataset-indəKMeans,SpectralClusteringvəGaussianMixture(covariance_type="full")işlədin. Hər birinin bölgüsünü çəkin və k-means ilə GMM-in niyə oxşar şəkildə uğursuz olduğunu, spectral clustering-in isə niyə olmadığını izah edin.- Bir ölçülü, iki təpəli data yaradın (iki Gaussian-ın qarışığı). Üç fərqli bin eni ilə histogram, sonra
GridSearchCVilə seçilmiş bandwidth-lə KDE çəkin. BIC iləGaussianMixture-ın seçdiyi component sayını da hesablayın və üç yanaşmanın "neçə təpə var?" sualına verdiyi cavabları müqayisə edin.