【问题标题】:Fitting an inverse function拟合反函数
【发布时间】:2013-11-28 12:40:21
【问题描述】:

我有一个看起来像这样的函数: g(x) = f(x) - a^b / f(x)^b

g(x) - 已知函数,提供数据向量。
f(x) - 隐藏进程。
a,b - 此函数的参数。

从上面我们得到关系:
f(x) = 逆(g(x))

我的目标是优化参数 ab 以使 f(x) 尽可能接近
为正态分布。如果我们查看 f(x) Q-Q 正态图(附后),我的目的是通过优化参数 a 和 b。

我写了下面的代码:

g_fun <- function(x) {x - a^b/x^b}

inverse = function (f, lower = 0, upper = 2000) {
      function (y) uniroot((function (x) f(x) - y), lower = lower, upper = upper)[1]
}


f_func = inverse(function(x) g_fun(x))
enter code here

# let's made up an example 
# g(x) values are known 
g <- c(-0.016339, 0.029646, -0.0255258, 0.003352, -0.053258, -0.018971, 0.005172,  
       0.067114, 0.026415, 0.051062)  

# Calculate f(x) by using the inverse of g(x), when a=a0 and b=b0
for (i in 1:10) {  
  f[i] <- f_fun(g[i])  
}

我有两个问题:

  1. 如何将参数 a 和 b 传递给函数?
  2. 如何执行此优化任务,即找到 a 和 b 以使 f(x) 接近正态分布。

【问题讨论】:

  • 好吧,写出G(x)(反函数)是什么。它不会是f(x),所以你的问题不是格式正确的。
  • Carl - 例如,g(x) 是纽约的每日测量温度。假设我们可以通过公式 g(x) = f(x) - a^b/f(x)^b 来解释这一点。 f(x) 是测量中的未知/隐藏过程。 f(x) = inverse(g(x)) 可以通过 f_inverse 函数对每个 g(x) 值进行数值计算,(a 和 b 已知)。
  • Idk 是否重要,但由于 a 和 f(x) 都被 b 平方,将公式写成 g(x) = f(x) 不是更好吗? (a/f(x))^b?这样会有一个除法调用,然后是一个指数调用,最后是一个减法调用,而不是 2 个指数、1 个除法和 1 个减法?只是把我的想法扔在那里。

标签: r function optimization inverse


【解决方案1】:

由于您提供的示例不起作用,因此不确定您是如何生成 QQ 图的。您没有指定 a 和 b 的值,而是定义 f_func 而是调用 f_fun。无论如何,这是我对您问题的回答:

  1. 如何将参数 a 和 b 传递给函数? - 将它们传递为 函数的参数。
  2. 如何执行此优化任务,即找到 a 和 b 以使 f(x) 接近正态分布? - 以同样的方式完成任何优化任务。定义成本函数,然后将其最小化。

这是修改后的代码:我添加了 a 和 b 作为参数,删除了反函数并将其合并到 f_func 中,它现在可以接受向量输入,因此不需要 for 循环。

g_fun <- function(x,a,b) {x - a^b/x^b}

f_func = function(y,a,b,lower = 0, upper = 2000){
  sapply(y,function(z) { uniroot(function(x) g_fun(x,a,b) - z, lower = lower, upper = upper)$root})
} 

# g(x) values are known 
g <- c(-0.016339, 0.029646, -0.0255258, 0.003352, -0.053258, -0.018971, 0.005172,  
       0.067114, 0.026415, 0.051062)  
f <- f_func(g,1,1) # using a = 1 and b = 1
#[1] 0.9918427 1.0149329 0.9873386 1.0016774 0.9737270 0.9905320 1.0025893
#[8] 1.0341199 1.0132947 1.0258569

f_func(g,2,10)
 [1] 1.876408 1.880554 1.875578 1.878138 1.873094 1.876170 1.878304 1.884049
 [9] 1.880256 1.882544

现在对于优化部分,这取决于您所说的 f(x) 是否近似正态分布。如果需要,您可以比较来自 qq 行的均方误差。另外,既然你说的是近似的,那么接近多少才足够好?您可以使用 shapiro.test 并继续搜索,直到找到低于 0.05 的 p 值(请注意可能没有解决方案)

shapiro.test(f_func(g,1,2))$p
[1] 0.9484821

cost <- function(x,y) shapiro.test(f_func(g,x,y))$p

现在我们有了一个成本函数,我们如何最小化它。有许多不同的方法可以进行数值优化。看看优化函数http://stat.ethz.ch/R-manual/R-patched/library/stats/html/optim.html

optim(c(1,1),cost)

这最后一行不起作用,但没有适当的数据和上下文,这是我能做到的。希望这会有所帮助。

【讨论】:

  • Rohit,让我们取 f[1] = 0.9918427 并在 a=1 和 b=1 时将其应用于 g_fun(您的示例)。 g_fun = x - 1^1 / x^1 = 0.9918427 - 1/0.9918427= -0.01638169 但我应该得到 -0.016339。为什么我们会有这种差异?
  • 你应该得到-0.016339是什么意思?
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 2021-04-30
  • 2012-07-15
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多