R решатель задачи оптимизации - PullRequest
1 голос
/ 29 сентября 2011

У меня есть фрейм данных в 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

1 Ответ

5 голосов
/ 29 сентября 2011

Поскольку значения 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% значений должно быть в пределах 10 единиц от 50 (нормальное распределение и все такое). : D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...