2011-09-29 60 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