from sklearn import decomposition
from .ContinuousModel import ContinuousModel
from ..utils import to_sparse, get_prediction_with_threshold
[docs]
class NMFSklearn(ContinuousModel):
'''NMF by scikit-learn.
Parameters
----------
U : ndarray, spmatrix
Need to be prepared if ``init_method`` is 'custom'.
V : ndarray, spmatrix
Need to be prepared if ``init_method`` is 'custom'.
'''
def __init__(self, k, U=None, V=None, beta_loss='frobenius', init_method='nndsvd', solver='cd', tol=1e-4, max_iter=1000, seed=None):
self.check_params(k=k, U=U, V=V, beta_loss=beta_loss, init_method=init_method, solver=solver, tol=tol, max_iter=max_iter, seed=seed)
[docs]
def check_params(self, **kwargs):
super().check_params(**kwargs)
assert self.solver in ['cd', 'mu']
assert self.beta_loss in ['frobenius', 'kullback-leibler', 'itakura-saito']
assert self.init_method in [None, 'random', 'nndsvd', 'nndsvda', 'nndsvdar', 'custom']
[docs]
def fit(self, X_train, X_val=None, X_test=None, **kwargs):
super().fit(X_train, X_val, X_test, **kwargs)
self._fit()
# self.predict_X(boolean=False)
self.X_pd = get_prediction_with_threshold(U=self.U, V=self.V, u=0.5, v=0.5)
self.finish(show_logs=self.show_logs, save_model=self.save_model, show_result=self.show_result)
def _fit(self):
self.model = decomposition.NMF(
n_components=self.k,
init=self.init_method,
random_state=self.rng,
solver=self.solver,
beta_loss=self.beta_loss,
tol=self.tol,
max_iter=self.max_iter,
alpha_W=0.0,
alpha_H="same",
l1_ratio=0.0,
verbose=0,
shuffle=False
)
# init guess W and H will only be used when init_method is 'custom'
if self.init_method == 'custom':
self.U = self.model.fit_transform(self.X_train, W=self.U, H=self.V.T)
else:
self.U = self.model.fit_transform(self.X_train)
self.V = self.model.components_.T
self.U, self.V = to_sparse(self.U), to_sparse(self.V)