пользовательская матрица в NMF в scikit-learn

Мне нужно сделать NMF с помощью sklearn, я использовал инструкции здесь: http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.NMF.html

Я хочу добавить мою инициализированную матрицу H, есть возможность сделать init='custom', но я не знаю, как дать ему матрицу H. Я пробовал:

model = NMF(n_components=2, init='custom',H=myInitializationH random_state=0);

но это не работает.

Кроме того, кто-нибудь знает, как исправить мою матрицу и обновить только W?

редактировать:

Спасибо за ответ

Когда я выбираю пользовательский вариант, я получаю сообщение об ошибке:

ValueError: input contains nan infinity or a value too large for dtype('float64')

Однако матрица не содержит нанов или бесконечности. Более того, я сделал это для очень маленькой матрицы, чтобы увидеть, хорошо это или нет:

import numpy as np
from sklearn.decomposition import NMF

x=np.ones((2,3));
#model = NMF(n_components=1, init='custom', solver='mu',beta_loss=1,max_iter=500,random_state=0,alpha=0,verbose=0, shuffle=False);
model = NMF(n_components=1, init='custom');
fixed_W = model.fit_transform(x,H=np.ones((1,3)));
fixed_H = model.components_;

print(np.matmul(fixed_W,fixed_H));

Я получил ту же ошибку, если я не делаю «случайный» вместо «пользовательский».

Это случается и с вами? почему это происходит?


person kalonymus    schedule 16.04.2018    source источник
comment
Что такое сообщение об ошибке?   -  person Viktoriya Malyasova    schedule 16.04.2018
comment
После H=myInitializationH отсутствует запятая, может в этом проблема?   -  person Viktoriya Malyasova    schedule 16.04.2018


Ответы (1)


Передайте W и H в fit() или fit_transform().

Согласно документации fit_transform() :-

W : array-like, shape (n_samples, n_components)
    If init=’custom’, it is used as initial guess for the solution.

H : array-like, shape (n_components, n_features)
    If init=’custom’, it is used as initial guess for the solution.

То же самое относится и к fit().

Сделайте что-нибудь вроде:

model.fit(X, H=myInitializationH, W=myInitializationW)

Обновление: похоже, что если вы передадите параметр init='custom', вам нужно указать как W, так и H. Если вы укажете H, а не W, он будет воспринят как None, а затем выдаст ошибку.

person Vivek Kumar    schedule 16.04.2018
comment
@kalonymus Это зависит от ваших данных. Верны ли ваши данные. Согласно ошибке, он содержит недостающую информацию или бесконечные значения. - person Vivek Kumar; 16.04.2018
comment
данные верны, я сделал тестовый пример с матрицей 3X2 только с одним компонентом, и проблема все еще есть. пожалуйста, смотрите отредактированный пост - person kalonymus; 16.04.2018
comment
@kalonymus Пожалуйста, примите ответ, если он вам помог. - person Vivek Kumar; 16.04.2018
comment
Я сделал. Я также проголосовал за вас, но это не отображается публично, потому что это новый пользователь, и у меня недостаточно репутации. В любом случае, вы полностью этого заслуживаете. Благодарю вас! - person kalonymus; 16.04.2018