{-# OPTIONS_GHC -fplugin=GHC.TypeLits.KnownNat.Solver -fplugin=GHC.TypeLits.Normalise -fconstraint-solver-iterations=10 #-}
{-# LANGUAGE
    TypeApplications,
    UndecidableInstances,
    NoStarIsType,
    GeneralizedNewtypeDeriving,
    StandaloneDeriving,
    ScopedTypeVariables,
    ExplicitNamespaces,
    TypeOperators,
    KindSignatures,
    DataKinds,
    RankNTypes,
    TypeFamilies,
    FlexibleContexts,
    MultiParamTypeClasses,
    ConstraintKinds,
    FlexibleInstances
#-}
-- | An Exponential Family 'Harmonium' is a product exponential family with a
-- particular bilinear structure (<https://papers.nips.cc/paper/2672-exponential-family-harmoniums-with-an-application-to-information-retrieval Welling, et al., 2005>).
-- A 'Mixture' model is a special case of harmonium. A 'FactorAnalysis' model
-- can also be interpreted as a 'Harmonium' with a fixed latent distribution.
module Goal.Graphical.Models.Harmonium.FactorAnalysis
    (
    -- * Factor Analysis
      FactorAnalysis
    , factorAnalysisObservableDistribution
    , factorAnalysisExpectationMaximization
    , factorAnalysisUniqueness
    ) where

--- Imports ---


import Goal.Core
import Goal.Geometry
import Goal.Probability

import Goal.Graphical.Models
import Goal.Graphical.Models.Harmonium

import qualified Goal.Core.Vector.Storable as S


--- Types ---


type FactorAnalysis n k = Affine Tensor (MVNMean n) (Replicated n Normal) (MVNMean k)

type instance Observation (FactorAnalysis n k) = S.Vector n Double

factorAnalysisObservableDistribution
    :: (KnownNat n, KnownNat k)
    => Natural # FactorAnalysis n k
    -> Natural # MultivariateNormal n
factorAnalysisObservableDistribution :: (Natural # FactorAnalysis n k) -> Natural # MultivariateNormal n
factorAnalysisObservableDistribution =
     (Natural
 # Affine Tensor (MVNMean k) (MultivariateNormal k) (MVNMean n),
 Natural # MultivariateNormal n)
-> Natural # MultivariateNormal n
forall a b. (a, b) -> b
snd ((Natural
  # Affine Tensor (MVNMean k) (MultivariateNormal k) (MVNMean n),
  Natural # MultivariateNormal n)
 -> Natural # MultivariateNormal n)
-> ((Natural # FactorAnalysis n k)
    -> (Natural
        # Affine Tensor (MVNMean k) (MultivariateNormal k) (MVNMean n),
        Natural # MultivariateNormal n))
-> (Natural # FactorAnalysis n k)
-> Natural # MultivariateNormal n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Natural
 # AffineHarmonium
     Tensor
     (MVNMean k)
     (MVNMean n)
     (MultivariateNormal k)
     (MultivariateNormal n))
-> (Natural
    # Affine Tensor (MVNMean k) (MultivariateNormal k) (MVNMean n),
    Natural # MultivariateNormal n)
forall (f :: Type -> Type -> Type) y x z w.
ConjugatedLikelihood f y x z w =>
(Natural # AffineHarmonium f y x z w)
-> (Natural # Affine f y z x, Natural # w)
splitConjugatedHarmonium ((Natural
  # AffineHarmonium
      Tensor
      (MVNMean k)
      (MVNMean n)
      (MultivariateNormal k)
      (MultivariateNormal n))
 -> (Natural
     # Affine Tensor (MVNMean k) (MultivariateNormal k) (MVNMean n),
     Natural # MultivariateNormal n))
-> ((Natural # FactorAnalysis n k)
    -> Natural
       # AffineHarmonium
           Tensor
           (MVNMean k)
           (MVNMean n)
           (MultivariateNormal k)
           (MultivariateNormal n))
-> (Natural # FactorAnalysis n k)
-> (Natural
    # Affine Tensor (MVNMean k) (MultivariateNormal k) (MVNMean n),
    Natural # MultivariateNormal n)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Natural
 # AffineHarmonium
     Tensor
     (MVNMean n)
     (MVNMean k)
     (MultivariateNormal n)
     (MultivariateNormal k))
-> Natural
   # AffineHarmonium
       Tensor
       (MVNMean k)
       (MVNMean n)
       (MultivariateNormal k)
       (MultivariateNormal n)
forall (f :: Type -> Type -> Type) y x z w c.
(Bilinear f y x, Manifold z, Manifold w) =>
(c # AffineHarmonium f y x z w) -> c # AffineHarmonium f x y w z
transposeHarmonium
     ((Natural
  # AffineHarmonium
      Tensor
      (MVNMean n)
      (MVNMean k)
      (MultivariateNormal n)
      (MultivariateNormal k))
 -> Natural
    # AffineHarmonium
        Tensor
        (MVNMean k)
        (MVNMean n)
        (MultivariateNormal k)
        (MultivariateNormal n))
-> ((Natural # FactorAnalysis n k)
    -> Natural
       # AffineHarmonium
           Tensor
           (MVNMean n)
           (MVNMean k)
           (MultivariateNormal n)
           (MultivariateNormal k))
-> (Natural # FactorAnalysis n k)
-> Natural
   # AffineHarmonium
       Tensor
       (MVNMean k)
       (MVNMean n)
       (MultivariateNormal k)
       (MultivariateNormal n)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Natural # FactorAnalysis n k)
-> Natural
   # AffineHarmonium
       Tensor
       (MVNMean n)
       (MVNMean k)
       (MultivariateNormal n)
       (MultivariateNormal k)
forall (n :: Nat) (k :: Nat).
(KnownNat n, KnownNat k) =>
(Natural # FactorAnalysis n k)
-> Natural # LinearGaussianHarmonium n k
naturalFactorAnalysisToLGH

factorAnalysisExpectationMaximization
    :: ( KnownNat n, KnownNat k)
    => [S.Vector n Double]
    -> Natural # FactorAnalysis n k
    -> Natural # FactorAnalysis n k
factorAnalysisExpectationMaximization :: [Vector n Double]
-> (Natural # FactorAnalysis n k) -> Natural # FactorAnalysis n k
factorAnalysisExpectationMaximization [Vector n Double]
zs Natural # FactorAnalysis n k
fa =
    (Source # FactorAnalysis n k) -> Natural # FactorAnalysis n k
forall c d x. Transition c d x => (c # x) -> d # x
transition ((Source # FactorAnalysis n k) -> Natural # FactorAnalysis n k)
-> ((Natural
     # AffineHarmonium
         Tensor
         (MVNMean n)
         (MVNMean k)
         (MultivariateNormal n)
         (MultivariateNormal k))
    -> Source # FactorAnalysis n k)
-> (Natural
    # AffineHarmonium
        Tensor
        (MVNMean n)
        (MVNMean k)
        (MultivariateNormal n)
        (MultivariateNormal k))
-> Natural # FactorAnalysis n k
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Mean
 # AffineHarmonium
     Tensor
     (MVNMean n)
     (MVNMean k)
     (MultivariateNormal n)
     (MultivariateNormal k))
-> Source # FactorAnalysis n k
forall (n :: Nat) (k :: Nat).
(KnownNat n, KnownNat k) =>
(Mean # LinearGaussianHarmonium n k) -> Source # FactorAnalysis n k
sourceFactorAnalysisMaximizationStep ((Mean
  # AffineHarmonium
      Tensor
      (MVNMean n)
      (MVNMean k)
      (MultivariateNormal n)
      (MultivariateNormal k))
 -> Source # FactorAnalysis n k)
-> ((Natural
     # AffineHarmonium
         Tensor
         (MVNMean n)
         (MVNMean k)
         (MultivariateNormal n)
         (MultivariateNormal k))
    -> Mean
       # AffineHarmonium
           Tensor
           (MVNMean n)
           (MVNMean k)
           (MultivariateNormal n)
           (MultivariateNormal k))
-> (Natural
    # AffineHarmonium
        Tensor
        (MVNMean n)
        (MVNMean k)
        (MultivariateNormal n)
        (MultivariateNormal k))
-> Source # FactorAnalysis n k
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sample (MultivariateNormal n)
-> (Natural
    # AffineHarmonium
        Tensor
        (MVNMean n)
        (MVNMean k)
        (MultivariateNormal n)
        (MultivariateNormal k))
-> Mean
   # AffineHarmonium
       Tensor
       (MVNMean n)
       (MVNMean k)
       (MultivariateNormal n)
       (MultivariateNormal k)
forall z (f :: Type -> Type -> Type) x y w.
(ExponentialFamily z, Map Natural f x y, Bilinear f y x,
 Translation z y, Translation w x, LegendreExponentialFamily w) =>
Sample z
-> (Natural # AffineHarmonium f y x z w)
-> Mean # AffineHarmonium f y x z w
expectationStep [Vector n Double]
Sample (MultivariateNormal n)
zs
        ((Natural
  # AffineHarmonium
      Tensor
      (MVNMean n)
      (MVNMean k)
      (MultivariateNormal n)
      (MultivariateNormal k))
 -> Natural # FactorAnalysis n k)
-> (Natural
    # AffineHarmonium
        Tensor
        (MVNMean n)
        (MVNMean k)
        (MultivariateNormal n)
        (MultivariateNormal k))
-> Natural # FactorAnalysis n k
forall a b. (a -> b) -> a -> b
$ (Natural # FactorAnalysis n k)
-> Natural
   # AffineHarmonium
       Tensor
       (MVNMean n)
       (MVNMean k)
       (MultivariateNormal n)
       (MultivariateNormal k)
forall (n :: Nat) (k :: Nat).
(KnownNat n, KnownNat k) =>
(Natural # FactorAnalysis n k)
-> Natural # LinearGaussianHarmonium n k
naturalFactorAnalysisToLGH Natural # FactorAnalysis n k
fa

factorAnalysisUniqueness
    :: (KnownNat n, KnownNat k)
    => Natural # FactorAnalysis n k
    -> S.Vector n Double
factorAnalysisUniqueness :: (Natural # FactorAnalysis n k) -> Vector n Double
factorAnalysisUniqueness Natural # FactorAnalysis n k
fa =
    let lds :: Matrix n k Double
lds = (Source # Tensor (MVNMean n) (MVNMean k)) -> Matrix n k Double
forall x y c.
(Manifold x, Manifold y) =>
(c # Tensor y x) -> Matrix (Dimension y) (Dimension x) Double
toMatrix ((Source # Tensor (MVNMean n) (MVNMean k)) -> Matrix n k Double)
-> ((Source # FactorAnalysis n k)
    -> Source # Tensor (MVNMean n) (MVNMean k))
-> (Source # FactorAnalysis n k)
-> Matrix n k Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Source # Replicated n Normal,
 Source # Tensor (MVNMean n) (MVNMean k))
-> Source # Tensor (MVNMean n) (MVNMean k)
forall a b. (a, b) -> b
snd ((Source # Replicated n Normal,
  Source # Tensor (MVNMean n) (MVNMean k))
 -> Source # Tensor (MVNMean n) (MVNMean k))
-> ((Source # FactorAnalysis n k)
    -> (Source # Replicated n Normal,
        Source # Tensor (MVNMean n) (MVNMean k)))
-> (Source # FactorAnalysis n k)
-> Source # Tensor (MVNMean n) (MVNMean k)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Source # FactorAnalysis n k)
-> (Source # Replicated n Normal,
    Source # Tensor (MVNMean n) (MVNMean k))
forall z c. Product z => (c # z) -> (c # First z, c # Second z)
split ((Source # FactorAnalysis n k) -> Matrix n k Double)
-> (Source # FactorAnalysis n k) -> Matrix n k Double
forall a b. (a -> b) -> a -> b
$ (Natural # FactorAnalysis n k) -> Source # FactorAnalysis n k
forall c x. Transition c Source x => (c # x) -> Source # x
toSource Natural # FactorAnalysis n k
fa
        sgs :: Vector n Double
sgs = Matrix n n Double -> Vector n Double
forall (n :: Nat) x.
(KnownNat n, Field x) =>
Matrix n n x -> Vector n x
S.takeDiagonal (Matrix n n Double -> Vector n Double)
-> ((Natural # MultivariateNormal n) -> Matrix n n Double)
-> (Natural # MultivariateNormal n)
-> Vector n Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Vector n Double, Matrix n n Double) -> Matrix n n Double
forall a b. (a, b) -> b
snd ((Vector n Double, Matrix n n Double) -> Matrix n n Double)
-> ((Natural # MultivariateNormal n)
    -> (Vector n Double, Matrix n n Double))
-> (Natural # MultivariateNormal n)
-> Matrix n n Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Source # MultivariateNormal n)
-> (Vector n Double, Matrix n n Double)
forall (n :: Nat).
KnownNat n =>
(Source # MultivariateNormal n)
-> (Vector n Double, Matrix n n Double)
splitMultivariateNormal ((Source # MultivariateNormal n)
 -> (Vector n Double, Matrix n n Double))
-> ((Natural # MultivariateNormal n)
    -> Source # MultivariateNormal n)
-> (Natural # MultivariateNormal n)
-> (Vector n Double, Matrix n n Double)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Natural # MultivariateNormal n) -> Source # MultivariateNormal n
forall c x. Transition c Source x => (c # x) -> Source # x
toSource ((Natural # MultivariateNormal n) -> Vector n Double)
-> (Natural # MultivariateNormal n) -> Vector n Double
forall a b. (a -> b) -> a -> b
$ (Natural # FactorAnalysis n k) -> Natural # MultivariateNormal n
forall (n :: Nat) (k :: Nat).
(KnownNat n, KnownNat k) =>
(Natural # FactorAnalysis n k) -> Natural # MultivariateNormal n
factorAnalysisObservableDistribution Natural # FactorAnalysis n k
fa
        cms :: Vector n Double
cms = Matrix n n Double -> Vector n Double
forall (n :: Nat) x.
(KnownNat n, Field x) =>
Matrix n n x -> Vector n x
S.takeDiagonal (Matrix n n Double -> Vector n Double)
-> (Matrix k n Double -> Matrix n n Double)
-> Matrix k n Double
-> Vector n Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Matrix n k Double -> Matrix k n Double -> Matrix n n Double
forall (m :: Nat) (n :: Nat) (o :: Nat) x.
(KnownNat m, KnownNat n, KnownNat o, Numeric x) =>
Matrix m n x -> Matrix n o x -> Matrix m o x
S.matrixMatrixMultiply Matrix n k Double
lds (Matrix k n Double -> Vector n Double)
-> Matrix k n Double -> Vector n Double
forall a b. (a -> b) -> a -> b
$ Matrix n k Double -> Matrix k n Double
forall (m :: Nat) (n :: Nat) x.
(KnownNat m, KnownNat n, Numeric x) =>
Matrix m n x -> Matrix n m x
S.transpose Matrix n k Double
lds
     in (Vector n Double
sgs Vector n Double -> Vector n Double -> Vector n Double
forall a. Num a => a -> a -> a
- Vector n Double
cms) Vector n Double -> Vector n Double -> Vector n Double
forall a. Fractional a => a -> a -> a
/ Vector n Double
sgs


-- Internal --

naturalFactorAnalysisToLGH
    :: (KnownNat n, KnownNat k)
    => Natural # FactorAnalysis n k
    -> Natural # LinearGaussianHarmonium n k
naturalFactorAnalysisToLGH :: (Natural # FactorAnalysis n k)
-> Natural # LinearGaussianHarmonium n k
naturalFactorAnalysisToLGH Natural # FactorAnalysis n k
fa =
    let (Natural # Replicated n Normal
nzs,Natural # Tensor (MVNMean n) (MVNMean k)
tns) = (Natural # FactorAnalysis n k)
-> (Natural # First (FactorAnalysis n k),
    Natural # Second (FactorAnalysis n k))
forall z c. Product z => (c # z) -> (c # First z, c # Second z)
split Natural # FactorAnalysis n k
fa
        (Vector n Double
mus,Vector n Double
vrs) = Vector 2 (Vector n Double) -> (Vector n Double, Vector n Double)
forall x. Storable x => Vector 2 x -> (x, x)
S.toPair (Vector 2 (Vector n Double) -> (Vector n Double, Vector n Double))
-> (Vector n (Point Natural Normal) -> Vector 2 (Vector n Double))
-> Vector n (Point Natural Normal)
-> (Vector n Double, Vector n Double)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Matrix n 2 Double -> Vector 2 (Vector n Double)
forall (m :: Nat) (n :: Nat) x.
(KnownNat m, KnownNat n, Numeric x) =>
Matrix m n x -> Vector n (Vector m x)
S.toColumns (Matrix n 2 Double -> Vector 2 (Vector n Double))
-> (Vector n (Point Natural Normal) -> Matrix n 2 Double)
-> Vector n (Point Natural Normal)
-> Vector 2 (Vector n Double)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector n (Vector 2 Double) -> Matrix n 2 Double
forall (n :: Nat) x (m :: Nat).
(KnownNat n, Storable x) =>
Vector m (Vector n x) -> Matrix m n x
S.fromRows (Vector n (Vector 2 Double) -> Matrix n 2 Double)
-> (Vector n (Point Natural Normal) -> Vector n (Vector 2 Double))
-> Vector n (Point Natural Normal)
-> Matrix n 2 Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Point Natural Normal -> Vector 2 Double)
-> Vector n (Point Natural Normal) -> Vector n (Vector 2 Double)
forall a b (n :: Nat).
(Storable a, Storable b) =>
(a -> b) -> Vector n a -> Vector n b
S.map Point Natural Normal -> Vector 2 Double
forall c x. Point c x -> Vector (Dimension x) Double
coordinates (Vector n (Point Natural Normal)
 -> (Vector n Double, Vector n Double))
-> Vector n (Point Natural Normal)
-> (Vector n Double, Vector n Double)
forall a b. (a -> b) -> a -> b
$ (Natural # Replicated n Normal) -> Vector n (Point Natural Normal)
forall (k :: Nat) x c.
(KnownNat k, Manifold x) =>
(c # Replicated k x) -> Vector k (c # x)
splitReplicated Natural # Replicated n Normal
nzs
        mvn :: Natural # MultivariateNormal n
mvn = Vector n Double
-> Matrix n n Double -> Natural # MultivariateNormal n
forall (n :: Nat).
KnownNat n =>
Vector n Double
-> Matrix n n Double -> Natural # MultivariateNormal n
joinNaturalMultivariateNormal Vector n Double
mus (Matrix n n Double -> Natural # MultivariateNormal n)
-> Matrix n n Double -> Natural # MultivariateNormal n
forall a b. (a -> b) -> a -> b
$ Vector n Double -> Matrix n n Double
forall (n :: Nat) x.
(KnownNat n, Field x) =>
Vector n x -> Matrix n n x
S.diagonalMatrix Vector n Double
vrs
        fa' :: Natural
# Affine Tensor (MVNMean n) (MultivariateNormal n) (MVNMean k)
fa' = (Natural
 # First
     (Affine Tensor (MVNMean n) (MultivariateNormal n) (MVNMean k)))
-> (Natural
    # Second
        (Affine Tensor (MVNMean n) (MultivariateNormal n) (MVNMean k)))
-> Natural
   # Affine Tensor (MVNMean n) (MultivariateNormal n) (MVNMean k)
forall z c. Product z => (c # First z) -> (c # Second z) -> c # z
join Natural
# First
    (Affine Tensor (MVNMean n) (MultivariateNormal n) (MVNMean k))
Natural # MultivariateNormal n
mvn Natural
# Second
    (Affine Tensor (MVNMean n) (MultivariateNormal n) (MVNMean k))
Natural # Tensor (MVNMean n) (MVNMean k)
tns
     in (Natural
 # Affine Tensor (MVNMean n) (MultivariateNormal n) (MVNMean k))
-> (Natural # MultivariateNormal k)
-> Natural # LinearGaussianHarmonium n k
forall (f :: Type -> Type -> Type) y x z w.
ConjugatedLikelihood f y x z w =>
(Natural # Affine f y z x)
-> (Natural # w) -> Natural # AffineHarmonium f y x z w
joinConjugatedHarmonium Natural
# Affine Tensor (MVNMean n) (MultivariateNormal n) (MVNMean k)
fa' ((Natural # MultivariateNormal k)
 -> Natural # LinearGaussianHarmonium n k)
-> (Natural # MultivariateNormal k)
-> Natural # LinearGaussianHarmonium n k
forall a b. (a -> b) -> a -> b
$ (Source # MultivariateNormal k) -> Natural # MultivariateNormal k
forall c x. Transition c Natural x => (c # x) -> Natural # x
toNatural ((Source # MultivariateNormal k) -> Natural # MultivariateNormal k)
-> (Matrix k k Double -> Source # MultivariateNormal k)
-> Matrix k k Double
-> Natural # MultivariateNormal k
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector k Double
-> Matrix k k Double -> Source # MultivariateNormal k
forall (n :: Nat).
KnownNat n =>
Vector n Double
-> Matrix n n Double -> Source # MultivariateNormal n
joinMultivariateNormal Vector k Double
0 (Matrix k k Double -> Natural # MultivariateNormal k)
-> Matrix k k Double -> Natural # MultivariateNormal k
forall a b. (a -> b) -> a -> b
$ Vector k Double -> Matrix k k Double
forall (n :: Nat) x.
(KnownNat n, Field x) =>
Vector n x -> Matrix n n x
S.diagonalMatrix Vector k Double
1

sourceFactorAnalysisMaximizationStep
    :: forall n k . (KnownNat n, KnownNat k)
    => Mean # LinearGaussianHarmonium n k
    -> Source # FactorAnalysis n k
sourceFactorAnalysisMaximizationStep :: (Mean # LinearGaussianHarmonium n k) -> Source # FactorAnalysis n k
sourceFactorAnalysisMaximizationStep Mean # LinearGaussianHarmonium n k
hrm =
    let (Mean # MultivariateNormal n
nz,Mean # Tensor (MVNMean n) (MVNMean k)
nzx,Mean # MultivariateNormal k
nx) = (Mean # LinearGaussianHarmonium n k)
-> (Mean # MultivariateNormal n,
    Mean # Tensor (MVNMean n) (MVNMean k), Mean # MultivariateNormal k)
forall z (f :: Type -> Type -> Type) y x w c.
(Manifold z, Manifold (f y x), Manifold w) =>
(c # AffineHarmonium f y x z w) -> (c # z, c # f y x, c # w)
splitHarmonium Mean # LinearGaussianHarmonium n k
hrm
        (Vector n Double
muz,Matrix n n Double
etaz) = (Mean # MultivariateNormal n)
-> (Vector n Double, Matrix n n Double)
forall (n :: Nat).
KnownNat n =>
(Mean # MultivariateNormal n)
-> (Vector n Double, Matrix n n Double)
splitMeanMultivariateNormal Mean # MultivariateNormal n
nz
        (Vector k Double
mux,Matrix k k Double
etax) = (Mean # MultivariateNormal k)
-> (Vector k Double, Matrix k k Double)
forall (n :: Nat).
KnownNat n =>
(Mean # MultivariateNormal n)
-> (Vector n Double, Matrix n n Double)
splitMeanMultivariateNormal Mean # MultivariateNormal k
nx
        outrs :: Matrix n k Double
outrs = (Mean # Tensor (MVNMean n) (MVNMean k))
-> Matrix (Dimension (MVNMean n)) (Dimension (MVNMean k)) Double
forall x y c.
(Manifold x, Manifold y) =>
(c # Tensor y x) -> Matrix (Dimension y) (Dimension x) Double
toMatrix Mean # Tensor (MVNMean n) (MVNMean k)
nzx Matrix n k Double -> Matrix n k Double -> Matrix n k Double
forall a. Num a => a -> a -> a
- Vector n Double -> Vector k Double -> Matrix n k Double
forall (m :: Nat) (n :: Nat) x.
(KnownNat m, KnownNat n, Numeric x) =>
Vector m x -> Vector n x -> Matrix m n x
S.outerProduct Vector n Double
muz Vector k Double
mux
        wmtx :: Matrix n k Double
wmtx = Matrix n k Double -> Matrix k k Double -> Matrix n k Double
forall (m :: Nat) (n :: Nat) (o :: Nat) x.
(KnownNat m, KnownNat n, KnownNat o, Numeric x) =>
Matrix m n x -> Matrix n o x -> Matrix m o x
S.matrixMatrixMultiply Matrix n k Double
outrs (Matrix k k Double -> Matrix n k Double)
-> Matrix k k Double -> Matrix n k Double
forall a b. (a -> b) -> a -> b
$ Matrix k k Double -> Matrix k k Double
forall (n :: Nat) x.
(KnownNat n, Field x) =>
Matrix n n x -> Matrix n n x
S.inverse Matrix k k Double
etax
        zcvr :: Matrix n n Double
zcvr = Matrix n n Double
etaz Matrix n n Double -> Matrix n n Double -> Matrix n n Double
forall a. Num a => a -> a -> a
- Vector n Double -> Vector n Double -> Matrix n n Double
forall (m :: Nat) (n :: Nat) x.
(KnownNat m, KnownNat n, Numeric x) =>
Vector m x -> Vector n x -> Matrix m n x
S.outerProduct Vector n Double
muz Vector n Double
muz
        vrs :: Vector n Double
vrs = Matrix n n Double -> Vector n Double
forall (n :: Nat) x.
(KnownNat n, Field x) =>
Matrix n n x -> Vector n x
S.takeDiagonal (Matrix n n Double -> Vector n Double)
-> Matrix n n Double -> Vector n Double
forall a b. (a -> b) -> a -> b
$ Matrix n n Double
zcvr Matrix n n Double -> Matrix n n Double -> Matrix n n Double
forall a. Num a => a -> a -> a
- Matrix n k Double -> Matrix k n Double -> Matrix n n Double
forall (m :: Nat) (n :: Nat) (o :: Nat) x.
(KnownNat m, KnownNat n, KnownNat o, Numeric x) =>
Matrix m n x -> Matrix n o x -> Matrix m o x
S.matrixMatrixMultiply Matrix n k Double
wmtx (Matrix n k Double -> Matrix k n Double
forall (m :: Nat) (n :: Nat) x.
(KnownNat m, KnownNat n, Numeric x) =>
Matrix m n x -> Matrix n m x
S.transpose Matrix n k Double
outrs)
        snrms :: Source # Replicated n Normal
snrms = Vector n (Source # Normal) -> Source # Replicated n Normal
forall (k :: Nat) x c.
(KnownNat k, Manifold x) =>
Vector k (c # x) -> c # Replicated k x
joinReplicated (Vector n (Source # Normal) -> Source # Replicated n Normal)
-> Vector n (Source # Normal) -> Source # Replicated n Normal
forall a b. (a -> b) -> a -> b
$ (Double -> Double -> Source # Normal)
-> Vector n Double -> Vector n Double -> Vector n (Source # Normal)
forall a b c (n :: Nat).
(Storable a, Storable b, Storable c) =>
(a -> b -> c) -> Vector n a -> Vector n b -> Vector n c
S.zipWith (((Double, Double) -> Source # Normal)
-> Double -> Double -> Source # Normal
forall a b c. ((a, b) -> c) -> a -> b -> c
curry (Double, Double) -> Source # Normal
forall ds x c.
(IndexedListLiterals ds (Dimension x) Double,
 KnownNat (Dimension x)) =>
ds -> c # x
fromTuple) Vector n Double
muz Vector n Double
vrs
     in (Source # First (FactorAnalysis n k))
-> (Source # Second (FactorAnalysis n k))
-> Source # FactorAnalysis n k
forall z c. Product z => (c # First z) -> (c # Second z) -> c # z
join Source # First (FactorAnalysis n k)
Source # Replicated n Normal
snrms ((Source # Second (FactorAnalysis n k))
 -> Source # FactorAnalysis n k)
-> (Source # Second (FactorAnalysis n k))
-> Source # FactorAnalysis n k
forall a b. (a -> b) -> a -> b
$ Matrix (Dimension (MVNMean n)) (Dimension (MVNMean k)) Double
-> Source # Tensor (MVNMean n) (MVNMean k)
forall y x c.
Matrix (Dimension y) (Dimension x) Double -> c # Tensor y x
fromMatrix Matrix n k Double
Matrix (Dimension (MVNMean n)) (Dimension (MVNMean k)) Double
wmtx