Fork me on GitHub
#uncomplicate
<
2019-08-12
>
aaelony15:08:16

Hi - I'd like to apply a cosine-similarity function to rows and columns of a matrix (where it is unnecessary to do more than the triangle, because args of row, col should give the identical result as col, row). I constructed a small example (which I hope is correct):

(defn cosine-similarity
  [v1 v2]
  (/ (dot v1 v2) (nrm2 v1) (nrm2 v2)))

(let [v1 (dv  5 68 99 53 74 88 53 82 17 78
             10 27 45 97 77  3 80 34 22 52
             41 84 28  4 40 56  9 72 23 46
             19 69 22 30  7 78 43 68 42 78
             6 41 47 86 88 34 63  8 82 53)
      v2 (dv 26 29 98 69 49 94 96 74 37 33
             27 68 94  1 29 77 89 93 61 99
             14 82 78 37 74 93 16 70 10 77
             71 92 16 16 86  9 48 26 100 17
             34 57  5 15 63  9 63 96  60 45)]
  (cosine-similarity v1 v2))
What would be the optimal manner to apply this function to a matrix?

aaelony15:08:09

Clojure-style with a map style function? or a better linear algebraic manner? What would be idiomatic in Neanderthal? Thanks in advance