Примечание
Перейти к концу для скачивания полного примера кода. Или запустите этот пример в своём браузере через JupyterLite или Binder
Разложения набора данных "Лица"
В этом примере на набор данных "Лица" Оливьети применяются различные методы бессобытийного разложения матриц (сжатия размерности) из модуля sklearn.decomposition (см. главу документации Разложение сигналов на компоненты (задачи факторизации матриц)).
- Авторы: Vlad Niculae, Alexandre Gramfort
- Лицензия: BSD 3-х пунктов
# Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause
Подготовка набора данных
Загрузка и предобработка набора данных "Лица" Оливьети.
import logging
import matplotlib.pyplot as plt
from numpy.random import RandomState
from sklearn import cluster, decomposition
from sklearn.datasets import fetch_olivetti_faces
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)
Dataset consists of 400 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()
Посмотрим на наши данные. Серый цвет обозначает отрицательные значения, белый — положительные.
plot_gallery("Faces from dataset", faces_centered[:n_components])

Разложение
Инициализируем различные оценщики для разложения и подгоняем каждый из них к всем изображениям, а затем построим некоторые результаты. Каждый оценщик извлекает 6 компонент в виде векторов \(h \in \mathbb{R}^{4096}\). Мы просто представили эти векторы в удобном для человека визуализации в виде изображений 64x64 пикселя.
Дополнительную информацию см. в Руководстве пользователя.
Лица - PCA с использованием случайного SVD
Линейное уменьшение размерности с помощью сингулярного разложения (SVD) данных для их проекции на пространство меньшей размерности.
Примечание
Оценщик "Лица" через sklearn.decomposition.PCA также предоставляет скаляр noise_variance_ (среднее значение дисперсии по пикселям), который нельзя отобразить в виде изображения.
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
Оцениваем неотрицательные исходные данные как произведение двух неотрицательных матриц.
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
Анализ независимых компонент разделяет многомерные векторы на аддитивные подкомпоненты, которые максимально независимы.
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]
)

Разряженные компоненты - MiniBatchSparsePCA
Разряженная PCA с мини-пачками (MiniBatchSparsePCA) извлекает набор разряженных компонент, которые лучше всего восстанавливают данные. Этот вариант быстрее, но менее точен, чем аналогичный SparsePCA.
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 делит данные на мини-пачки и оптимизирует их онлайн-режиме, перебирая мини-пачки для указанного количества итераций.
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
sklearn.cluster.MiniBatchKMeans вычислительно эффективен и реализует онлайн-обучение с методом partial_fit. Поэтому он может быть полезен для улучшения некоторых трудоёмких алгоритмов с MiniBatchKMeans.
kmeans_estimator = cluster.MiniBatchKMeans(
n_clusters=n_components,
tol=1e-3,
batch_size=20,
max_iter=50,
random_state=rng,
)
kmeans_estimator.fit(faces_centered)
plot_gallery(
"Cluster centers - MiniBatchKMeans",
kmeans_estimator.cluster_centers_[:n_components],
)

Компоненты факторного анализа - FA
FactorAnalysis похож на PCA, но имеет преимущество моделирования дисперсии в каждом направлении входного пространства независимо (неоднородный шум). Дополнительную информацию см. в Руководстве пользователя.
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 реализует более быструю, но менее точную версию алгоритма обучения словаря, которая лучше подходит для больших наборов данных. Дополнительную информацию см. в Руководстве пользователя.
Построим те же образцы из нашего набора данных, но с другой цветовой палитрой. Красный цвет указывает на отрицательные значения, синий — на положительные, а белый — на нулевые.
plot_gallery("Faces from dataset", faces_centered[:n_components], cmap=plt.cm.RdBu)

Аналогично предыдущим примерам, мы изменяем параметры и обучаем MiniBatchDictionaryLearning оценщик на всех изображениях. Как правило, обучение словаря и разреженное кодирование разлагают входные данные на матрицы словаря и коэффициентов кодирования. \(X \approx UV\), где \(X = [x_1, . . . , x_n]\), \(X \in \mathbb{R}^{m×n}\), словарь \(U \in \mathbb{R}^{m×k}\), коэффициенты кодирования \(V \in \mathbb{R}^{k×n}\).
Ниже также представлены результаты, когда словарь и коэффициенты кодирования ограничены положительными значениями.
Обучение словаря — положительный словарь
В следующем разделе мы применяем ограничение положительности при поиске словаря.
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,
)

Общее время выполнения скрипта: (0 минут 8,509 секунд)
Связанные примеры
© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/decomposition/plot_faces_decomposition.html

