This page is not created by, affiliated with, or supported by Slack Technologies, Inc.

## 2018-07-29

## Channels

- # beginners (18)
- # boot (1)
- # cider (12)
- # clojure (18)
- # clojure-russia (5)
- # clojure-uk (8)
- # clojurescript (17)
- # cursive (7)
- # datomic (10)
- # editors (1)
- # figwheel-main (14)
- # hoplon (2)
- # hyperfiddle (1)
- # keechma (2)
- # leiningen (25)
- # off-topic (5)
- # onyx (3)
- # reagent (53)
- # reitit (6)
- # shadow-cljs (14)
- # spacemacs (3)
- # tools-deps (14)
- # uncomplicate (12)

(ev! a w v nil) works, but (ev! a nil v nil) doesn't. (I'm guessing w is used to calculate v, right?)

No. w is eigenvalues, v are eigenvectors. You always want eigenvalues, so it cannot be nil...

Ok, I reached this point:

```
(let-release [rows (mrows mat)
cols (ncols mat)
covariance (cov (center mat))
evecs (copy covariance)
qr (ev! evecs w
evecs nil)
top (submatrix evecs rows n-components)]
(mm! 1.0 covariance top 0.0 result))))
```

I create `w`

and `result`

previously, I'm not really sure what's the benefit of `(view-ge evecs)`

when I can happily use the same object with the same binding, and I'm not really sure how to get rid of that `(copy covariance)`

since I need it untouched for `mm!`

at the end. Oh and of course also the starting matrix should be untouched (because this is what happens with Numpy)First of all, you're not even using sy matrices in that pca code... Second, most of those lets should be in with-release, **not** let-release. Third, if covariance was sy, you could call ev! on it without messing up with its contents. Fourth, you should reuse memory more in that code.

And, of course, if you don't need all eigenvectors/values (I guess that's what top does) don't compute them. Instruct ev! itself to compute only the first n-components...

I'm not using sy right now to make results comparable with PCA (to check that I didn't mess anything up, and because I would like to have a working implementation at the end of the process)

Ah and by the way I saw the post about broadcasting, that's really interesting!! Are you going to follow up on the matter?

Ok, found it, I guess this is it `For symmetric matrices, computes the first k eigenvalues (k <= m)`

I meant something more thorough, I'm trying

```
(def mat (fge 300 300 (range)))
(defn pca-ev
[mat n-components]
(let-release [w (fge m 2)
result (fge m n-components)]
(with-release [rows (mrows mat)
cols (ncols mat)
covariance (cov (center mat))
evecs (fge m 2)
qr (ev! (view-sy covariance) (fge 2 1)
evecs nil)]
(mm! 1.0 covariance evecs 0.0 result))))
(pca-ev 300 2)
```

And it fails badly, shouldn't `let-release`

release only if there are errors? And anyway only after body is evaluated?