【问题标题】:Too many for loop iterations - for loop terminates太多 for 循环迭代 - for 循环终止
【发布时间】:2018-12-18 20:27:33
【问题描述】:

在分类任务中,我需要进行特征选择。所以在featSize = 98 特性(变量)中,我想知道哪些是适用的。对于每种组合,我通过调整其超参数来训练分类器。我在使用for 循环时遇到了问题:

  for b = 1:(2^featSize) - 1
        % this is to choose the features. e.g. [1 0 0] selects the first
        % feature out of three features if featSize = 3.

end

Matlab 给出警告:Warning: Too many FOR loop iterations. Stopping after 9223372036854775806 iterations. 我是否以禁止的方式使用for 循环?是否有其他替代方法可以完成此步骤?

【问题讨论】:

    标签: matlab machine-learning classification feature-selection


    【解决方案1】:

    为每种可能的特征组合建立模型是很困难的。从您的 for 循环中可以清楚地看出,您必须构建指数数量的模型来覆盖每个特征子集。

    有许多实用的特征选择方法。与您的方法最相似的一种是前向选择。许多算法提供了一个正则化参数(例如 LASSO 或岭回归)。这里讨论了一些回归选项https://stats.stackexchange.com/questions/127444/a-guide-to-regularization-strategies-in-regression

    本次演讲涵盖了特征选择问题的多种方法https://www.youtube.com/watch?v=JsArBz46_3s&index=21&list=PLGVZCDnMOq0ovNxfxOqYcBcQOIny9Zvb-&t=0s

    【讨论】:

    • 感谢您回答有关机器学习方面的有用提示。您能否提及集成学习(不是 AdaBoost)是否是一种使用相同学习器或不同学习器对特征子集进行分类的方法,方法是进行特征子集选择,然后在每个子集上应用学习器?解释和实现的链接在这里(mathworks.com/matlabcentral/fileexchange/38944-ensemble-toolbox
    • @SrishtiM 不,这是一个单独的问题。你应该在stats.stackexchange.com 询问
    【解决方案2】:

    2^98 = 316.9e27 = 300,000,000,000,000,000,000,000。如果您每秒运行十亿*次循环迭代,则运行该循环将需要一万年时间。我认为你负担不起电费... :)

    这很可怕,不是吗,指数级的东西爆炸的速度有多快?

    幸运的是,您无需经常循环访问所有功能对。如果你有 98 个特征,那么你有 98^2 对,而不是 2^98。实际上,如果您不想将某个功能与其自身配对,则您有 98*97,如果顺序无关紧要,则为 98*97/2。

    你可以写一个双循环来访问每一对:

    N = 98
    for ii = 1:N-1
       for jj = ii+1:N
          % do something with the pair [ii,jj]
       end
    end
    

    * 10 亿等于 100 万,而不是 10 亿美元。

    ** 2^98 /1e12 /60 /60 /24 /365 == 10.049e+9 -- 我没有考虑闰年或闰秒... :)

    【讨论】:

    • OP 不是在寻找最佳的特征对,而是寻找最佳的子集(任何大小)
    • 假设 featSize =3,我将 for 循环设置为 2^(featSize)-1 的原因是为了获得以下组合:[1;2;1 2;3;1 3;2 3]。如果我按照您提到的for b = 1:(featSize^(featSize - 1)) display(find(de2bi(b,featSize))); end; 的方式进行操作,则Matlab 会抛出错误:Error using de2bi (line 163) Specified number of columns in output matrix is too small. 使用子集的每个组合,我训练一个学习者。
    • @Dan:我猜你的心智能力比我强。我错过了。 ://
    • @SrishtiM:不确定你的代码在做什么,你为什么要featSize^(featSize - 1)?这比2^featSize 还要大!
    • 对不起,它会成倍增加,不会被提升到幂。话虽如此,根据 Dan 的解释,我正在调整任何大小的最佳子集。所以,for loop应该是featSize*(featSize-1)还是我做的2^(featSize)-1,这也是有问题的,因为你和其他人提到的原因。
    【解决方案3】:

    正如其他人所指出的,是的,您正在以一种禁止的方式使用for 循环,几乎是破坏性的。要求任何普通计算机,更不用说超级计算机来运行这么多次循环迭代,这都是荒谬的。这就是你问题的一部分。

    关于开发另一种解决此问题的方法,我对机器学习知之甚少(我想这不好说,因为我正试图解决这个问题),但无论如何,你似乎没有为我们提供了足够的信息来帮助您。无论哪种方式,您都需要以某种方式大幅减少循环的迭代次数,以使其高效运行并避免错误。

    【讨论】:

      【解决方案4】:

      我认为您要求 for 循环执行 2^98 = 316,910,000,000,000,000,000,000,000,000 次迭代,因此您需要减少迭代次数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-08-18
        • 2012-06-27
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多