Почему fminun c в этом для l oop дает одинаковый результат каждый раз? - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь запустить 'fminun c' несколько раз для l oop.

Часть кода:

P = 0.70 ;
idx = randperm(m);
X_Training = X(idx(1:round(P*m)),:); 
X_Testing = X(idx(round(P*m)+1:end),:);
y_Traning = y(idx(1:round(P*m)),:);
y_Testing = y(idx(round(P*m)+1:end),:);

s             = 100;
border_all    = zeros( 2, s );
lambda        = 1;
accuracy      = 0;
initial_theta = zeros( n + 1, 1 );
options       = optimset( 'GradObj', 'on', 'MaxIter', 400 );

for i = 1 : 1 : s
    [theta, J, exit_flag] = fminunc( @(t) costFunctionReg( t, X_Training, y_Traning, lambda ), initial_theta, options );

    for border = 0.01 : 0.01 : 1
        p          = predict( theta, X_Testing, border );
        accuracy_t = mean( double( p == y_Testing ) ) * 100;

        if accuracy_t > accuracy
            accuracy      = accuracy_t;
            border_result = border;
        endif
    endfor

    border_all(1, i) = border_result;
    border_all(2, i) = accuracy;
endfor

Я использую выходные значения "theta msgstr "позже проверить другую изменяющуюся переменную" i "(для i = 1: 1: s ..). Каждый раз, когда я запускаю скрипт, вычисляется «тэта», но он не меняется в других «для l oop» итерациях. Тем не менее, он должен быть немного различным в каждой итерации.

В то же время, когда я перезапускаю скрипт, я получаю новые значения "theta". Итак, кажется, что он рассчитывается с нуля только на первой итерации, а не на других. Возможно, проблема с памятью. Пробовал «очистить» функцию, но результат тот же.

Кто-нибудь сталкивался с такой же проблемой?

1 Ответ

0 голосов
/ 14 февраля 2020

Преобразование цепочки комментариев в ответ для тех, кто ищет в Google похожую проблему:

Это потому, что после ввода значения для l oop входные данные для fminunc никогда не изменяются, поэтому вы фактически всегда вызываете его с одинаковыми входными данными и, следовательно, получаете один и тот же выходной сигнал.

Переместите рандомизированные инициализации в верхнюю часть вашего фрагмента кода внутри для l oop , и вы будете каждый раз получать разные выходные данные, как вы и собираетесь.

...