2011-09-29 2 views
1

난 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)bin과 달리 1 if dif is <=10 0 인 화학식 ifelse이다. ges 열을 변경하여 bin 열의 합을 최대화하려고합니다. 제약 조건은 ges이 모든 행에서 동일하다는 것입니다. 몇 가지 패키지를 시도했지만 최대화 또는 최적화를 파악할 수 없습니다. 어떤 제안을 주셔서 감사합니다. bin의 값은 0 또는 1 중 하나이기 때문에

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

, ges의 주어진 값에 대해, 우리는 정말 간격 [ges-10,ges+10]buys의 요소 수를 계산하고 있습니다. 시각적으로, 간격 [ges-10,ges+10]에서 시작하여 ges=min(buys)에서 시작하여 ges=max(buys)으로 끝나고 간격 값인 항목 수를 함수의 값으로 계산하는 것을 상상할 수 있습니다. 특히 :의

> 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 

그래서,이 경우, 최대 값 : 예를 들어

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

: 그와

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

, 우리는 최대를 찾을 optimize을 사용할 수 있습니다 sum(bin)은 6808이고, 최대 값은 ges=50.16788 일 때 발생합니다. 물론, 이것은 값의 약 68 %가 10 단위 50 (정규 분포 및 모든 것) 내에서 발생해야하므로 완벽합니다. : D

+0

나는 의심 스럽다.이 df는 단지 샘플 일 뿐이다. 15.00에 50 개의 구매가있는 경우 최대 (구매) 근처의 항목을 사용하여 bin의 합을 최대화하지 않을 것입니다. – screechOwl

+0

'ges = max (buy)'이면'max (dif) = 0 <= 10'이므로 각 행에 대해'bin == 1'과'sum (bin)'이 최대가됩니다. –

+0

당신이 맞습니다. 내가 잘못 썼습니다. 그것의 abs (구매 - ges) 해야하는. 미안합니다. – screechOwl