Автоэнкодер и SVD: матричные приложения - PullRequest
0 голосов
/ 18 ноября 2018

в своем исследовании я использую так называемую модель Ли Картера (модель смертности), в которой вы можете получить параметры модели, используя разложение по единичным значениям на матрицу (логарифмическая смертность - средний возрастной характер смертность). Я пытаюсь найти замену разложения по сингулярным значениям, я вижу, что хорошим выбором может быть автокодирование, применяемое в рекуррентной нейронной сети. Фактически SVD мог бы сходиться к автоэнкодеру, в котором функция активации является линейной функцией. С этой целью я попытался бы использовать нелинейную функцию активации, чтобы получить те же самые элементы, полученные 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 к центу .logMXMatrix когда я использую SVD в R, я получаю это:

SVD <- svd(cent.logMXMatrix)

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

SVD$d
SVD$v
SVD$u 

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

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

1 Ответ

0 голосов
/ 20 ноября 2018

Однослойный автоэнкодер линейно отображает точку данных в скрытое пространство с низкой размерностью, затем применяет нелинейную активацию для проецирования результата в исходное пространство при минимизации ошибки восстановления.
Если мы заменим нелинейную активацию линейной (тождество) и используем норму 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')
...