【发布时间】:2024-04-25 08:40:02
【问题描述】:
使用 Matlab wblrnd 和 wblfit 函数以及 Python scipy.stats.weibull_min.fit 函数将数据拟合到 Weibull 分布,我发现 Matlab 的性能比 Python 高出近 2 个数量级。我正在寻求一些帮助来提高 Python 代码的性能。
问题:
在将 Matlab 代码转换为 Python 时,我遇到了以下代码:
weibull_parameters = zeros(10000, 2)
for i = 1:10000
data = sort(wblrnd(alpha, beta, 1, 24))
[weibull_parameters(i, :), ~] = wblfit(data, confidence_interval, censoring_array)
end
此代码从 Weibull 分布生成 24 个随机数,然后将生成的数据向量再次拟合到 Weibull 分布。
在 Python 中,我将其翻译为:
from scipy.stats import weibull_min
import numpy as np
data = np.sort(alpha * np.random.default_rng().weibull(beta, (10000, 24)))
weibull_parameters = np.zeros((10000, 2))
for idx, row in enumerate(data):
weibull_parameters[idx, :] = weibull_min.fit(row, floc=0)[2::-2]
在这里,我一次生成完整的随机数据,然后使用 weibull_min.fit 函数遍历行以获取相应的 Weibull 参数。最后的切片就是在输出中只选择尺度和形状参数,并按正确的顺序排列。
我遇到的主要问题是Python中的计算性能很糟糕。 Matlab 在几秒钟内运行此代码,但对于 Python,每 100 次迭代需要 1-1.5 秒(在我的笔记本电脑上),因此性能差异几乎是 2 个数量级。
有什么方法可以提高 Python 的性能吗?是否可以矢量化拟合计算?很遗憾,我在网上找不到关于此主题的任何内容。
注意 1:Matlab 允许用户在 wblfit 函数中指定置信区间,但是对于 Python,我找不到包含它的方法,所以我忽略了它。
注意 2:我能找到的唯一包含审查的选项是使用 surpyval package,但性能更加糟糕(每 100 次迭代大约需要 10 秒)
【问题讨论】:
标签: python matlab curve-fitting weibull scipy.stats