R求解器优化问题

时间:2011-09-29 01:19:33

标签: r

我在r:

中有一个数据框
   buys ges   dif bin
1 22.34  12 10.34   0
2 55.56  12 43.56   0
3 78.33  12 66.33   0
4  9.99  12  2.01   1
..   ..  ..   ..    ..   

dif只是abs(buys-ges)binifelse公式1 if dif is <=10,否则为0。我想通过更改bin列来最大化ges列的总和。约束是ges对于所有行都是相同的。我尝试了几个包,但无法弄清楚最大化或优化。谢谢你的任何建议。

buys <- rnorm(1:100)
> buys <- data.frame(a*100)
> buys <- round(abs(a), 2)
> summary(buys)
    a...100             gs          dif              bin      
 Min.   :  0.89   Min.   :15   Min.   :  1.76   Min.   :0.00  
 1st Qu.: 38.29   1st Qu.:15   1st Qu.: 23.29   1st Qu.:0.00  
 Median : 72.89   Median :15   Median : 57.88   Median :0.00  
 Mean   : 83.91   Mean   :15   Mean   : 70.52   Mean   :0.13  
 3rd Qu.:123.50   3rd Qu.:15   3rd Qu.:108.50   3rd Qu.:0.00  
 Max.   :269.11   Max.   :15   Max.   :254.11   Max.   :1.00  
> gs1 <- 5
> buys$gs <- gs1
> buys$dif <- abs(buys[,1]  - buys$gs)
> buys$bin <- ifelse(buys$dif<=10,1,0)
> colnames(buys) <- c("buys","gs","dif","bin")
> head(buys)
    buys gs    dif bin
1   7.48  5   2.48   1
2  79.08  5  74.08   0
3 139.22  5 134.22   0
4  41.60  5  36.60   0
5  38.35  5  33.35   0
6 157.72  5 152.72   0
> sum(buys$bin)
[1] 10
> num_buys=function(x)
+ {
+   return(length(buys$buys[buys$buys>=x-10 | buys$buys<=x+10]))
+ }
> ans2 <- optimize(f=num_buys,interval=c(min(buys$buys),max(buys$buys)),maximum=TRUE)
> 
> 
> ans2 
$maximum
[1] 269.1099

$objective
[1] 100

1 个答案:

答案 0 :(得分:5)

由于bin的值为0或1,对于给定的ges值,我们实际上只计算buys中区间[ges-10,ges+10]中的元素数量{ {1}}。在视觉上,人们可以想象从[ges-10,ges+10]开始到ges=min(buys)开始“滑动”间隔ges=max(buys),并计算区间中buys的条目数作为值一个功能。特别是:

num_buys=function(x)
{
  return(length(buys[buys>=x-10 & buys<=x+10]))
}

有了这个,我们可以使用optimize来找到最大值:

optimize(f=num_buys,interval=c(min(buys),max(buys)),maximum=TRUE)

举个例子:

> buys=rnorm(10000,mean=50,sd=10)
> summary(buys)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
  11.38   43.22   50.01   50.06   56.93   92.76
> num_buys=function(x){return(length(buys[buys<=x+10 & buys>=x-10]))}
> optimize(f=num_buys,interval=c(min(buys),max(buys)),maximum=TRUE)
$maximum
[1] 50.16788

$objective
[1] 6808

因此,在这种情况下,sum(bin)的最大值将为6808,并且ges=50.16788时会出现此最大值。当然,这是完全合理的,因为大约68%的值应该在10个50单位内发生(正态分布和所有这些)。 :D