Nonlinear Iterative Partial Least Squares

- firstPC :: Matrix Double -> (Vector Double, Vector Double, Matrix Double)
- firstPCFromScores :: Matrix Double -> Vector Double -> (Vector Double, Vector Double, Matrix Double)
- firstPCFromScoresM :: Monad m => m [Vector Double] -> Vector Double -> m (Vector Double, Vector Double)
- residual :: [Vector Double] -> Vector Double -> Vector Double -> [Vector Double]

# Simplified Interface

firstPC :: Matrix Double -> (Vector Double, Vector Double, Matrix Double)Source

Calculate the first principal component of a set of samples.

Each row in the matrix is one sample. Note that this is transposed
compared to the implementation of principal components using `svd`

or `leftSV`

Example:

let (pc,scores,residuals) = firstPC $ fromRows samples

This is calculated by providing a default estimate of the scores to
`firstPCFromScores`

firstPCFromScores :: Matrix Double -> Vector Double -> (Vector Double, Vector Double, Matrix Double)Source

Calculate the first principal component of a set of samples given a starting estimate of the scores.

Each row in the matrix is one sample. Note that this is transposed
compared to the implementation of principal components using `svd`

or `leftSV`

The second argument is a starting guess for the score vector. If this is close to the actual score vector, then this will cause the algorthm to converge much faster.

Example:

let (pc,scores,residuals) = firstPCFromScores (fromRows samples) scoresGuess

# Monadic interface

firstPCFromScoresM :: Monad m => m [Vector Double] -> Vector Double -> m (Vector Double, Vector Double)Source

Calculate the first principal component -- calculating the samples fresh on every pass.

This function calculates the exact same results as
`firstPCFromScores`

(minus the residual), but instead of an input
`Matrix`

, it takes a monad action that yields the list of samples,
and it guarantees that the list returned by the action will be
consumed in a single pass. However the action may be demanded many
times.

The residual can't be calculated lazily, like it is in
`firstPCFromScores`

, because the samples would need to be
demanded. Instead, to calculate the residual use `residual`

.

There is no corresponding `firstPCM`

that guesses the initial score
vector for you because if you need to use this function instead of
`firstPC`

, then you really should come up with a reasonable
starting point or it will take forever.

:: [Vector Double] | The samples |

-> Vector Double | The component (also called the loading) |

-> Vector Double | The scores |

-> [Vector Double] | The residuals for each sample |

Calculate the residuals of a series of samples given a component and score vector.

(p,t) <- firstPCFromScoresM samplesM (randomVector 0 Gaussian numSamples) samples <- samplesM let r = residual samples p t