{-# 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
#-}
module Goal.Graphical.Models.Harmonium.FactorAnalysis
(
FactorAnalysis
, factorAnalysisObservableDistribution
, factorAnalysisExpectationMaximization
, factorAnalysisUniqueness
) where
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
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
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