Пример неотрицательной декомпозиции тензора с использованием тензорно

#python #tensorflow #tensor #tensorly

#python #тензорный поток #тензор #тензорно

Вопрос:

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

Ответ №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 (приблизительно).

Вместо этого неотрицательный Tucker вернет вам неотрицательное ядро и некоторые неотрицательные факторы. Обратите внимание, что теперь вам также нужно указать ранг для декомпозиции.

 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 для этой функции.

Комментарии:

1.вот код: 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 .

2. Вы неправильно используете функцию: non_negative_tucker не возвращает ошибки восстановления или режим. Правильное использование — это то, которое я написал в сообщении, например core, factors = non_negative_tucker(X, rank=(12, 12, 12), n_iter_max=1000) .

3. я соответствующим образом изменил код, который выглядит следующим образом: 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) вывод по-прежнему представляет собой набор размытых изображений. Пожалуйста, исправьте, если в коде что-то не так.

4. Чего вы пытаетесь достичь? Вам нужно, чтобы факторы и ядро были неотрицательными? Если нет, попробуйте Tucker (или partial_tucker, если вам не нужно разлагать по размеру выборки). Также изображения имеют размер 64×64, но вы выбрали ранг 80 для этих измерений, поэтому вы переопределяете параметры. Наконец, svd — гораздо лучшая инициализация, чем random . Итак, с помощью tucker вы могли бы попробовать core, tucker_factors = tucker(X, rank=tucker_rank, n_iter_max=100, tol=10e-10, init='svd') .

5. Спасибо, он работает просто идеально. Благодаря библиотеке tensorly. Еще одна вещь, о которой вы упомянули функцию add_noise() в статье, но я не получаю эту функцию, даже если я обновил тензорно.