而无限循环python

时间:2013-09-25 21:05:44

标签: python loops error-handling infinite

我理解这里发生了什么,我只是想知道在进入无限循环之前如何捕捉我的程序。这是我的代码:

while abs(error) > 50:
    if Co > To:
        c = c + 0.1
    else:
        c = c - 0.1

    ##Here I recalculate Co, the function is Co = 1/b type curve
    ##Here I recalculate To, the function is To = e^b type curve

    error = Co - To

问题在于,根据问题,我有时需要更精确(我需要将迭代线更改为c + 0.00001),因为错误会从低于50的值跳到超过50的值。每个循环。我怎么能抓住这样一个无限循环。

2 个答案:

答案 0 :(得分:2)

我想这是一个收敛的问题。我的数学foo现在让我失望了一些,但如果你担心你可能最终处于一个你可能无法收敛的位置,你可以在你的循环中添加一些计数器。

limit = 1000
while abs(error) > 50:
    limit -= 1
    if limit == 0:
        raise SomeError
    your_calcs

这有点残酷,但至少它解决了悬挂的问题。听起来好像你无法保证这个循环会因为不断变化的代码/数据的性质而完成。如果发生无限循环情况,我想看到一个错误,所以我可以调查它。真的取决于您的问题域。

答案 1 :(得分:0)

如果我明白你在问什么,我认为你正在寻找某种自适应学习率,就像你可能会看到应用于ANN中的梯度下降法,以及如果事情不是就停止的方法更长时间的改善。

基本思路是在保持整体过程稳定性的同时,如果没有看到abs误差的变化,就会慢慢减少扰乱值的量。如果你降低了你的学习率并且你仍然没有看到任何改善,那么你已经完成了(或至少在某种地方最低限度)。这个方法可能会慢一点,并且有不同的方法来计算我输入的变量(例如,sigErrChange),所以你必须稍微玩弄它。还有其他一些我无法想到的警告,但希望这可以得到一般的想法。

例如,

lR = 1.0
updatedLR = False # Have we updated the learning rate this iteration?
while abs(error) > 50 and ( sigErrChange or updatedLR ):
    sigErrChange = False # Has there been a significant improvement in the error? (Probably shouldn't just use a single iteration for this...)

    # Are we adding or subtracting 
    if C > T:
        sign = 1.
    else:
        sign = -1.

    # Should we update the learning rate?
    if (~sigErrChange)
        updatedLR = True
        lR = .95 * lR

    # Calculate our values
    c = c + sign*lR*.001

    C = calcC(c, C, T)
    T = calcT(c, C, T)

    error = C - T