4

我试图在 R 中使用 nnet 函数来近似两个变量 y(a,b) 的函数。变量“a”和“b”在固定点上都是已知的:

a={a(1),a(2),...,a(i),...a(n)} and
b={b(1),b(2),...,b(i),...b(n)}.

对于每一对a(i),b(i),“y”函数的值是已知的,即

y(a,b)={y(a(1),b(1)),y(a(2),b(2),...y(a(i),b(i),...y(a(n),b(n)}.

我做

res=nnet(y~a+b,size=X,maxit=M,linout=TRUE), 

其中定义了 X 和 M。

如何获得点之间的结果值,例如在 a(i) 和 a(i+1) 之间的某个 a 值和 b(j) 和 b(j+ 之间的 b 值1) ?

4

1 回答 1

0

它看起来像正确的命名问题。我建议使用data.frames 以防止误解。

library(nnet)
X <- 20  # Number of neurons in hidden layer
M <- 1e4 # Maximum number of iterations
N <- 50  # Length of data vectors

set.seed(1)
## Train set
df.train <- data.frame(a=rnorm(N,5,1), b=rnorm(N,10,2))
df.train$y <- with(df.train, 5*a-2*b+rnorm(N))
## Test set for interpolation
a1 <- sapply(2:N, function(i) with(df.train, (a[i]+a[i-1])/2))
b1 <- sapply(2:N, function(i) with(df.train, (b[i]+b[i-1])/2))
df.test <- data.frame(a=a1, b=b1)

上面的代码创建了两个data.frames:

  1. df.train与列a,by.
  2. df.test与列ab

请注意,变量的列名称应在两个data.frames.

训练:

res <- nnet(y~a+b, data=df.train, size=X, maxit=M, linout=TRUE)
p1 <- predict(res, df.train)

p1是训练数据的预测。

插值:

p2 <- predict(res, df.test)

在视觉上,插值看起来很自然:

library(ggplot2)
ggplot() + 
  geom_line(aes(x,y), data=data.frame(x=1:N, y=df.train$y)) +        # original y
  geom_point(aes(x,y), data=data.frame(x=1.5:N, y=p2), colour="red") # interpolations

在此处输入图像描述

于 2013-01-30T20:20:01.183 回答