Я новичок в tensor, а также в tensorly библиотеке. Я наткнулся на один из лучших примеров тензорной декомпозиции на jeankossaifi, но мне нужен пример тензорной функции non_negative_tucker() для тензорной декомпозиции путем расширения примера по ссылке выше (для набора данных Olivetti).
Пример неотрицательного тензорного разложения с использованием Tensorly
Ответы (1)
Интерфейс почти такой же, как у robust_pca. один.
Давайте создадим случайный пример тензора X
,:
import tensorly as tl
import numpy as np
X = tl.tensor(np.random.random((10, 11, 12)))
Вы должны применить надежный тензор PCA следующим образом:
from tensorly.decomposition import robust_pca
D, E = robust_pca(X)
Это дает вам тензор низкого ранга D
и разреженный E
, такой что D + E = X
(приблизительно).
Вместо этого неотрицательный Такер вернет вам неотрицательное ядро и некоторые неотрицательные факторы. Обратите внимание, что теперь вы также должны указать ранг для разложения.
from tensorly.decomposition import non_negative_tucker
core, factors = non_negative_tucker(X, rank=(12, 12, 12), n_iter_max=1000)
Вы можете восстановить тензор, используя их, и проверить ошибку реконструкции:
reconstruction = tl.tucker_to_tensor(core, factors)
error = tl.norm(reconstruction - X)/tl.norm(X)
Вы можете посмотреть страницу API для этой функции.
person
Jean
schedule
18.04.2019
вот код:
core, tucker_factors,rec_errors, mode = non_negative_tucker(X, rank=tucker_rank, n_iter_max=100, init='random')
tucker_reconstruction = tl.tucker_to_tensor(core, tucker_factors)
visualise_images(tucker_reconstruction, 12, 4)
Я не получаю правильного результата при отображении изображений. Я только что расширил пример jeankossaifi .
- person SHIVA; 20.04.2019
Вы неправильно используете функцию:
non_negative_tucker
не возвращает ошибки или режим реконструкции. Правильное использование - это то, что я написал в сообщении, например. core, factors = non_negative_tucker(X, rank=(12, 12, 12), n_iter_max=1000)
.
- person Jean; 21.04.2019
я соответственно изменил код, который выглядит так:
data = fetch_olivetti_faces() X = data.images X = X.astype(np.float64) X -= X.mean() tucker_rank = [80, 80, 80] core, tucker_factors = non_negative_tucker(X, rank=tucker_rank, n_iter_max=100, init='random') tucker_reconstruction = tl.tucker_to_tensor(core, tucker_factors) visualise_images(tucker_reconstruction, 12, 4)
Вывод по-прежнему представляет собой набор размытых изображений. Пожалуйста, исправьте, если что-то не так в коде.
- person SHIVA; 22.04.2019
Чего вы пытаетесь достичь? Вам нужно, чтобы факторы и ядро были неотрицательными? Если нет, попробуйте Tucker (или partial_tucker, если вам не нужно факторизовать размер выборки). Также изображения имеют размер 64x64, но вы выбрали ранг 80 для этих размеров, поэтому вы чрезмерно параметризуете. Наконец, svd — гораздо лучшая инициализация, чем random. Итак, с Такером вы можете попробовать
core, tucker_factors = tucker(X, rank=tucker_rank, n_iter_max=100, tol=10e-10, init='svd')
.
- person Jean; 22.04.2019
да, мне нужно, чтобы факторы и ядро были неотрицательными.
- person SHIVA; 24.04.2019
Спасибо, все работает просто идеально. Спасибо tensorly Library. Еще одна вещь, о которой вы упомянули функцию add_noise() в статье, но я не получаю эту функцию, даже обновляя tensorly.
- person SHIVA; 28.04.2019
add_noise действительно отсутствует, добавит его
- person Jean; 20.11.2019