【发布时间】:2018-12-06 20:00:57
【问题描述】:
我经常遇到适合 while 循环的问题,但结果很丑,我在这里问是否有一个优雅的解决方案,或者是否所有可能的解决方案都很丑陋。有吗?
这是一个简化的示例:假设我们试图找到函数f <- function(x){x^2} 的最小值,以及找到它的位置。假设我们选择通过初始猜测x 并评估f(x) 来找到最小值。然后我们评估f(x-0.1) 和f(x+0.1)。如果这些值中的任何一个低于f(x),我们的新猜测就是argmin。我们重复,直到这种转变不再减少价值。
我想出的最佳解决方案是在循环之外运行算法的第一次迭代的一部分。但这需要我从循环中复制代码,即用!!!!!!! 括起来的代码部分。
# function to minimize
f <- function(x){x^2}
# initial guess
x.current <- 1
f.current <- f(x.current)
# !!!!!!!!!!!!
# part of first iteration
x.guess <- c(x.current - 0.1, x.current + 0.1)
f.guess <- sapply(x.guess, f)
best.ind <- which.min(f.guess)
x.new <- x.guess[best.ind]
f.new <- f.guess[best.ind]
# !!!!!!!!!!!!
# part of first iteration and later iterations
while (f.new < f.current){
x.current <- x.new
f.current <- f.new
x.guess <- c(x.current - 0.1, x.current + 0.1)
f.guess <- sapply(x.guess, f)
best.ind <- which.min(f.guess)
x.new <- x.guess[best.ind]
f.new <- f.guess[best.ind]
}
print("best guess = ")
print(x.current)
有没有“更好”的方式来做到这一点?
【问题讨论】:
-
如果你能解释你想用这些值做什么会更有帮助。
-
我认为关于什么是“丑陋”的问题将作为题外话关闭(取决于意见)。一些选项:1)将重复的代码放入自己的函数中,并在循环之前和循环中用一行调用它; 2)使用迭代计数器,并在循环中只为它执行一些代码>1
-
丑陋地试图重新编程一个更好的内置 R 函数。请参阅
nlm函数。内置函数使用牛顿法,应该只需几步即可找到最小值,而不是缓慢的逐步方法。如果您确实需要一个while循环,那么只需将变量设置为将失败的条件。在上面的例子中设置f.new <- f.current+1(在循环之外)并且循环总是至少执行一次。 -
@strboul 我对这个函数完全不感兴趣。我尝试用最少的例子来写我的问题,以便它们对网站上的其他人有用。我偶尔会遇到这个问题,我想做点什么。
-
@Dave2e 见上面的评论。该网站不允许我在一条评论中引用你们两个。
标签: r while-loop