Автоэнкодер и SVD: матричные приложения

в своем исследовании я использую так называемую модель Ли Картера (модель смертности), в которой вы можете получить параметры модели, используя разложение по сингулярным значениям на матрице (логарифмический коэффициент смертности - средний возрастной показатель смертности). Я пытаюсь найти замену Singular Value Decomposition, я увидел, что хорошим выбором может быть автокодирование, применяемое рекуррентной нейронной сетью. Фактически, SVD может сходиться к автоэнкодеру, в котором функция активации является линейной функцией. С этой целью я бы попробовал использовать нелинейную функцию активации, чтобы получить те же самые предметы, полученные с помощью СВД, с нелинейной формой. Давайте воспользуемся этими шагами, чтобы получить данные: коэффициенты смертности по возрастам и годам.

rm(list = ls())

library(MortalitySmooth)

ages <- 0:100

years <- 1960:2009

D <- as.matrix(selectHMDdata("Japan", "Deaths",
                             "Females", ages,
                             years))

D[D==0] <- 1

E <- as.matrix(selectHMDdata("Japan", "Exposures",
                             "Females", ages,
                             years))

E[E==0] <- 1


lMX <- log(D/E)

alpha <- apply(lMX, 1, mean)`

cent.logMXMatrix <- sweep(lMX, 1, alpha)

Теперь мы применяем SVD к cent.logMXMatrix, когда я использую SVD в R, я получаю это:

SVD <- svd(cent.logMXMatrix)

и мне нужно получить компоненты СВД:

SVD$d
SVD$v
SVD$u 

Я хотел бы получить компонент SVD с помощью Autoencoder... Возможно ли это? Я хотел бы получить ваше мнение, некоторые предложения от вас и возможно ли, что мне нужна базовая формулировка кода Python для автоэнкодера на "cent.logMXMatrix"

Большое спасибо, Андреа


person an.dr.ea    schedule 18.11.2018    source источник
comment
SVD — это задача линейной алгебры. Конечно, вы можете использовать псевдоавтоэнкодер всего с двумя линейными слоями.   -  person Matthieu Brucher    schedule 19.11.2018
comment
Спасибо, можешь показать?   -  person an.dr.ea    schedule 20.11.2018


Ответы (1)


Однослойный автоэнкодер линейно сопоставляет точку данных с низкоразмерным скрытым пространством, а затем применяет нелинейную активацию для проецирования результата в исходное пространство при минимизации ошибки реконструкции.
Если мы заменим нелинейную активацию на линейную (идентичность) и будем использовать норму L2 в качестве ошибки реконструкции, вы будете выполнять ту же операцию, что и SVD.

# use keras with tensorflow backend
# This is a vanilla autoencoder with one hidden layer
from keras.layers import Input, Dense
from keras.models import Model

input_dim = Input(shape = (nfeat, )) # nfeat=the number of initial features
encoded1 = Dense(layer_size1, activation='linear')(input_dim) # layer_size1:size of your encoding layer
decoded1 = Dense(nfeat, activation='linear')
autoencoder = Model(inputs = input_dim, outputs = decoded1)
autoencoder.compile(loss='mean_squared_error', optimizer='adam')
person Akihiko    schedule 20.11.2018
comment
Нет необходимости в дополнительных слоях в линейном энкодере. Но спасибо за показ кода для OP. Даже здесь у вас должно быть только 2 слоя, а не три. Именно поэтому я не голосую. - person Matthieu Brucher; 20.11.2018
comment
@MatthieuBrucher Ты прав. Поскольку у нас линейная активация, нет необходимости добавлять дополнительные слои. Прошу прощения ! - person Akihiko; 20.11.2018
comment
Спасибо, что исправили это! - person Matthieu Brucher; 20.11.2018