如何防止NumPy标准差在极值计算中抛出错误?

2024-09-30 01:25:44 发布

您现在位置:Python中文网/ 问答频道 /正文

免责声明:这可能是一个很难回答的问题,但我将非常感谢任何见解,想法或建议。如果这已经在别处得到了回答,而我只是没有找到它,请告诉我。另外,我对一般的算法工程有些陌生,特别是使用Python/NumPy来实现和评估非平凡的算法原型,并在运行过程中对其进行全面了解。我可能遗漏了一些科学计算的基础知识。你知道吗

主持人:如果有更好的论坛,请随意移动这个帖子。我不确定这是否完全符合计算科学论坛的要求,因为它可能归结为一个实现/编码问题。你知道吗

注意:如果您想了解问题和背景,请阅读所有内容。你知道吗

我使用NumPy的std()函数来计算一个算法实现中的标准差,这个算法在图中找到节点的最佳组合,松散地基于minspan树。选择函数包含对std()的调用。这是一个早期的单线程的算法原型;该算法最初是为多线程设计的(它可能会在C或C++中实现,所以这里不相关)。你知道吗

边权重取决于先前选择的节点的属性,因此在算法检查可用节点时计算边权重。这个图可能包含几千个节点。在这个阶段,搜索是彻底的,可能需要几十万次计算。你知道吗

此外,算法的评估是自动化的,可能会根据用户的输入运行数百个连续的试验。我没有看到在搜索较小的图(例如100个节点)时出现错误(如下),但是将图的大小缩放到接近1000可以保证它们出现。你知道吗

相关代码大致可以简化为以下内容:

# graph.available = [{'id': (int), 'dims': {'dim1': (int), ...}}, ...]
# accumulatedDistr = {'dim1': (int), ...}
# Note: dicts as nodes, etc used here for readability
edges = []
for node in graph.available:
    intersection = my.intersect(node['distr'], accumulatedDistr) # Returns list
    edgeW = numpy.std(intersection)
    edges.append((node['id'], edgeW))
# Perform comparisons, select and combine into accumulatedDistr

分布保证包含非负、非零整数值和从我的交集()也同样保证永远不会为空。你知道吗

当我运行一系列试验时,我偶尔会在终端中看到以下消息:

C:\Program Files\Python36\lib\site-packages\numpy\core\_methods.py:135: RuntimeWarning: Degrees of freedom <= 0 for slice
  keepdims=keepdims)
C:\Program Files\Python36\lib\site-packages\numpy\core\_methods.py:105: RuntimeWarning: invalid value encountered in true_divide
  arrmean, rcount, out=arrmean, casting='unsafe', subok=False)
C:\Program Files\Python36\lib\site-packages\numpy\core\_methods.py:127: RuntimeWarning: invalid value encountered in double_scalars
  ret = ret.dtype.type(ret / rcount)

它们通常只在一组试验中出现几次,所以很可能每几百万次计算。然而,一个错误的计算可以(至少!)微妙地改变整个试验的结果,所以如果可能的话,我还是想阻止这种情况的发生。我假设一定有一些内部状态在累积错误,但我发现很少有人建议我如何解决这个问题。这让我非常担心,因为误差的累积使我怀疑下面的所有计算,如果真是这样的话。你知道吗

我想我可能需要寻找一个专有库(例如,英特尔内核数学库的Python包装器)来保证我想要的那种极端体积(请原谅滥用术语)的计算稳定性。但首先:有没有一种方法可以预防它们(NumPy)?另外,以防万一:问题有我担心的那么严重吗?你知道吗


Tags: innumpy算法nodefor节点lib错误
1条回答
网友
1楼 · 发布于 2024-09-30 01:25:44

我已经确认这确实是我自己代码中的一个bug,尽管在测试中从未发现它。当然,根据证据,我不得不连续进行几百万次左右的随机输入测试。仔细想想,作为代码关键部分的一般实践,这可能不是一个坏主意,尽管需要花费大量的时间。与其在受影响的代码周围构建一个完整的库,不如尽早捕获它。吸取的教训。你知道吗

感谢布伦巴恩让我走上正轨!我在过去曾遇到过一些开源库,确实有一些罕见的、难以命中的bug。我松了口气,努比不是他们中的一员。至少这次不是。尽管如此,我认为对于含糊不清、毫无帮助的错误信息还是有抱怨的余地的。欢迎来到NumPy,我想。你知道吗

所以,回答我自己的问题:努比不是问题。np.std()非常稳定。希望我在这里的经验能帮助其他人排除那些不是导致代码崩溃的原因。你知道吗

相关问题 更多 >

    热门问题