自动编码器和SVD:矩阵合并

时间:2018-11-18 12:05:53

标签: python matrix autoencoder svd

在我的研究中,我使用的是所谓的Lee Carter模型(死亡率模型),在该模型中,您可以通过在(log死亡率-年龄的平均年龄模式)矩阵上使用奇异值分解获得模型参数。死亡)。 我试图找到奇异值分解的替代方法,我发现一个不错的选择可能是递归神经网络应用的自动编码。实际上,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)

现在,我们在cent.logMXMatrix上应用SVD 当我在R中使用SVD时,我得到了:

SVD <- svd(cent.logMXMatrix)

我需要获取SVD的组件:

SVD$d
SVD$v
SVD$u 

我想使用Autoencoder获取SVD组件...可以吗? 我想征询您的意见,以及您的一些建议,以及是否有必要在“ cent.logMXMatrix”上为自动编码器使用基本的python代码公式

非常感谢, 安德里亚

1 个答案:

答案 0 :(得分: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')