# pyMCR: Multivariate Curve Resolution in Python¶

**GitHub Repository:** https://www.github.com/usnistgov/pyMCR

Documentation available online at https://pages.nist.gov/pyMCR

Software DOI: https://doi.org/10.18434/M32064

Manuscript DOI: https://doi.org/10.6028/jres.124.018

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)

## Documentation¶

- Installation
- Usage and Examples
- Basic Usage
- Default: Ordinary Least-Squares (OLS) with Non-Negativity Constraints
- Non-Negative Least-Squares (NNLS), No Constraints
- Mix NNLS and OLS Regressors, Non-Negativity and Sum-to-1 (i.e., Norm) Constraints
- Ridge-Regression from Scikit-Learn
- Single-Gaussian Distribution Spectral Fitting with LMFIT
- Semi-Learned Fitting

- License

## Available methods¶

Regressors:

Ordinary least squares (default)

Native support for scikit-learn linear model regressors (e.g., LinearRegression, RidgeRegression, Lasso)

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:

Estimate the number of components in the sample (though some tools tools may be provided in the future). This is a bonus feature in some more-advanced MCR-ALS packages.

## Logging¶

**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.

Logging module docs: https://docs.python.org/3.7/library/logging.html

Logging tutorial: https://docs.python.org/3.7/howto/logging.html#logging-basic-tutorial

Logging cookbook: https://docs.python.org/3.7/howto/logging-cookbook.html#logging-cookbook

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')
logger.setLevel(logging.DEBUG)
# 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
stdout_handler.setFormatter(stdout_format)
logger.addHandler(stdout_handler)
# 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
mcrar.fit(D, ST=initial_spectra)
# Otherwise, if you have an initial estimate of the concentrations
mcrar.fit(D, C=initial_conc)
```

## Example Results¶

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

folder.

From `Examples/Demo.ipynb`

:

## Citing this Software¶

If you use *pyMCR*, citing the following article is much appreciated: