我理解这里发生了什么,我只是想知道在进入无限循环之前如何捕捉我的程序。这是我的代码:
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的值。每个循环。我怎么能抓住这样一个无限循环。
答案 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