Perform the fast HALS update for W
(self, X, W, H)
| 260 | return H |
| 261 | |
| 262 | def _update_W(self, X, W, H): |
| 263 | """Perform the fast HALS update for W""" |
| 264 | eps = np.finfo(float).eps |
| 265 | XHt = X @ H.T # dim: (N, K) |
| 266 | HHt = H @ H.T # dim: (K, K) |
| 267 | |
| 268 | for k in range(self.K): |
| 269 | W[:, k] = W[:, k] * HHt[k, k] + XHt[:, k] - W @ HHt[:, k] |
| 270 | W[:, k] = np.clip(W[:, k], eps, np.inf) # enforce nonnegativity |
| 271 | |
| 272 | # renormalize the new column |
| 273 | n = np.linalg.norm(W[:, k]) |
| 274 | W[:, k] /= n if n > 0 else 1.0 |
| 275 | return W |
| 276 | |
| 277 | def fit(self, X, W=None, H=None, n_initializations=10, verbose=False): |
| 278 | r""" |