R循环直到满足条件

R loop until condition is met

在用 R 做一个项目时,我被困在了某个地方。 这些是我的数据:


r <- 0.001
a <- 0.386
b <- 0.799

yp <- b*df$x+a
sse <- ((df$y-yp)^2)*0.5
a <- a-r*sum(-(df$y-yp))
b <- b-r*sum(-(df$y-yp)*df$x)

如何找到 SSE 误差为 0.0001 的迭代次数?

您可以执行一个 while 循环,将每次迭代的误差平方和存储在一个向量中。当平方和停止下降时循环停止,此时我们应该有一个准确的 ab,迭代次数由 sse 向量的长度给出。

df <- data.frame(x=c(1.0,2.1,2.2,3.5,5.3,5.4,6.5,7.4),
                 y=c(4,4,4,5,5,6,8,8))

r <- 0.001
a <- 0.386
b <- 0.799

yp  <- b * df$x + a
sse <- sum(((df$y - yp)^2))

while(TRUE)
{
  a <- a - r * sum(-(df$y - yp))
  b <- b - r * sum(-(df$y - yp) * df$x)
  yp <- b * df$x + a
  sse <- c(sse, sum((df$y - yp)^2))
  if(tail(sse, 1) >= sse[length(sse) - 1]) break
}

要查看结果,我们可以这样做:

cat('iterations: ', length(sse), '\n Intercept = ', a, '\n Slope = ', b, '\n')
#> iterations:  9152 
#>  Intercept =  2.691678 
#>  Slope =  0.6726519

而且我们可以看到我们的结果是正确的(精确到小数点后六位) 运行 和 lm:

coef(lm(y~x, df))
#> (Intercept)           x 
#>   2.6916789   0.6726517

reprex package (v2.0.1)

于 2022-03-15 创建