module HasGP.Regression.Regression
(
gpRMain,
gpRPredict,
gpRPredict',
gpRLogEvidence,
gpRGradLogEvidence,
gpRLogHyperToEvidence
) where
import Numeric.LinearAlgebra
import HasGP.Types.MainTypes
import HasGP.Covariance.Basic
import HasGP.Support.MatrixFunction
import HasGP.Support.Solve
import HasGP.Support.Linear
gpRMain :: CovarianceFunction cF => cF
-> Double
-> Inputs
-> Targets
-> (DMatrix,DVector)
gpRMain cov lognvar d t = (l,alpha)
where
n = rows d
k = covarianceMatrix cov d
m = (k + (scale (exp lognvar) (ident n)))
l = trans $ chol m
alpha = upperSolve (trans l) (lowerSolve l t)
gpRPredict :: CovarianceFunction cF => cF
-> DMatrix
-> DVector
-> Inputs
-> Targets
-> Inputs
-> (DVector, DVector)
gpRPredict cov l alpha d t xStars =
((fromRows kxxStar) <> alpha,
fromList $ zipWith () kxStarxStar (zipWith dot vs vs))
where
new = toRows xStars
kxxStar = covarianceWithPoints cov d new
kxStarxStar = zipWith (covariance cov) new new
vs = map (lowerSolve l) kxxStar
gpRPredict' :: CovarianceFunction cF => cF
-> Double
-> Inputs
-> Targets
-> Inputs
-> (DVector, DVector)
gpRPredict' cov lognvar d t xStars =
((fromRows kxxStar) <> alpha,
fromList $ zipWith () kxStarxStar (zipWith dot vs vs))
where
(l, alpha) = gpRMain cov lognvar d t
new = toRows xStars
kxxStar = covarianceWithPoints cov d new
kxStarxStar = zipWith (covariance cov) new new
vs = map (lowerSolve l) kxxStar
gpRLogEvidence :: DMatrix
-> DVector
-> Targets
-> Double
gpRLogEvidence l alpha t =
(0.5) * ((t <.> alpha) +
(2.0 * (sum $ map log (toList $ takeDiag l))) +
((fromIntegral n) * (log (2 * pi))))
where
n = rows l
gpRGradLogEvidence :: CovarianceFunction cF => cF
-> Double
-> DMatrix
-> DVector
-> Inputs
-> DVector
gpRGradLogEvidence cov lognvar l alpha i =
join [fromList [dZdtheta $ scale (exp lognvar) $ ident (rows l)],
fromList $ map dZdtheta dKdthetaList]
where
invK = HasGP.Support.Solve.cholSolve l
dKdthetaList = makeMatricesFromPairs (dCovarianceDParameters cov) i
dZdtheta dKdtheta =
(0.5) * (sum $ toList $ abDiagOnly
((asColumn alpha <> asRow alpha) invK) dKdtheta)
gpRLogHyperToEvidence :: CovarianceFunction cF => cF
-> Inputs
-> Targets
-> DVector
-> (Double, DVector)
gpRLogHyperToEvidence cov inputs targets parameters =
((gpRLogEvidence l alpha targets),
zipVectorWith (*) negGradLE (mapVector exp parameters))
where
lognvar = parameters @> 0
loghyper = subVector 1 ((dim parameters) 1) parameters
newCov = (makeCovarianceFromList cov) $ toList loghyper
(l, alpha) = gpRMain newCov lognvar inputs targets
negGradLE = (gpRGradLogEvidence newCov lognvar l alpha inputs)