Нормализация данных при непрерывном обучении нейронной сети в R

Я хотел бы реализовать постоянную тренировку своей нейронной сети, поскольку мой вклад продолжает поступать. Однако по мере получения новых данных нормализованные значения со временем будут меняться. Допустим, что со временем я получаю:

df <- "Factor1 Factor2 Factor3 Response
        10      10000   0.4     99
        15      10200   0       88
        11      9200    1       99
        13      10300   0.3     120"
df <- read.table(text=df, header=TRUE)

normalize <- function(x) {
    return ((x - min(x)) / (max(x) - min(x)))
}

dfNorm <- as.data.frame(lapply(df, normalize))

### Keep old normalized values
dfNormOld <- dfNorm 

library(neuralnet)
nn <- neuralnet(Response~Factor1+Factor2+Factor3, data=dfNorm, hidden=c(3,4), 
    linear.output=FALSE, threshold=0.10,  lifesign="full", stepmax=20000)

Затем, когда наступает время два:

df2 <- "Factor1 Factor2 Factor3 Response
        12      10100   0.2     101
        14      10900   -0.7    108
        11      9800    0.8     120
        11      10300   0.3     113"

df2 <- read.table(text=df2, header=TRUE)

### Bind all-time data
df <- rbind(df2, df)

### Normalize all-time data in one shot
dfNorm <- as.data.frame(lapply(df, normalize))

### Continue training the network with most recent data
library(neuralnet)
Wei <- nn$weights
nn <- neuralnet(Response~Factor1+Factor2+Factor3, data=df[1:nrow(df2),], hidden=c(3,4), 
    linear.output=FALSE, threshold=0.10,  lifesign="full", stepmax=20000, startweights = Wei)

Вот как я буду тренировать его с течением времени. Однако мне было интересно, есть ли какой-нибудь элегантный способ уменьшить эту предвзятость постоянного обучения, поскольку нормализованные значения неизбежно изменятся со временем. Здесь я предполагаю, что ненормализованные значения могут быть смещены.


person user3091668    schedule 20.01.2018    source источник
comment
Если ненормализованные значения смещены, нормализованные значения также будут смещены. Вы не устраните предвзятость, изменив шкалу значений.   -  person De Novo    schedule 07.03.2018
comment
Одним из решений может быть использование общего минимума и максимума для каждой переменной и всегда нормализация с ними. Это может быть какое-то значение, близкое к ожидаемому вами максимальному и минимальному измерению (?). Конечно, это будет зависеть от характера ваших переменных.   -  person Ricardo Fernandes Campos    schedule 08.03.2018


Ответы (1)


Вы можете использовать этот код:

normalize <- function(x,min1,max1,row1) {
     if(row1>0)
        x[1:row1,] = (x[1:row1,]*(max1-min1))+min1
     return ((x - min(x)) / (max(x) - min(x)))
 }

past_min = rep(0,dim(df)[2])
past_max = rep(0,dim(df)[2])
rowCount = 0

while(1){
df = mapply(normalize, x=df, min1 = past_min, max1 = past_max,row1 = rep(rowCount,dim(df)[2]))
nn <- neuralnet(Response~Factor1+Factor2+Factor3, data=dfNorm, hidden=c(3,4), 
                    linear.output=FALSE, threshold=0.10,  lifesign="full", stepmax=20000)

past_min = as.data.frame(lapply(df, min))
past_max = as.data.frame(lapply(df, max))
rowCount = dim(df)[1]

df2 <- read.table(text=df2, header=TRUE)
df <- rbind(df2, df)
}
person Zeinab Ghaffarnasab    schedule 13.03.2018