了解拉丁超立方原理建议去youtube搜视频,最多就5min,讲得很通俗易懂,看了很多文章长篇大论duck不必,搞懂后原来只是一个简单抽样规则而已。
- 自己写代码
def _domain_lhs_sample(n_domain):
# 域内取点
result=np.empty([n_domain,2],dtype=float)# 生成一个指定维度的数组,还可以定义类型
result.fill(0)#全赋初值为0
# result=[[0]*D]*N 方法二
temp=np.empty([n_domain])
d=1/n_domain
for i in range(2):
for j in range(n_domain):
temp[j]=np.random.uniform(low=j*d, high=(j+1)*d,size=1)[0]# 从1*1的面积中取得点,后面需要扩大为相应尺度
np.random.shuffle(temp)
for j in range(n_domain):
result[j,i]=temp[j]
b = np.array([-0.5,0.5,-0.5,0.5])
lower_bounds = b[0]
upper_bounds = b[1]
if np.any(lower_bounds > upper_bounds):
print('范围出错')
return None
np.add(np.multiply(result,
(upper_bounds - lower_bounds),
out=result),
lower_bounds,
out=result)
# D参数个数,bounds 参数对应范围,N,拉丁超立方层数
return result
- 调库
pyDOE
from pyDOE import lhs
lb=np.array([x_min,y_min])
ub=np.array([x_max.y_max])
point=lb+(ub-lb)*lhs(2,2000)