0

我明白这里发生了什么,我只想在他进入无限循环之前如何捕捉我的程序的提示。这是我的代码:

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 的值。我怎样才能捕捉到这样一个无限循环。

4

2 回答 2

2

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

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

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

于 2013-09-25T21:22:52.093 回答
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
于 2013-09-25T21:50:18.123 回答