在分类任务中,我需要进行特征选择。因此,在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
循环?还有另一种替代方法可以完成此步骤吗?
答案 0 :(得分:2)
为每种可能的功能组合建立模型是很难的。从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
答案 1 :(得分:1)
2 ^ 98 = 316.9e27 = 3000亿亿亿亿。如果您每秒运行十亿*次循环迭代,那么运行该循环将花费一亿**年。我认为您买不起电费...:)
这很可怕,不是,指数事物爆炸的速度有多快?
幸运的是,您无需经常循环访问所有功能对。如果您具有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亿中的10亿-而不是10亿美元。
** 2 ^ 98 / 1e12 / 60/60/24/365 == 10.049e + 9-我没有考虑leap年或leap秒...:)
答案 2 :(得分:0)
我认为您正在请求for循环进行2 ^ 98 = 316,910,000,000,000,000,000,000,000,000,000,000次迭代,因此您需要减少迭代次数。
答案 3 :(得分:0)
正如其他人所指出的那样,是的,您正在for
循环中以禁止性的方式使用,几乎是破坏性的。要求任何一台常规计算机都是荒唐的,更不用说超级计算机来运行那么多循环了。这就是您问题的一部分。
关于开发解决此问题的另一种方法,我对机器学习了解不多(我想说这个很不好,因为我正试图解决这个问题),但是无论如何,似乎您并没有为我们提供了足够的信息以帮助您。无论哪种方式,您都需要以某种方式彻底减少循环的迭代次数,以使其高效运行,并避免错误。