使用 optimr 查找断点
Find Breakpoint with optimr
我正在尝试将已知函数拟合到数据点,找到最佳参数设置。为此,我正在使用 optimr
包。
这是一个可重现的例子:
packages = c("optimr", "ggplot2", "tidyverse")
lapply(packages, library, character.only=T)
testfun <- function(par, x){
case_when(
x < par[1] ~ par[2]*x,
x >= par[1] ~ par[3] + par[4]*x^2)
}
optfun <- function(par, x, y){
sum((testfun(par, x) - y)^2)
}
optout <- optimr(par = c(20000,0,0,0), optfun, x = ggplot2::midwest$popdensity, y = ggplot2::midwest$poptotal, method = "L-BFGS-B")
ggplot(ggplot2::midwest, aes(x = popdensity, y = poptotal)) +
geom_point() +
stat_function(fun = testfun, args = list(par = optout$par))
我可以拟合一个简单的函数,设置会找到最佳拟合参数。但是 par[1]
并没有改变,只是在我引入分段函数时保持初始值。
非常感谢任何帮助!
分段函数,尤其是具有平坦部分的分段函数,会给优化器带来麻烦。如果函数值对于某个步长没有改变,优化器通常会放弃一个参数,并且可能搜索得不够远以达到该步长。
寻找 optimr
的其他参数,这可能会扩大搜索范围 space。
我正在尝试将已知函数拟合到数据点,找到最佳参数设置。为此,我正在使用 optimr
包。
这是一个可重现的例子:
packages = c("optimr", "ggplot2", "tidyverse")
lapply(packages, library, character.only=T)
testfun <- function(par, x){
case_when(
x < par[1] ~ par[2]*x,
x >= par[1] ~ par[3] + par[4]*x^2)
}
optfun <- function(par, x, y){
sum((testfun(par, x) - y)^2)
}
optout <- optimr(par = c(20000,0,0,0), optfun, x = ggplot2::midwest$popdensity, y = ggplot2::midwest$poptotal, method = "L-BFGS-B")
ggplot(ggplot2::midwest, aes(x = popdensity, y = poptotal)) +
geom_point() +
stat_function(fun = testfun, args = list(par = optout$par))
我可以拟合一个简单的函数,设置会找到最佳拟合参数。但是 par[1]
并没有改变,只是在我引入分段函数时保持初始值。
非常感谢任何帮助!
分段函数,尤其是具有平坦部分的分段函数,会给优化器带来麻烦。如果函数值对于某个步长没有改变,优化器通常会放弃一个参数,并且可能搜索得不够远以达到该步长。
寻找 optimr
的其他参数,这可能会扩大搜索范围 space。