Градиентный спуск с образованием NaN в Matlab - PullRequest
1 голос
/ 02 мая 2019

Я запускаю цикл градиентного спуска, чтобы минимизировать функцию, но мой вектор параметров w рассчитывается как NaN, в то время как он должен быть числовым вектором.Это означает, что в какой-то момент функция уходит в бесконечность, но я не уверен почему.

Вот цикл.Данные представляют собой набор данных учащихся, вложенных в школы, поэтому сначала программа проходит по каждой школе, а вторая выполняет градиентный спуск.Переменная y является показателем оценки теста, а вектор x содержит категориальные демографические характеристики учащихся и школьные характеристики, а также несколько процентов, таких как уровень бедности и пол.Ключевым вычислением является g, который вычисляет градиент, и я считаю, что это то, где что-то стремится к бесконечности, приводя к результату NaN вместо числового вектора.Данный результат немедленно выводится как NaN, когда он должен быть числовым.

w_old = rand(28, length(tr_indexes));
tolerance = 1e-6;
maxIter = 1000;
stepsize = .1;
grid = zeros(10,1);
w = w_old;
u = rand(28,length(tr_indexes));
theta = rand(10,28);

       for t = 1:T
            t_trainx = trainx(:, tr_indexes(t):tr_indexes(t+1)-1 );
            t_trainy = trainy(tr_indexes(t):tr_indexes(t+1)-1)';
            s = length(t_trainx);
            for j = 1:maxIter
                w_old(:, t) =  w(:,t);
                v= theta*u(:,t);
                g = ((2/s)*((t_trainy-(w(:,t)'*t_trainx + v'*theta*t_trainx))*t_trainx')' + 2*lambda*w(:,t))
                w(:,t)= w_old(:,t) - stepsize*g;
                u(:,t)= w(:,t) + theta'*v;
                if norm(abs(w(:,t)-w_old(:,t))) < tolerance;
                break
                end
            end
        end

Кто-нибудь может подсказать, какие аспекты этого кода приводят к этому результату NaN?

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