def _update_dict_slow(self, subset, D_range): """Update dictionary from statistic Parameters ---------- subset: ndarray (len_subset), Mask used on X """ D_subset = self.D_[:, subset] if self.projection == "full": norm = enet_norm(self.D_, self.l1_ratio) else: norm = enet_norm(D_subset, self.l1_ratio) R = self.B_[:, subset] - np.dot(D_subset.T, self.A_).T ger, = linalg.get_blas_funcs(("ger",), (self.A_, D_subset)) for k in D_range: ger(1.0, self.A_[k], D_subset[k], a=R, overwrite_a=True) # R += np.dot(stat.A[:, j].reshape(n_components, 1), D_subset[k] = R[k] / (self.A_[k, k]) if self.projection == "full": self.D_[k][subset] = D_subset[k] self.D_[k] = enet_projection(self.D_[k], norm[k], self.l1_ratio) D_subset[k] = self.D_[k][subset] else: D_subset[k] = enet_projection(D_subset[k], norm[k], self.l1_ratio) ger(-1.0, self.A_[k], D_subset[k], a=R, overwrite_a=True) # R -= np.dot(stat.A[:, j].reshape(n_components, 1), if self.projection == "partial": self.D_[:, subset] = D_subset
def _update_dict_slow(self, subset, D_range): """Update dictionary from statistic Parameters ---------- subset: ndarray (len_subset), Mask used on X """ D_subset = self.D_[:, subset] if self.projection == 'full': norm = enet_norm(self.D_, self.l1_ratio) else: norm = enet_norm(D_subset, self.l1_ratio) R = self.B_[:, subset] - np.dot(D_subset.T, self.A_).T ger, = linalg.get_blas_funcs(('ger', ), (self.A_, D_subset)) for k in D_range: ger(1.0, self.A_[k], D_subset[k], a=R, overwrite_a=True) # R += np.dot(stat.A[:, j].reshape(n_components, 1), D_subset[k] = R[k] / (self.A_[k, k]) if self.projection == 'full': self.D_[k][subset] = D_subset[k] self.D_[k] = enet_projection(self.D_[k], norm[k], self.l1_ratio) D_subset[k] = self.D_[k][subset] else: D_subset[k] = enet_projection(D_subset[k], norm[k], self.l1_ratio) ger(-1.0, self.A_[k], D_subset[k], a=R, overwrite_a=True) # R -= np.dot(stat.A[:, j].reshape(n_components, 1), if self.projection == 'partial': self.D_[:, subset] = D_subset
def _update_dict_slow(self, subset, D_range): """Update dictionary from statistic Parameters ---------- subset: ndarray (len_subset), Mask used on X Q: ndarray (n_components, n_features): Dictionary to perform ridge regression l1_ratio: float in [0, 1]: Controls the sparsity of the dictionary stat: DictMFStats, Statistics kept by the algorithm, to be updated by the function var_red: boolean, Online update of the Gram matrix (Experimental) random_state: int or RandomState Pseudo number generator state used for random sampling. """ D_subset = self.D_[:, subset] if self.projection == 'full': norm = enet_norm(self.D_, self.l1_ratio) else: if self.var_red != 'weight_based': self.G_ -= D_subset.dot(D_subset.T) norm = enet_norm(D_subset, self.l1_ratio) R = self.B_[:, subset] - np.dot(D_subset.T, self.A_).T ger, = linalg.get_blas_funcs(('ger',), (self.A_, D_subset)) for k in D_range: ger(1.0, self.A_[k], D_subset[k], a=R, overwrite_a=True) # R += np.dot(stat.A[:, j].reshape(n_components, 1), D_subset[k] = R[k] / (self.A_[k, k]) if self.projection == 'full': self.D_[k][subset] = D_subset[k] self.D_[k] = enet_projection(self.D_[k], norm[k], self.l1_ratio) D_subset[k] = self.D_[k][subset] else: D_subset[k] = enet_projection(D_subset[k], norm[k], self.l1_ratio) ger(-1.0, self.A_[k], D_subset[k], a=R, overwrite_a=True) # R -= np.dot(stat.A[:, j].reshape(n_components, 1), if self.projection == 'partial': self.D_[:, subset] = D_subset if self.var_red != 'weight_based': self.G_ += D_subset.dot(D_subset.T) elif self.var_red != 'weight_based': self.G_ = self.D_.dot(self.D_.T).T
def _update_dict_slow(self, subset, D_range): """Update dictionary from statistic Parameters ---------- subset: ndarray (len_subset), Mask used on X Q: ndarray (n_components, n_features): Dictionary to perform ridge regression l1_ratio: float in [0, 1]: Controls the sparsity of the dictionary stat: DictMFStats, Statistics kept by the algorithm, to be updated by the function var_red: boolean, Online update of the Gram matrix (Experimental) random_state: int or RandomState Pseudo number generator state used for random sampling. """ D_subset = self.D_[:, subset] if self.projection == 'full': norm = enet_norm(self.D_, self.l1_ratio) else: if self.var_red != 'weight_based': self.G_ -= D_subset.dot(D_subset.T) norm = enet_norm(D_subset, self.l1_ratio) R = self.B_[:, subset] - np.dot(D_subset.T, self.A_).T ger, = linalg.get_blas_funcs(('ger', ), (self.A_, D_subset)) for k in D_range: ger(1.0, self.A_[k], D_subset[k], a=R, overwrite_a=True) # R += np.dot(stat.A[:, j].reshape(n_components, 1), D_subset[k] = R[k] / (self.A_[k, k]) if self.projection == 'full': self.D_[k][subset] = D_subset[k] self.D_[k] = enet_projection(self.D_[k], norm[k], self.l1_ratio) D_subset[k] = self.D_[k][subset] else: D_subset[k] = enet_projection(D_subset[k], norm[k], self.l1_ratio) ger(-1.0, self.A_[k], D_subset[k], a=R, overwrite_a=True) # R -= np.dot(stat.A[:, j].reshape(n_components, 1), if self.projection == 'partial': self.D_[:, subset] = D_subset if self.var_red != 'weight_based': self.G_ += D_subset.dot(D_subset.T) elif self.var_red != 'weight_based': self.G_ = self.D_.dot(self.D_.T).T
def test_fast_enet_projection_norm(): random_state = check_random_state(0) norms = np.zeros(10) for i in range(10): a = random_state.randn(20000) a /= np.sqrt(np.sum(a ** 2)) c = np.zeros(20000) c[:] = enet_projection(a, 1, 0.15) norms[i] = enet_norm(c, l1_ratio=0.15) assert_array_almost_equal(norms, np.ones(10))
def test_enet_scale(): random_state = check_random_state(0) a = random_state.randn(10, 100) a1 = random_state.randn(100) for r in [1, 2]: for this_a in [a, a1]: for l1_ratio in [0., 0.5, 1]: b = enet_scale(this_a, r, l1_ratio) norms = enet_norm(b, l1_ratio) assert_array_almost_equal(norms, r)
def test_fast_enet_projection_norm(): random_state = check_random_state(0) norms = np.zeros(10) for i in range(10): a = random_state.randn(20000) a /= np.sqrt(np.sum(a**2)) c = np.zeros(20000) c[:] = enet_projection(a, 1, 0.15) norms[i] = enet_norm(c, l1_ratio=0.15) assert_array_almost_equal(norms, np.ones(10))