(ns knn.norm)
(use '[knn.op :as op])

Manhattan norm of a vector l_1 norm

(defn manhattan-norm
  [v]
  (reduce + (map #(Math/abs %) v)))

Euclidean norm of a vector l_2 norm

(defn euclidean-norm
  [v]
  (Math/sqrt (op/dot v v)))

L-p Norm of a vector l_p norm

(defn lp-norm
  [v p]
  (Math/pow (reduce + (map #(Math/pow (Math/abs %) p) v)) (/ p)))

Max Norm of a vector l_p norm when p -> Infinity

(defn max-norm
  [v]
  (apply max (map #(Math/abs %) v)))