在Matlab中产生NaN的梯度下降回路

时间:2019-05-02 13:29:15

标签: matlab machine-learning gradient-descent

我正在运行梯度下降循环以最小化函数,但是我的参数向量w计算为NaN,而它应该是数值向量。这意味着在某个时候函数将达到无穷大,但是我不确定为什么。

这是循环。数据是嵌套在学校内的学生的数据集,因此程序首先在每个学校循环,然后第二个循环执行梯度下降。 y变量是测试得分的量度,x向量包含分类的学生人口统计特征和学校特征,以及一些百分比,例如贫困和性别比率。关键计算是g,它计算梯度,我相信这是将导致无穷大而导致NaN结果而不是数值矢量的地方。 g结果应为数值时立即输出为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结果?

0 个答案:

没有答案