Travis CI Status AppVeyor CI Status Codecov PyPI - Python Version PyPI Project Page NIST Public Domain

pyMCR: Multivariate Curve Resolution in Python

GitHub Repository:

Documentation available online at

Software DOI:

Manuscript DOI:

pyMCR is a small package for performing multivariate curve resolution. Currently, it implements a simple alternating regression scheme (MCR-AR). The most common implementation is with ordinary least-squares regression, MCR-ALS.

MCR with non-negativity constraints on both matrices is the same as nonnegative matrix factorization (NMF). Historically, other names were used for MCR as well:

  • Self modeling mixture analysis (SMMA)

  • Self modeling curve resolution (SMCR)

Available methods

  • Regressors:

  • Constraints

    • Non-negativity

    • Normalization

    • Zero end-points

    • Zero (approx) end-points of cumulative summation (can specify nodes as well)

    • Non-negativity of cumulative summation

    • Compress or cut values above or below a threshold value

    • Replace sum-across-features samples (e.g., 0 concentration) with prescribed target

    • Enforce a plane (“planarize”). E.g., a concentration image is a plane.

  • Error metrics / Loss function

    • Mean-squared error

  • Other options

    • Fix known targets (C and/or ST, and let others vary)

Software Design Philosophy

What it does do:

  • Approximate the concentration and spectral matrices via minimization routines. This is the core the MCR methods.

  • Enable the application of certain constraints in a user-defined order.

What it does not do:


New in pyMCR 0.3.1, Python’s native logging module is now used to capture messages. Though this is not as convenient as print() statements, it has many advantages.

A simple example that prints simplified logging messages to the stdout (command line):

import sys
import logging

# Need to import pymcr or mcr prior to setting up the logger
from pymcr.mcr import McrAR

logger = logging.getLogger('pymcr')

# StdOut is a "stream"; thus, StreamHandler
stdout_handler = logging.StreamHandler(stream=sys.stdout)

# Set the message format. Simple and removing log level or date info
stdout_format = logging.Formatter('%(message)s')  # Just a basic message akin to print statements


# Begin your code for pyMCR below

Basic Usage

See also Usage and Examples.

from pymcr.mcr import McrAR
mcrar = McrAR()

# MCR assumes a system of the form: D = CS^T
# Data that you will provide (hyperspectral context):
# D [n_pixels, n_frequencies]  # Hyperspectral image unraveled in space (2D)
# initial_spectra [n_components, n_frequencies]  ## S^T in the literature
# OR
# initial_conc [n_pixels, n_components]   ## C in the literature

# If you have an initial estimate of the spectra, ST=initial_spectra)

# Otherwise, if you have an initial estimate of the concentrations, C=initial_conc)

Example Results

Command line and Jupyter notebook examples are provided in the Examples/ folder.

From Examples/Demo.ipynb:

_images/mcr_spectra_retr.png _images/mcr_conc_retr.png

Indices and tables