概率分布导致'以退出代码137完成的过程(被信号9:SIGKILL中断)'

问题描述 投票:0回答:1

我正在为我的地质研究创建某种简化的概率分布计算器,例如Oracle Crystal Ball应用程序(顺便说一句,Python的新功能,刚刚开始使用)。

作为输入,应该使用六个P90(置信度的90%)和六个P10(置信度的10%)参数来创建概率分布。每个参数都有自己的从P90值到P10值的步长。输入到那里后,它将计算从P90到P10的所有可能情况,并为每个参数指定一个指示步骤。实际上,这听起来像笛卡尔积。

参数如下:总面积,层厚,孔隙率等

[从一些编码开始,使用过的网络,现在我有了一点东西,为我提供了分布,简单的统计数据和可视化图表。但是,我有两个问题,您可以在本主题的底部找到。

最后是代码:

最初为P90值(置信度为90%):

P90_area = float(input('P90 area: '))
P90_thickness = float(input('P90 thickness: '))
P90_porosity = float(input('P90 porosity: '))
P90_saturation = float(input('P90 saturation: '))
P90_pressure = float(input('P90 pressure: '))
P90_surface = float(input('P90 surface: '))

然后是P10值(置信度为10%):

P10_area = float(input('P10 area: '))
P10_thickness = float(input('P10 thickness: '))
P10_porosity = float(input('P10 porosity: '))
P10_saturation = float(input('P10 saturation: '))
P10_pressure = float(input('P10 pressure: '))
P10_surface = float(input('P10 surface: '))

使用特定步骤创建从P90到P10的值范围

area_values = np.arange(P90_area, P10_area + 0.01, 0.01)
thickness_values = np.arange(P90_thickness, P10_thickness + 0.1, 0.1)
porosity_values = np.arange(P90_porosity, P10_porosity + 0.01, 0.01)
saturation_range = np.arange(P90_saturation, P10_saturation + 0.01, 0.01)
pressure_range = np.arange(P90_pressure, P10_pressure + 1, 1)
surface_range = np.arange(P90_surface, P10_surface + 0.01, 0.01)

将所有列表合并到笛卡尔积中(即[(area1,厚度1,孔隙率1),(area1,厚度1,孔隙率2)等]):

list_of_tuples = list(itertools.product(area_values, thickness_values, porosity_values, saturation_range, pressure_range, surface_range)

将元组列表转换为列表列表:

list_of_lists = [list(elem) for elem in list_of_tuples]

创建具有多个值的列表并对其进行排序('np.prod'返回每个列表的乘积):

multiplied_values = []
for i in list_of_lists:
    i = np.prod(np.array(i))
    multiplied_values.append(i)
multiplied_values = sorted(multiplied_values)

舍入值:

rounded_values = [float(Decimal('%.2f' % elem)) for elem in multiplied_values]

创建一个计算所有相似/唯一对象的字典:

counts = Counter(rounded_values)

通过将值除以列表中元素的总数来计算概率:

probability_mass = {k: v/total for k, v in counts.items()}

有效,这里有简单的统计数据和特定情况的图表:

  • 总计计算:4899510
  • P90为:5.60
  • P10是:43.41
  • 最大概率值:15.24
  • 平均值:23.80

Figure. Probability distribution diagram

第一个问题很关键,因为它阻止了大数据堆栈的计算:

Q1。关键问题:

处理以退出代码137完成(被信号9:SIGKILL中断)。

[这在计算总量超过〜10MM和〜1分钟时发生(通过实验检查,因此数字是粗糙的。​​]

根据类似的主题,很可能我的脚本由于过多的CPU使用率而被操作系统杀死。我在运行代码时用'top'命令检查了CPU的负载,当CPU可以处理输入参数时,CPU的负载达到了100%,而在中断时,CPU的负载达到了110%。

规格:笔记本华硕G531GU | i7-9750H CPU 2.60GHz | GeForce GTX 1660 TI,6Gb | 16Gb DDR4 | Ubuntu 18 | PyCharm社区IDE。

问题:我有什么机会摆脱这种干扰,让脚本在必要时运行?我愿意等待所需的时间,以便为大型数据堆栈获取正确的分发。为每个参数增加一个步骤是一个硬性选择,我宁愿这样做。

Q2。概率分布图看起来不像经典的正态分布,而最大概率值和平均值之间的差异非常大。您怎么看,代码的逻辑可能有问题吗?

P.S。我了解此脚本看起来很坎bump,希望您的眼睛不会流血)

python ubuntu statistics cpu probability
1个回答
0
投票
稍有不同,我们可以尝试解决您的原始问题,而不是尝试修正您的代码?当您说“简化的概率分布计算器”时,您是什么意思?在尝试查看如何在Python中实现该过程之前,您可以用psuedo代码编写步骤以使我们理解该过程。]

根据您对上述问题的回答,我可能建议您采用抽样方法,而不是评估每种可能性。查找蒙特卡洛模拟。如果您有一个要使用新数据更新的先前发行版,并且想知道后验(最终)发行版,则考虑使用贝叶斯方法,特别是Winbugs(不是Python的贝叶斯程序的理想独立程序)。

PS。我知道我的答案可能更适合写为评论,但显然您需要+50的声誉,而我还没有呢:(

© www.soinside.com 2019 - 2024. All rights reserved.