R:如何使用DEoptim最小化数据功能

时间:2014-08-26 04:23:14

标签: r function optimization curve-fitting

我想使用DEoptim来最小化给定函数的平方误差,以使4参数幂律适合某些数据:

expfun <- function(p,data){
    res = eval(expression(((data[,2]-((p[1]+p[2]*data[,1])*(1-exp(-(data[,1]-p[3])/p[4]))))^2)))
    return(sum(res))
}

low = c(-100,-50,-50,0)
high = c(100,50,50,20)

fit = DEoptim(expfun, low, high, DEoptim.control(itermax=500, trace=False))

但我不确定在DEoptim通过时如何将数据提供给expfun。这样做的正确方法是什么?

编辑:以下是我可以提供的一些(模拟)数据......我对R不太熟悉,但目前正通过python与它进行交互。我的输入矩阵data的一个小剪辑看起来像这样(来自pandas数据帧):

    x       y
0   33.8    19.734328
1   34.2    19.855713
2   34.4    20.005075
3   36.0    20.023766
4   36.1    20.921509
5   36.3    21.505115
6   36.6    24.600343
7   36.8    25.424239
8   37.4    26.335077
9   38.2    26.421332
10  41.6    26.729980
11  42.4    35.006403
12  46.0    37.647034
13  47.3    38.058187
14  47.8    38.177062
15  58.5    41.061019
16  79.1    43.005465

我的数据通过两个numpy数组xy(再次是python)加载到FloatVector中:

m = np.concatenate((x,y))
data = matrix(R.FloatVector(m), len(x))

如果我在控制台中输出它,它会提供此信息:

<Matrix - Python:0x000000001316B948 / R:0x0000000011FCC4C0>
[19.734328, 19.855713, 20.005075, ..., 38.177062, 41.061019, 43.005465]

我不知道这些额外信息会有多大用处,但我希望有所帮助

1 个答案:

答案 0 :(得分:1)

如果查看?DEoptim,会有一个名为...的参数,其中表示传递给...的参数将传递给fn。因此,我会这样做:

my.data <- read.table(text = "x       y
33.8    19.734328
34.2    19.855713
34.4    20.005075
36.0    20.023766
36.1    20.921509
36.3    21.505115
36.6    24.600343
36.8    25.424239
37.4    26.335077
38.2    26.421332
41.6    26.729980
42.4    35.006403
46.0    37.647034
47.3    38.058187
47.8    38.177062
58.5    41.061019
79.1    43.005465", header = TRUE)

expfun <- function(p, data){
  res = (data[,2]-((p[1]+p[2]*data[,1])*(1-exp(-(data[,1]-p[3])/p[4]))))^2
  sum(res)
}

low = c(-100,-50,-50,0)
high = c(100,50,50,20)

require(DEoptim)
fit = DEoptim(expfun, low, high, DEoptim.control(itermax=500, trace = FALSE), data = my.data)
summary(fit)

***** summary of DEoptim object ***** 
best member   :  72.03075 -0.33433 27.12013 18.7239 
best value    :  55.70625 
after         :  500 generations 
fn evaluated  :  1002 times 
*************************************