← All NMath Stats Code Examples

```using System;

using CenterSpace.NMath.Core;
using CenterSpace.NMath.Stats;

namespace CenterSpace.NMath.Stats.Examples.CSharp
{
/// <summary>
/// This is a .NET example in C# showing Partial Least Squares (PLS) scores
/// In chemometrics one often wishes to know the chemical composition of a
/// sample of, say, a gas or liquid. One common technique is to study the absorption
/// spectrum of light passing through the sample. Partial Least Squares (PLS)
/// is often used to construct a predictive model in this situation. Suppose we
/// wish to measure the concentration of a constituent in the
/// substance and that we look at n different absorption spectra (an absorption
/// spectra measures the amount of light absorbed at each wavelength). Pick p
/// different wavelengths in the absorption spectra and let A = {aij} be the
/// be the nxp matrix where aij is the absorption measurement at the jth
/// wavelength in the ith sample. And let C = {ci} be the m vector where
/// ci is the concentration of the constituent in the ith sample.
/// This example constructs a predictive model for C given A using PLS. In
/// particular the scores and loadings for the response variable, C, and the
/// predictor variable, A, are examined.
/// </summary>
{
static void Main( string[] args )
{
var rng = new RandGenUniform( 0x124 );
rng.LowerBound = 0.1;
rng.UpperBound = 1.1;
int n = 7; // number of samples (spectra)
int p = 10; // number of data points (wavelength)
int f = 4;  // number of PLS eigenvectors

var A = new DoubleMatrix( n, p, rng ); // spectral absorbances
var C = new DoubleVector( n, rng );    // constituent concentrations
var pls = new PLS1();

Console.WriteLine();
Console.WriteLine( "Performing calculation..." );
pls.Calculate( A, C, f );

Console.WriteLine();
Console.WriteLine( "Is it good? {0}\n", pls.IsGood );
Console.WriteLine();

var alg = (PLS1NipalsAlgorithm) pls.Calculator;

// Get the spectral scores
DoubleMatrix S = alg.Scores;
Console.WriteLine();
Console.WriteLine( "Spectral Scores ------------------------------\n" );
for ( int i = 0; i < f; ++i )
{
Console.WriteLine( "spectral score {0}\n{1}\n", i, S.Col( i ).ToString( "G5" ) );
}
Console.WriteLine();

Console.WriteLine();
for ( int i = 0; i < f; ++i )
{
}
Console.WriteLine();

// Predict the constituent concentrations from a vector of spectral responses.
// The regression vector, r, can be used for prediction as follows:
// Let Cu be the predicted concentration for the spectral response
// vector Au, let Abar the mean of the spectral data and Cbar be the mean
// of the concentrations data used to create the model. Then
// Cu = Cbar + (Au - Abar)'r.
var Au = new DoubleVector( p, rng ); // spectral responses
double Cbar = alg.ResponseMean;
DoubleVector Abar = alg.PredictorMean;
DoubleVector r = alg.RegressionVector;

double Cu = Cbar + NMathFunctions.Dot( ( Au - Abar ), r );
Console.WriteLine();
Console.WriteLine( "Prediction Using Regression Vector ------------------" );
Console.WriteLine();
Console.WriteLine( "Predicted concentrations for spectral response \n\n{0} \n\nis \n\n{1}", Au.ToString( "G5" ), Cu );

Console.WriteLine();
Console.WriteLine( "Press Enter Key" );