.. only:: html .. note:: :class: sphx-glr-download-link-note Click :ref:`here ` to download the full example code or to run this example in your browser via Binder .. rst-class:: sphx-glr-example-title .. _sphx_glr_auto_examples_decomposition_plot_faces_decomposition.py: ============================ Faces dataset decompositions ============================ This example applies to :ref:`olivetti_faces_dataset` different unsupervised matrix decomposition (dimension reduction) methods from the module :py:mod:`sklearn.decomposition` (see the documentation chapter :ref:`decompositions`) . .. rst-class:: sphx-glr-horizontal * .. image:: /auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_001.png :alt: First centered Olivetti faces :class: sphx-glr-multi-img * .. image:: /auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_002.png :alt: Eigenfaces - PCA using randomized SVD - Train time 0.0s :class: sphx-glr-multi-img * .. image:: /auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_003.png :alt: Non-negative components - NMF - Train time 0.1s :class: sphx-glr-multi-img * .. image:: /auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_004.png :alt: Independent components - FastICA - Train time 0.1s :class: sphx-glr-multi-img * .. image:: /auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_005.png :alt: Sparse comp. - MiniBatchSparsePCA - Train time 0.8s :class: sphx-glr-multi-img * .. image:: /auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_006.png :alt: MiniBatchDictionaryLearning - Train time 0.5s :class: sphx-glr-multi-img * .. image:: /auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_007.png :alt: Cluster centers - MiniBatchKMeans - Train time 0.1s :class: sphx-glr-multi-img * .. image:: /auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_008.png :alt: Pixelwise variance :class: sphx-glr-multi-img * .. image:: /auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_009.png :alt: Factor Analysis components - FA - Train time 0.2s :class: sphx-glr-multi-img * .. image:: /auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_010.png :alt: First centered Olivetti faces :class: sphx-glr-multi-img * .. image:: /auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_011.png :alt: Dictionary learning :class: sphx-glr-multi-img * .. image:: /auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_012.png :alt: Dictionary learning - positive dictionary :class: sphx-glr-multi-img * .. image:: /auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_013.png :alt: Dictionary learning - positive code :class: sphx-glr-multi-img * .. image:: /auto_examples/decomposition/images/sphx_glr_plot_faces_decomposition_014.png :alt: Dictionary learning - positive dictionary & code :class: sphx-glr-multi-img .. rst-class:: sphx-glr-script-out Out: .. code-block:: none Dataset consists of 400 faces Extracting the top 6 Eigenfaces - PCA using randomized SVD... done in 0.021s Extracting the top 6 Non-negative components - NMF... done in 0.088s Extracting the top 6 Independent components - FastICA... /home/circleci/project/sklearn/decomposition/_fastica.py:118: ConvergenceWarning: FastICA did not converge. Consider increasing tolerance or the maximum number of iterations. warnings.warn('FastICA did not converge. Consider increasing ' done in 0.146s Extracting the top 6 Sparse comp. - MiniBatchSparsePCA... done in 0.769s Extracting the top 6 MiniBatchDictionaryLearning... done in 0.517s Extracting the top 6 Cluster centers - MiniBatchKMeans... done in 0.079s Extracting the top 6 Factor Analysis components - FA... done in 0.181s Extracting the top 6 Dictionary learning... done in 0.492s Extracting the top 6 Dictionary learning - positive dictionary... done in 0.498s Extracting the top 6 Dictionary learning - positive code... done in 0.130s Extracting the top 6 Dictionary learning - positive dictionary & code... done in 0.194s | .. code-block:: default print(__doc__) # Authors: Vlad Niculae, Alexandre Gramfort # License: BSD 3 clause import logging from time import time from numpy.random import RandomState import matplotlib.pyplot as plt from sklearn.datasets import fetch_olivetti_faces from sklearn.cluster import MiniBatchKMeans from sklearn import decomposition # Display progress logs on stdout logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s') n_row, n_col = 2, 3 n_components = n_row * n_col image_shape = (64, 64) rng = RandomState(0) # ############################################################################# # Load faces data faces, _ = fetch_olivetti_faces(return_X_y=True, shuffle=True, random_state=rng) n_samples, n_features = faces.shape # global centering faces_centered = faces - faces.mean(axis=0) # local centering faces_centered -= faces_centered.mean(axis=1).reshape(n_samples, -1) print("Dataset consists of %d faces" % n_samples) def plot_gallery(title, images, n_col=n_col, n_row=n_row, cmap=plt.cm.gray): plt.figure(figsize=(2. * n_col, 2.26 * n_row)) plt.suptitle(title, size=16) for i, comp in enumerate(images): plt.subplot(n_row, n_col, i + 1) vmax = max(comp.max(), -comp.min()) plt.imshow(comp.reshape(image_shape), cmap=cmap, interpolation='nearest', vmin=-vmax, vmax=vmax) plt.xticks(()) plt.yticks(()) plt.subplots_adjust(0.01, 0.05, 0.99, 0.93, 0.04, 0.) # ############################################################################# # List of the different estimators, whether to center and transpose the # problem, and whether the transformer uses the clustering API. estimators = [ ('Eigenfaces - PCA using randomized SVD', decomposition.PCA(n_components=n_components, svd_solver='randomized', whiten=True), True), ('Non-negative components - NMF', decomposition.NMF(n_components=n_components, init='nndsvda', tol=5e-3), False), ('Independent components - FastICA', decomposition.FastICA(n_components=n_components, whiten=True), True), ('Sparse comp. - MiniBatchSparsePCA', decomposition.MiniBatchSparsePCA(n_components=n_components, alpha=0.8, n_iter=100, batch_size=3, random_state=rng), True), ('MiniBatchDictionaryLearning', decomposition.MiniBatchDictionaryLearning(n_components=15, alpha=0.1, n_iter=50, batch_size=3, random_state=rng), True), ('Cluster centers - MiniBatchKMeans', MiniBatchKMeans(n_clusters=n_components, tol=1e-3, batch_size=20, max_iter=50, random_state=rng), True), ('Factor Analysis components - FA', decomposition.FactorAnalysis(n_components=n_components, max_iter=20), True), ] # ############################################################################# # Plot a sample of the input data plot_gallery("First centered Olivetti faces", faces_centered[:n_components]) # ############################################################################# # Do the estimation and plot it for name, estimator, center in estimators: print("Extracting the top %d %s..." % (n_components, name)) t0 = time() data = faces if center: data = faces_centered estimator.fit(data) train_time = (time() - t0) print("done in %0.3fs" % train_time) if hasattr(estimator, 'cluster_centers_'): components_ = estimator.cluster_centers_ else: components_ = estimator.components_ # Plot an image representing the pixelwise variance provided by the # estimator e.g its noise_variance_ attribute. The Eigenfaces estimator, # via the PCA decomposition, also provides a scalar noise_variance_ # (the mean of pixelwise variance) that cannot be displayed as an image # so we skip it. if (hasattr(estimator, 'noise_variance_') and estimator.noise_variance_.ndim > 0): # Skip the Eigenfaces case plot_gallery("Pixelwise variance", estimator.noise_variance_.reshape(1, -1), n_col=1, n_row=1) plot_gallery('%s - Train time %.1fs' % (name, train_time), components_[:n_components]) plt.show() # ############################################################################# # Various positivity constraints applied to dictionary learning. estimators = [ ('Dictionary learning', decomposition.MiniBatchDictionaryLearning(n_components=15, alpha=0.1, n_iter=50, batch_size=3, random_state=rng), True), ('Dictionary learning - positive dictionary', decomposition.MiniBatchDictionaryLearning(n_components=15, alpha=0.1, n_iter=50, batch_size=3, random_state=rng, positive_dict=True), True), ('Dictionary learning - positive code', decomposition.MiniBatchDictionaryLearning(n_components=15, alpha=0.1, n_iter=50, batch_size=3, fit_algorithm='cd', random_state=rng, positive_code=True), True), ('Dictionary learning - positive dictionary & code', decomposition.MiniBatchDictionaryLearning(n_components=15, alpha=0.1, n_iter=50, batch_size=3, fit_algorithm='cd', random_state=rng, positive_dict=True, positive_code=True), True), ] # ############################################################################# # Plot a sample of the input data plot_gallery("First centered Olivetti faces", faces_centered[:n_components], cmap=plt.cm.RdBu) # ############################################################################# # Do the estimation and plot it for name, estimator, center in estimators: print("Extracting the top %d %s..." % (n_components, name)) t0 = time() data = faces if center: data = faces_centered estimator.fit(data) train_time = (time() - t0) print("done in %0.3fs" % train_time) components_ = estimator.components_ plot_gallery(name, components_[:n_components], cmap=plt.cm.RdBu) plt.show() .. rst-class:: sphx-glr-timing **Total running time of the script:** ( 0 minutes 4.746 seconds) .. _sphx_glr_download_auto_examples_decomposition_plot_faces_decomposition.py: .. only :: html .. container:: sphx-glr-footer :class: sphx-glr-footer-example .. container:: binder-badge .. image:: https://mybinder.org/badge_logo.svg :target: https://mybinder.org/v2/gh/scikit-learn/scikit-learn/0.23.X?urlpath=lab/tree/notebooks/auto_examples/decomposition/plot_faces_decomposition.ipynb :width: 150 px .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_faces_decomposition.py ` .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_faces_decomposition.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_