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 + (ab) * (ab)
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 = (ab) * (ab)
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)