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

Matlab中产生NaN的梯度下降回路,matlab,machine-learning,gradient-descent,Matlab,Machine Learning,Gradient Descent,我正在运行一个梯度下降循环来最小化一个函数,但是我的参数向量w被计算为NaN,而它应该是一个数值向量。这意味着在某个点上函数将趋于无穷大,但我不知道为什么 这是循环。数据是嵌套在学校中的学生数据集,因此首先程序在每个学校上循环,第二个循环执行梯度下降。y变量是一个测试分数度量,x向量包含分类的学生人口统计特征和学校特征,以及一些百分比,如贫困和性别比率。关键的计算是g,它计算梯度,我相信这是一个无穷大的结果,而不是一个数值向量。g结果应为数值时立即输出为NaN w_old = rand(28,

我正在运行一个梯度下降循环来最小化一个函数,但是我的参数向量w被计算为NaN,而它应该是一个数值向量。这意味着在某个点上函数将趋于无穷大,但我不知道为什么

这是循环。数据是嵌套在学校中的学生数据集,因此首先程序在每个学校上循环,第二个循环执行梯度下降。y变量是一个测试分数度量,x向量包含分类的学生人口统计特征和学校特征,以及一些百分比,如贫困和性别比率。关键的计算是g,它计算梯度,我相信这是一个无穷大的结果,而不是一个数值向量。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
w_old=rand(28,长度(tru索引));
公差=1e-6;
maxIter=1000;
步长=.1;
网格=零(10,1);
w=w_old;
u=兰德(28,长度(tr_指数));
θ=兰德(10,28);
对于t=1:t
t_trainx=trainx(:,tr_索引(t):tr_索引(t+1)-1);
t_trany=trany(tru索引(t):tru索引(t+1)-1)';
s=长度(t_trainx);
对于j=1:maxIter
w_old(:,t)=w(:,t);
v=θ*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)-步长*g;
u(:,t)=w(:,t)+θ'*v;
如果标准(abs(w(:,t)-w_old(:,t))<公差;
打破
结束
结束
结束

有人能建议这段代码的哪些方面导致了这种NaN结果吗?

什么是
s
?如果您怀疑
w
变为无穷大,则可能是由于
s
造成的,因为分母是每个学校的观察次数(长度(t_trainx))。这永远不会是零,所以不应该导致w趋于无穷大。谢谢你的输入。你试过使用Matlab吗?在计算
g
的行中设置断点,并检查RHS数量。什么是
s
?如果您怀疑
w
变为无穷大,则可能是由于
s
造成的,因为分母是每个学校的观察次数(长度(t_trainx))。这永远不会是零,所以不应该导致w趋于无穷大。谢谢你的输入。你试过使用Matlab吗?在计算
g
的行中设置断点,并检查RHS数量。