MATLAB fminunc()没有完成大型数据集。适用于较小的

时间:2013-05-22 16:00:05

标签: matlab regression

我在MATLAB中对文本数据进行L2正则化进行逻辑回归。我的程序适用于小型数据集。对于较大的套装,它可以无限运行。

我看到了可能重复的问题(matlab fminunc not quitting (running indefinitely))。在那个问题中,初始theta的成本是NaN,控制台中打印出错误。对于我的实现,我得到了一个真正有价值的成本,即使将详细参数传递给fminunc()也没有错误。因此,我认为这个问题可能不重复。

我需要帮助将它扩展到更大的集合。我目前正在处理的训练数据大小约为10k * 12k(累计包含12k字的10k文本文件)。因此,我有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

成本函数似乎表现正常。对于初始theta,我得到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。通过一次迭代,即使经过几个小时,程序仍未完成执行。我的问题是:

  1. 我是否在数学上做错了什么?

  2. 我应该使用任何其他优化器而不是fminunc()吗?在LargeScale = on的情况下,fminunc()使用信任域算法。

  3. 这个问题是集群规模的,不应该在一台机器上运行吗?

  4. 任何其他一般提示将不胜感激。谢谢!


    这有助于解决问题:我能够通过在fminunc()中将LargeScale标志设置为'off'来实现此功能。从我收集的信息来看,LargeScale ='on'使用信任域算法,而保持'off'使用准牛顿方法。使用准牛顿方法并传递梯度对于这个特定问题的工作速度要快得多,并且给出了非常好的结果。


3 个答案:

答案 0 :(得分:1)

我能够通过在fminunc()中将LargeScale标志设置为'off'来实现此功能。从我收集的信息来看,LargeScale ='on'使用信任域算法,而保持'off'使用准牛顿方法。使用准牛顿方法并传递梯度对于这个特定问题的工作速度要快得多,并且给出了非常好的结果。

答案 1 :(得分:0)

以下是我的建议:

- 设置Matlab标志以在运行期间显示调试输出。如果不只是在您的成本函数中打印出成本,这将允许您监视迭代计数和错误。

第二,这非常重要:

你的问题是不好的,或者说不确定。你有一个12k的功能空间,只提供10k的例子,这意味着无限制的优化,答案是-Inf。为了简单说明原因,您的问题就像: 在给定x + y-z = 2的情况下最小化x + y + z。特征空间暗淡3,跨越向量空间 - 1d。我建议使用PCA或CCA来降低文本文件的维度,方法是将其变体保留高达99%。这可能会给你一个特征空间~100-200dim。

PS:只是指出问题非常紧张,因为群集大小要求通常是1kk +数据点而且fminunc根本不是一种过度杀伤,而LIBSVM与它无关,因为fminunc只是一个二次方优化器,而LIBSVM是一个分类器。为了清除LIBSVM使用类似于fminunc的东西只是具有不同的目标函数。

答案 2 :(得分:0)

根据我对此类问题的经验,这是我怀疑的问题。您使用的是X的密集表示,而不是sparse。您还看到文本分类中的典型效果是术语数量与样本数量大致呈线性增长。实际上,矩阵乘法X*theta的成本与样本数量成正比。

相比之下,良好的稀疏矩阵表示仅迭代非零元素进行矩阵乘法,如果它们具有适当恒定的长度,则每个文档趋于大致恒定,从而导致线性而非二次减速。样本数量。

我不是Matlab大师,但我知道它有sparse matrix package,所以尽量使用它。