Декомпозиции набора данных лиц

Machine LearningMachine LearningBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии применяются различные методы ненаправленного разложения матриц (снижения размерности) из модуля sklearn.decomposition к набору данных Olivetti faces. Набор данных Olivetti faces состоит из 400 изображений лиц размером 64x64 пикселя, принадлежащих 40 людям, каждый из которых был сфотографирован с разными выражениями лица и условиями освещения.

Советы по использованию ВМ

После запуска виртуальной машины кликните в левом верхнем углу, чтобы переключиться на вкладку Notebook и приступить к практике с использованием Jupyter Notebook.

Иногда может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/datasets -.-> lab-49124{{"Декомпозиции набора данных лиц"}} ml/sklearn -.-> lab-49124{{"Декомпозиции набора данных лиц"}} end

Подготовка набора данных

Сначала мы загружаем и предобрабатываем набор данных Olivetti faces. Мы центрируем данные, чтобы они имели нулевое среднее значение, как глобально (фокус на одной характеристике, центрирование всех образцов), так и локально (фокус на одном образце, центрирование всех характеристик). Также определяем базовую функцию для построения галереи лиц.

## Loading and preprocessing the Olivetti faces dataset.

import logging

from numpy.random import RandomState
import matplotlib.pyplot as plt

from sklearn.datasets import fetch_olivetti_faces
from sklearn import cluster
from sklearn import decomposition

rng = RandomState(0)

## Display progress logs on stdout
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")

faces, _ = fetch_olivetti_faces(return_X_y=True, shuffle=True, random_state=rng)
n_samples, n_features = faces.shape

## Global centering (focus on one feature, centering all samples)
faces_centered = faces - faces.mean(axis=0)

## Local centering (focus on one sample, centering all features)
faces_centered -= faces_centered.mean(axis=1).reshape(n_samples, -1)

print("Dataset consists of %d faces" % n_samples)

## Define a base function to plot the gallery of faces.

n_row, n_col = 2, 3
n_components = n_row * n_col
image_shape = (64, 64)


def plot_gallery(title, images, n_col=n_col, n_row=n_row, cmap=plt.cm.gray):
    fig, axs = plt.subplots(
        nrows=n_row,
        ncols=n_col,
        figsize=(2.0 * n_col, 2.3 * n_row),
        facecolor="white",
        constrained_layout=True,
    )
    fig.set_constrained_layout_pads(w_pad=0.01, h_pad=0.02, hspace=0, wspace=0)
    fig.set_edgecolor("black")
    fig.suptitle(title, size=16)
    for ax, vec in zip(axs.flat, images):
        vmax = max(vec.max(), -vec.min())
        im = ax.imshow(
            vec.reshape(image_shape),
            cmap=cmap,
            interpolation="nearest",
            vmin=-vmax,
            vmax=vmax,
        )
        ax.axis("off")

    fig.colorbar(im, ax=axs, orientation="horizontal", shrink=0.99, aspect=40, pad=0.01)
    plt.show()


## Let's take a look at our data. Gray color indicates negative values,
## white indicates positive values.

plot_gallery("Faces from dataset", faces_centered[:n_components])

Эйгенлица - PCA с использованием случайного разложения сингулярных значений

Первым методом, который мы применяем, является PCA (Principal Component Analysis - анализ главных компонент), который представляет собой линейный метод снижения размерности, использующий разложение сингулярных значений (SVD - Singular Value Decomposition) данных для проекции их в пространство с меньшей размерностью. Мы используем случайное разложение сингулярных значений, которое представляет собой более быстрый приближенный алгоритм по сравнению с стандартным алгоритмом SVD. Мы строим первые шесть главных компонент, которые называются эйгенлицами.

## Eigenfaces - PCA using randomized SVD
pca_estimator = decomposition.PCA(
    n_components=n_components, svd_solver="randomized", whiten=True
)
pca_estimator.fit(faces_centered)
plot_gallery(
    "Eigenfaces - PCA using randomized SVD", pca_estimator.components_[:n_components]
)

Негативные компоненты - NMF

Далее мы применяем разложение матрицы на неотрицательные слагаемые (Non - negative Matrix Factorization - NMF), которое разлагает матрицу данных на две неотрицательные матрицы, одну из которых содержит базисные векторы, а другая - коэффициенты. Это приводит к представлению данных в виде набора частей.

## Non-negative components - NMF
nmf_estimator = decomposition.NMF(n_components=n_components, tol=5e-3)
nmf_estimator.fit(faces)  ## original non- negative dataset
plot_gallery("Non-negative components - NMF", nmf_estimator.components_[:n_components])

Независимые компоненты - FastICA

Метод анализа независимых компонент (Independent Component Analysis - ICA) - это метод разделения многомерных сигналов на аддитивные подкомпоненты, которые максимально независимы. Мы применяем FastICA, который представляет собой быстрый и надежный алгоритм для ICA.

## Independent components - FastICA
ica_estimator = decomposition.FastICA(
    n_components=n_components, max_iter=400, whiten="arbitrary-variance", tol=15e-5
)
ica_estimator.fit(faces_centered)
plot_gallery(
    "Independent components - FastICA", ica_estimator.components_[:n_components]
)

Sparse components - MiniBatchSparsePCA

Sparse PCA - это модификация метода PCA, которая поощряет разреженность в векторах нагрузки, что позволяет получить более интерпретируемое разложение. Мы используем MiniBatchSparsePCA, которая представляет собой более быструю версию SparsePCA, лучше подходящую для обработки больших наборов данных.

## Sparse components - MiniBatchSparsePCA
batch_pca_estimator = decomposition.MiniBatchSparsePCA(
    n_components=n_components, alpha=0.1, max_iter=100, batch_size=3, random_state=rng
)
batch_pca_estimator.fit(faces_centered)
plot_gallery(
    "Sparse components - MiniBatchSparsePCA",
    batch_pca_estimator.components_[:n_components],
)

Обучение словаря

Обучение словаря - это метод для нахождения разреженного представления входных данных в виде комбинации простых элементов, которые образуют словарь. Мы применяем MiniBatchDictionaryLearning, которая представляет собой более быструю версию DictionaryLearning, лучше подходящую для обработки больших наборов данных.

## Dictionary learning
batch_dict_estimator = decomposition.MiniBatchDictionaryLearning(
    n_components=n_components, alpha=0.1, max_iter=50, batch_size=3, random_state=rng
)
batch_dict_estimator.fit(faces_centered)
plot_gallery("Dictionary learning", batch_dict_estimator.components_[:n_components])

Центры кластеров - MiniBatchKMeans

Алгоритм k - means кластеризации - это метод разделения набора данных на кластеры путем минимизации суммы квадратов расстояний между каждой точкой и центроидом ее назначенного кластера. Мы применяем MiniBatchKMeans, которая представляет собой более быструю версию KMeans, лучше подходящую для обработки больших наборов данных.

## Cluster centers - MiniBatchKMeans
kmeans_estimator = cluster.MiniBatchKMeans(
    n_clusters=n_components,
    tol=1e-3,
    batch_size=20,
    max_iter=50,
    random_state=rng,
    n_init="auto",
)
kmeans_estimator.fit(faces_centered)
plot_gallery(
    "Cluster centers - MiniBatchKMeans",
    kmeans_estimator.cluster_centers_[:n_components],
)

Компоненты Факторного Анализа - FA

Факторный анализ - это метод для моделирования дисперсии в каждом направлении входного пространства независимо (гетероскедастический шум), похожий на PCA, но с этим преимуществом. Мы применяем FactorAnalysis, которая представляет собой реализацию Факторного Анализа в scikit - learn.

## Factor Analysis components - FA
fa_estimator = decomposition.FactorAnalysis(n_components=n_components, max_iter=20)
fa_estimator.fit(faces_centered)
plot_gallery("Factor Analysis (FA)", fa_estimator.components_[:n_components])

## --- Pixelwise variance
plt.figure(figsize=(3.2, 3.6), facecolor="white", tight_layout=True)
vec = fa_estimator.noise_variance_
vmax = max(vec.max(), -vec.min())
plt.imshow(
    vec.reshape(image_shape),
    cmap=plt.cm.gray,
    interpolation="nearest",
    vmin=-vmax,
    vmax=vmax,
)
plt.axis("off")
plt.title("Pixelwise variance from \n Factor Analysis (FA)", size=16, wrap=True)
plt.colorbar(orientation="horizontal", shrink=0.8, pad=0.03)
plt.show()

Декомпозиция: обучение словаря

Мы снова применяем MiniBatchDictionaryLearning, но на этот раз мы настаиваем на положительности при нахождении словаря и/или коэффициентов кодирования.

Обучение словаря - положительный словарь

dict_pos_dict_estimator = decomposition.MiniBatchDictionaryLearning(
    n_components=n_components,
    alpha=0.1,
    max_iter=50,
    batch_size=3,
    random_state=rng,
    positive_dict=True,
)
dict_pos_dict_estimator.fit(faces_centered)
plot_gallery(
    "Dictionary learning - positive dictionary",
    dict_pos_dict_estimator.components_[:n_components],
    cmap=plt.cm.RdBu,
)

Обучение словаря - положительный код

dict_pos_code_estimator = decomposition.MiniBatchDictionaryLearning(
    n_components=n_components,
    alpha=0.1,
    max_iter=50,
    batch_size=3,
    fit_algorithm="cd",
    random_state=rng,
    positive_code=True,
)
dict_pos_code_estimator.fit(faces_centered)
plot_gallery(
    "Dictionary learning - positive code",
    dict_pos_code_estimator.components_[:n_components],
    cmap=plt.cm.RdBu,
)

Обучение словаря - положительный словарь и код

dict_pos_estimator = decomposition.MiniBatchDictionaryLearning(
    n_components=n_components,
    alpha=0.1,
    max_iter=50,
    batch_size=3,
    fit_algorithm="cd",
    random_state=rng,
    positive_dict=True,
    positive_code=True,
)
dict_pos_estimator.fit(faces_centered)
plot_gallery(
    "Dictionary learning - positive dictionary & code",
    dict_pos_estimator.components_[:n_components],
    cmap=plt.cm.RdBu,
)

Резюме

В этом лабораторном занятии мы применили различные методы ненаправленной матричной декомпозиции к набору данных Olivetti faces. Мы использовали PCA, NMF, ICA, Sparse PCA, обучение словаря, кластеризацию K-means и факторный анализ для извлечения различных типов признаков из данных. Мы также настаивали на положительности при нахождении словаря и/или коэффициентов кодирования в методе обучения словаря. В целом, эти методы могут быть полезны для уменьшения размерности высокомерных наборов данных и извлечения значащих признаков для последующих задач, таких как классификация и кластеризация.