如何使用拉丁超立方体采样获得参数的分布,该参数使用 Python 具有不同尺度的边界?

How to get the distribution of a parameter using Latin Hypercube Sampling that has bounds in different scales using Python?

我有一个包含三个参数的方程式,即 abc。我通过将其与测量的行为进行比较来最小化该方程式的参数。为此,我正在尝试生成三维参数 space(即 abc)的拉丁超立方体采样,并希望使用不同的样本作为最小化的初始猜测。另外,我想分别为每个参数在范围 ((1e-15,1e-05), (1,5), (0,1)) 内生成这些样本。

我有以下生成缩放参数的代码space:

from scipy.stats import qmc
sampler = qmc.LatinHypercube(d=3)
sample = sampler.random(n=5)
print(sample)

生成以下 LHS:

>>> [[0.85448659 0.41801193 0.22357232]
 [0.00312924 0.18687008 0.65662771]
 [0.60861481 0.9413831  0.55522406]
 [0.56288569 0.38992472 0.93933801]
 [0.30978017 0.620607   0.19730746]]

现在,我使用 qmc.scale 将它们缩放为:

l_bounds = [1e-15, 1, 0]
u_bounds = [1e-05, 5, 1]
sample_scaled = qmc.scale(sample, l_bounds, u_bounds)
print(sample_scaled)

结果是:

>>> [[8.54486593e-06 2.67204771e+00 2.23572322e-01]
 [3.12923556e-08 1.74748031e+00 6.56627715e-01]
 [6.08614807e-06 4.76553238e+00 5.55224057e-01]
 [5.62885688e-06 2.55969886e+00 9.39338009e-01]
 [3.09780166e-06 3.48242798e+00 1.97307459e-01]]

问题出在 sample_scaled 的第一列。如果我们看一下,我们可以看到第一个参数在缩放情况下的分布在 1e-81e-6 范围之间。但是,我希望它分布在 1e-151e-05 之间(如上面的代码中所指定)。对于其他两个参数,缩放分布很好。

有人可以指出这里的错误或问题吗?并且可以指导我如何为这个特定场景正确生成分布?

注意区间 (1e-15-1e-8) 比区间 (1e-8-1e-5) 小大约 1000 倍。如果你想要跨越多个数量级的东西,你可能需要对数刻度。

import numpy as np
from scipy.stats import qmc
sampler = qmc.LatinHypercube(d=3)
sample = sampler.random(n=5)
l_bounds = [np.log(1e-15), 1, 0]
u_bounds = [np.log(1e-5), 5, 1]
sample_scaled = qmc.scale(sample, l_bounds, u_bounds)
sample_scaled[:,0] = np.exp(sample_scaled[:,0])