Пример неотрицательного тензорного разложения с использованием Tensorly

Я новичок в tensor, а также в tensorly библиотеке. Я наткнулся на один из лучших примеров тензорной декомпозиции на jeankossaifi, но мне нужен пример тензорной функции non_negative_tucker() для тензорной декомпозиции путем расширения примера по ссылке выше (для набора данных Olivetti).


person SHIVA    schedule 17.04.2019    source источник


Ответы (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
comment
вот код: 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
comment
Вы неправильно используете функцию: non_negative_tucker не возвращает ошибки или режим реконструкции. Правильное использование - это то, что я написал в сообщении, например. core, factors = non_negative_tucker(X, rank=(12, 12, 12), n_iter_max=1000). - person Jean; 21.04.2019
comment
я соответственно изменил код, который выглядит так: 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
comment
Чего вы пытаетесь достичь? Вам нужно, чтобы факторы и ядро ​​были неотрицательными? Если нет, попробуйте 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
comment
да, мне нужно, чтобы факторы и ядро ​​были неотрицательными. - person SHIVA; 24.04.2019
comment
Спасибо, все работает просто идеально. Спасибо tensorly Library. Еще одна вещь, о которой вы упомянули функцию add_noise() в статье, но я не получаю эту функцию, даже обновляя tensorly. - person SHIVA; 28.04.2019
comment
add_noise действительно отсутствует, добавит его - person Jean; 20.11.2019