我在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)
而bin
是ifelse
公式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
答案 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