for 循环迭代太多 - for 循环终止

Too many for loop iterations - for loop terminates

在一个分类任务中,我需要做特征选择。所以在 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 循环?是否有其他替代方法可以完成此步骤?

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

2^98 = 316.9e27 = 300亿亿万亿。如果你每秒 运行 十亿 * 次循环迭代,则 运行 该循环需要一万亿年** 年。我觉得你付不起电费...:)

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

幸运的是,您不需要经常循环访问所有特征对。如果你有 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

* 十亿等于一百万 -- 不是十亿美元。

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

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

关于开发另一种解决这个问题的方法,我对机器学习了解不多(我想这不好说,因为我正在尝试解决这个问题),但无论如何,你似乎并不已经为我们提供了足够的信息来帮助您。无论哪种方式,您都需要以某种方式急剧地将循环的迭代次数有效地减少到运行,并避免错误。

为每一种可能的特征组合建立模型是很棘手的。从您的 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