module Data.Algorithm.TSNE.Utils where import Data.List(foldr, transpose) infinity :: Double infinity = read "Infinity" distanceSquared :: [Double] -> [Double] -> Double distanceSquared as bs = foldr d 0 (zip as bs) where d (a,b) t = t + (a-b) * (a-b) symmetrize :: [[Double]] -> [[Double]] symmetrize m = (zipWith.zipWith) f m (transpose m) where f :: Double -> Double -> Double f x y = max a 1e-100 where a = (x + y) / (2 * (realToFrac.length) m) recenter :: [[Double]] -> [[Double]] recenter ss = map r ss where r s = subtract (mean s) <$> s mean s = sum s / (realToFrac.length) s qdist :: [[Double]] -> [[Double]] qdist ss = symmetricalMatrixFromTopRight $ qd (transpose ss) where qd [] = [] qd ps = [qr ps] ++ qd (tail ps) qr :: [[Double]] -> [Double] qr ps = [0::Double] ++ (q (head ps) <$> tail ps) q as bs = 1 / (1 + s) where s = sum $ zipWith f as bs f a b = (a-b) * (a-b) qdist' :: [[Double]] -> [[Double]] qdist' ss = (map.map) f qd where qd = qdist ss f :: Double -> Double f q = max (q / sumsum qd) 1e-100 sumsum :: [[Double]] -> Double sumsum m = sum $ sum <$> m reprep :: a -> [[a]] reprep = repeat.repeat symmetricalMatrixFromTopRight :: [[a]] -> [[a]] symmetricalMatrixFromTopRight tr = zipWith (++) bl tr where bl = zipWith take [0..] (transpose m) m = zipWith (++) ebl tr ebl = zipWith take [0..] (reprep undefined)