【问题标题】:Loop inside another loop in R在R中的另一个循环内循环
【发布时间】:2015-03-24 21:11:58
【问题描述】:

我对循环函数的循环结果有疑问。它只在循环内计数一次,并为第一个 raw 选择最佳解决方案,然后停止。

我想记住矩阵zmienne 每一行的最佳解决方案。我做错了什么?

schaffer <- function(xx)
{x1 <- xx[1]
 x2 <- xx[2]

 fact1 <- (sin(x1^2-x2^2))^2 - 0.5
 fact2 <- (1 + 0.001*(x1^2+x2^2))^2

 y <- 0.5 + fact1/fact2
 return(y)
}

gradient_descent <- function(func, step, niter) { 

  N <- 3 #N- number of random points
  zmienne <- matrix(runif(N*2, min = -100, max = 100), N, 2)
  print(zmienne)
  h = 0.001;
  iter_count = 0;

  for (i in 1:N) {
  x_0 <- zmienne[i,]
  x_n = x_0;

    for (j in 1:niter) {
      func_grad = (func(x_n+h) - func(x_n))/h;
      if (abs(func_grad) < 0.0001) { break; }
      x_n = x_n - step * func_grad;
      print(x_n)
      iter_count = iter_count + 1
    }
  }
return(list(iterations = niter, best_value = func_grad, best_state = x_n, x0=x_0))
    }

solution_m1 <- gradient_descent(schaffer, 0.1, 20)
solution_m1

【问题讨论】:

  • 您能否提供您的数据(或子集)以便我们测试输出?
  • 考虑在第一个循环之外分配iterationsbest_valuebest_statex0NA,并将最佳结果添加到每行的这些变量中。然后在外部循环之外返回一个由iterationsbest_valuebest_statex0 组成的列表。
  • 你能通过在代码中添加你的建议来解释我的修改吗?我应该在关闭内部循环后添加return,然后在关闭主循环后添加?

标签: r loops for-loop gradient-descent


【解决方案1】:

我想这就是你想要的:

gradient_descent <- function(func, step, niter) { 

  N <- 3 #N- number of random points
  zmienne <- matrix(runif(N*2, min = -100, max = 100), N, 2)
  print(zmienne)
  h = 0.001;
  iter_count = 0;
  best.vals <- NULL
  for (i in 1:N) {
    x_0 <- zmienne[i,]
    x_n = x_0;

    for (j in 1:niter) {
      func_grad = (func(x_n+h) - func(x_n))/h;
      if (abs(func_grad) < 0.0001) { break; }
      x_n = x_n - step * func_grad;
      print(x_n)
      iter_count = iter_count + 1
    } 
    best.vals <- c(best.vals, func_grad)
  }

  return(list(iterations = iter_count, best_value = best.vals, best_state = x_n, x0=x_0))
}

solution_m1 <- gradient_descent(schaffer, 0.1, 20)
solution_m1

【讨论】:

  • 谢谢,但此代码为 zmienne 的最后一行返回 $best_value=func_grad。我想从 all.vals 返回 best_value - 在我的情况下,它将是找到全局最小值的最小正值
  • 如果我理解正确而不是简单的修复,我更新了帖子,再试一次。
  • 不完全是,因为现在我有三个最佳值,而 best_state 是一个 - 最佳值的最后一个值。我想为每个点返回 best_values - 所以三个最佳值并从这些值中选择最好的一个 - 最小的正值 - 然后为这个最佳值返回 best_state=x_n,而不是最后一个 x_n
【解决方案2】:

返回值不应在内部循环内,而应在函数的末尾。

【讨论】:

  • @Pascal 很抱歉,但它为“我做错了什么?”这个问题提供了一个清晰简洁的答案,除非您认为我们应该系统地在答案中编写代码。我进行了编辑以更清楚地说明应该做什么。
  • 是的,我们应该提供代码。否则,这样的回复必须写成评论。
  • @Pascal stackoverflow 政策中关于我会错过的任何文章?
  • 你的答案还在。所以,请停止抱怨。
  • @Pascal 我不是在发牢骚,我是在要求您提供有关我不理解的评论的参考。
猜你喜欢
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
相关资源
最近更新 更多