R: Вопрос об оптимизации - неверное значение функции в Optimize - PullRequest
0 голосов
/ 12 июля 2011

R Вопрос по программированию - Здравствуйте, мы два летних студента, участвующих в исследовательской программе.После проб и ошибок мы не смогли точно определить причину ошибки «Недопустимое значение функции в Optimize» в нашем оптимизирующем коде.Если бы вы могли предложить какое-либо понимание, это будет оценено.

H_fun <- function(c) 
{ 
val = -current_c_weight*c - X_counts%*%log( 
exp(rep(c,length(current_Theta))*current_Theta) - 
current_elongation_rates ) 
print('#########iteration display#############') 
print('c') 
print(c) 
print('val') 
print(val) 
print('current_c_weight') 
print(current_c_weight) 
print('current_Theta') 
print(current_Theta) 
print('current_elongation_rates') 
print(current_elongation_rates) 
} 

#...snip...

# minimize -H(c) without the non-negativity constraint 
#tmp = optim(c(0,1),H_fun,NULL, method = "BFGS", hessian = TRUE); 
tmp = optimize(H_fun,interval = c(0,1)); 

Вот ссылка на код:

http://www.text -upload.com / read.php? Id = 102950 & c = 8605046

1 Ответ

3 голосов
/ 12 июля 2011

Вы уверены, что H_fun возвращает одномерное значение?

Посмотрите на fcn1() в R optimize() исходном коде :

static double fcn1(double x, struct callinfo *info)
{
    SEXP s;
    REAL(CADR(info->R_fcall))[0] = x;
    s = eval(info->R_fcall, info->R_env);
    switch(TYPEOF(s)) {
    case INTSXP:
        if (length(s) != 1) goto badvalue;
        if (INTEGER(s)[0] == NA_INTEGER) {
            warning(_("NA replaced by maximum positive value"));
        return DBL_MAX;
        }
        else return INTEGER(s)[0];
        break;
    case REALSXP:
        if (length(s) != 1) goto badvalue;
        if (!R_FINITE(REAL(s)[0])) {
            warning(_("NA/Inf replaced by maximum positive value"));
            return DBL_MAX;
        }
        else return REAL(s)[0];
        break;
    default:
        goto badvalue;
    }
 badvalue:
    error(_("invalid function value in 'optimize'"));
    return 0;/* for -Wall */
}

goto badvalue происходит, если длина не равна 1. Кроме того, в сводке пакета указано, что optimize () работает с одномерной неограниченной функцией.

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