2011-09-29 64 views
1

我有在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。我试图通过更改ges列来最大化bin列的总和。约束条件是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 

回答

5

由于bin值是0或1,为ges一个给定值,我们实际上只是计数buys是在间隔[ges-10,ges+10]元件的数量。在视觉上,可以想象“滑动”区间[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%的值应该在50的10个单位(正态分布和所有这些)内出现。 :D

+0

我很怀疑,这个DF只是一个例子。如果在15.00时有50个买入,则不会通过使用任何接近max(买入)的东西来最大化仓位的总和。 – screechOwl

+0

如果'ges = max(buy)',那么'max(dif)= 0 <= 10',因此'bin == 1'对于每一行和'sum(bin)'是最大的。 – 2011-09-29 01:47:02

+0

你是对的我写错了。它应该是abs(购买)。对于那个很抱歉。 – screechOwl