如何使用拉丁超立方体采样获得参数的分布,该参数使用 Python 具有不同尺度的边界?
How to get the distribution of a parameter using Latin Hypercube Sampling that has bounds in different scales using Python?
我有一个包含三个参数的方程式,即 a
、b
和 c
。我通过将其与测量的行为进行比较来最小化该方程式的参数。为此,我正在尝试生成三维参数 space(即 a
、b
和 c
)的拉丁超立方体采样,并希望使用不同的样本作为最小化的初始猜测。另外,我想分别为每个参数在范围 ((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-8
到 1e-6
范围之间。但是,我希望它分布在 1e-15
到 1e-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])
我有一个包含三个参数的方程式,即 a
、b
和 c
。我通过将其与测量的行为进行比较来最小化该方程式的参数。为此,我正在尝试生成三维参数 space(即 a
、b
和 c
)的拉丁超立方体采样,并希望使用不同的样本作为最小化的初始猜测。另外,我想分别为每个参数在范围 ((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-8
到 1e-6
范围之间。但是,我希望它分布在 1e-15
到 1e-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])