-- | Utility code used for matrix/vector manipulation
module MachineLearning.Util
(norm,
difference,
dotProduct,
innerProduct) where
import qualified Data.Matrix as M
import qualified Data.Vector as V
-- | The L^2 norm of a vector in R^n.
norm :: Floating a => V.Vector a -> a
norm x = sqrt $ dotProduct x x
-- | Distance between vectors in the Hilbert space induced by the L^2
-- norm on R^n.
difference :: Floating a => V.Vector a -> V.Vector a -> a
difference x y = norm (V.zipWith (-) x y)
-- | The inner product in R^n.
dotProduct :: Num b => V.Vector b -> V.Vector b -> b
dotProduct x y = V.foldl (+) 0 (V.zipWith (*) x y)
-- | The inner product on R^n induced by a PSD matrix M. Computes the
-- mapping x |-> x^T M x with x \in R^n, M \in R^{n x n}.
innerProduct :: (Num a) => M.Matrix a -> V.Vector a -> a
innerProduct m v = (M.transpose cv * m * cv) M.! (1, 1)
where
cv = M.colVector v