diff options
Diffstat (limited to 'pca.fut')
-rw-r--r-- | pca.fut | 10 |
1 files changed, 5 insertions, 5 deletions
@@ -11,10 +11,10 @@ def matmul_f64 = matmul (+) (*) 0f64 def sum = reduce (+) 0f64 def dot u v = sum (map2 (*) u v) --- sets the first row to 1 -def unitfst [n][m] (X: *[n][m]f64): *[n][m]f64 = - X with [0] = tabulate m (const 1) -def unitfstT [n][m] (X: *[n][m]f64): *[n][m]f64 = transpose (unitfst (transpose X)) +-- sets the last row to 1 +def unitlst [n][m] (X: *[n][m]f64): *[n][m]f64 = + X with [n-1] = tabulate m (const 1) +def unitlstT [n][m] (X: *[n][m]f64): *[n][m]f64 = transpose (unitlst (transpose X)) -- Bregman generators def phi (z: f64) : f64 = z * f64.log z - z @@ -22,7 +22,7 @@ def psi [d] (x: [d]f64) : f64 = sum (map ((*x[d-1]) <-< phi <-< (/(f64.epsilon+x def embed [n][d][k] (B: [n][k]f64) (U: [k][d]f64) : [n][d]f64 = let C = tabulate_2d k k (\i j -> (if i == j then 1f64 else 0f64) - f64.from_fraction 1 k) - in (matmul_f64 (matmul_f64 (unitfstT (copy B)) C) U) + in (matmul_f64 (matmul_f64 (unitlstT (copy B)) C) U) def loss [n][d][k] (X: [n][d]f64) (B: [n][k]f64) (U: [k][d]f64) : f64 = let Y = map (map f64.exp) (embed B U) |