我在MATLAB中用L2正则化对文本数据进行逻辑回归我的程序适用于小数据集对于较大的集合,它会无限地运行。
我看到了可能重复的问题(matlab fminunc not quitting (running indefinitely))在这个问题中,初始theta的成本是NaN,控制台中打印了一个错误对于我的实现,我得到了一个真正有价值的成本,即使将详细的参数传递给fminunc(),也没有错误因此我认为这个问题可能不是重复的。
我需要帮助把它扩展到更大的集合我目前正在处理的训练数据大小约为10k*12k(10k文本文件累计包含12k个单词)因此,我有m=10k的训练示例和n=12k的特性。
我的成本函数定义如下:
function [J gradient] = costFunction(X, y, lambda, theta)
[m n] = size(X);
g = inline('1.0 ./ (1.0 + exp(-z))');
h = g(X*theta);
J =(1/m)*sum(-y.*log(h) - (1-y).*log(1-h))+ (lambda/(2*m))*norm(theta(2:end))^2;
gradient(1) = (1/m)*sum((h-y) .* X(:,1));
for i = 2:n
gradient(i) = (1/m)*sum((h-y) .* X(:,i)) - (lambda/m)*theta(i);
end
end
我正在使用MATLAB的fminunc()函数执行优化我传递给fminunc()的参数是:
options = optimset('LargeScale', 'on', 'GradObj', 'on', 'MaxIter', MAX_ITR);
theta0 = zeros(n, 1);
[optTheta, functionVal, exitFlag] = fminunc(@(t) costFunction(X, y, lambda, t), theta0, options);
我在一台具有以下规格的机器上运行此代码:
Macbook Pro i7 2.8GHz / 8GB RAM / MATLAB R2011b
成本函数的行为似乎是正确的对于初始θ,我得到了J和梯度的可接受值。
K>> theta0 = zeros(n, 1);
K>> [j g] = costFunction(X, y, lambda, theta0);
K>> j
j =
0.6931
K>> max(g)
ans =
0.4082
K>> min(g)
ans =
-2.7021e-05
这个程序需要非常长的时间才能运行我开始分析保持fminunc()的MAX_ITR=1在一次迭代中,程序即使经过几个小时也没有完成执行我的问题是:
我在数学上做错什么了吗?
我应该使用其他优化器而不是fminunc()吗对于LargeScale=on,fminunc()使用信任区域算法。
这个问题是集群规模,不应该在一台机器上运行吗?
任何其他一般提示将不胜感激谢谢!
这有助于解决问题:通过在fminunc()中将LargeScale标志设置为“off”,我可以使这个工作正常据我所知,LargeScale='on'使用信任域算法,而保持它的'off'使用准牛顿方法用拟牛顿法和梯度法求解这一特殊问题的速度要快得多,得到了很好的结果。
最佳答案
通过在fminunc()中将LargeScale标志设置为'off',我可以使这个工作据我所知,LargeScale='on'使用信任域算法,而保持它的'off'使用准牛顿方法用拟牛顿法和梯度法求解这一特殊问题的速度要快得多,得到了很好的结果。