问题描述
即
position,veLocity,mass,length,width
现在每个参数都有一个关联的上限和下限:
position = [0,100]
veLocity = [10,300]
mass = [50,200]
length = [2,10]
width = [2,10]
数据点由这些参数的特定组合定义: 即
data_point = [10,250,50,4,2]
现在,问题是:是否有一个 python 包/算法,以便我可以初始化一定数量的数据点(即 5 个),以便这些数据点最佳地分布在参数空间中。
旁注:
是的,我知道“最佳传播”没有明确定义,但我真的不确定如何去这里。一种可能的定义是:
编辑:
使用 linspace 是一个非常好的主意。但是,我很快注意到我的数据存在问题。我实际上忘了谈论约束:
某些数据点是不可能的。即
constraints = [lenght*2-width,position-veLocity]
...如果这些值大于或等于零,则可以认为数据点是可行的。
所以我的问题是:我怎样才能以巧妙的方式包含约束?
使用 linspace,您将看到速度始终大于位置,因此我们将无法获得可行的数据点。
position = [0,10]
# Find Samples
start = [s[0] for s in [position,width]]
end = [s[1] for s in [position,width]]
num_samples = 5
samples = np.linspace(start,end,num_samples)
print(samples)
这是输出:
[[ 0. 10. 50. 2. 2. ]
[ 25. 82.5 87.5 4. 4. ]
[ 50. 155. 125. 6. 6. ]
[ 75. 227.5 162.5 8. 8. ]
[100. 300. 200. 10. 10. ]]
现在,让我们检查约束:
def check_constraint(samples,constraints):
checked_samples = []
for dimensions in samples:
position,width = dimensions
# Here I am checking the constraints:
if any([i<0 for i in [length*2-width,position-veLocity]]):
pass
else:
checked_samples.append(dimensions)
return checked_samples
samples_checked = check_onstraint(samples,constraints)
print(samples_checked)
这些将是检查约束后留下的样本:
[]
解决方法
你可以做这样的事情来获得均匀的网格点:
import numpy as np
...
start = [s[0] for s in [position,velocity,...]]
end = [s[1] for s in [position,...]]
num_samples = 5
samples = np.linspace(start,end,num_samples)
这将返回在整个参数空间中均匀分布的点。
编辑 要包含更多约束,最好执行以下操作:
start = ...
end = ...
num_results = 5
results = []
while len(results) < num_results:
sample = np.random.uniform(start,end)
if is_valid(sample):
results.append(sample)
这样您就可以定义 is_valid
函数并检查您想要的任何条件!结果点应该均匀分布在参数空间周围。