可以限制 skopt.Lhs.generate 的结果吗?

Posted

技术标签:

【中文标题】可以限制 skopt.Lhs.generate 的结果吗?【英文标题】:Can one constrain the outcome of skopt.Lhs.generate? 【发布时间】:2021-05-10 23:00:52 【问题描述】:

假设我有一个这样的数组:

from skopt.space import Space
from skopt.sampler import Lhs
import numpy as np

np.random.seed(42)

rows = 5
cols = 3

dummy = np.zeros((rows, cols))

array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])

我现在想用skopt.Lhs.generate1 填充这个数组的某些位置,我想排除存储在ignore 中的某些位置:

ignore = np.array([
    [3, 1],
    [4, 1]
])

我怎样才能做到最好?

我可以的

space = Space([(0, rows - 1), (0, cols - 1)])

lhs = Lhs(criterion="maximin", iterations=1000)
lh = np.array(lhs.generate(space.dimensions, 3))

dummy[lh[:, 0], lh[:, 1]] = 1

给了

array([[0., 0., 1.],
       [1., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 1., 0.]])

但可以看到4, 1 的位置已被占用,但它不应该。

一种方法是将lhs.generate 调用放在while 循环中,然后始终检查ignore 中是否有任何元素,但我想知道是否有更直接的解决方案。

【问题讨论】:

skopt.sampler.Lhs 似乎不支持任何类型的约束。我认为最好的办法是采取source code of lhs并通过添加限制来修改它。 @fdermishin:这将是一个选项,但我想我最好选择这样的while 循环,如我的答案所示。只是想知道是否有比这更聪明的东西(我还检查了pyDOE,但它似乎不适用于离散值)。 【参考方案1】:

为了完整起见,使用while 循环的解决方案可能如下所示:

from skopt.space import Space
from skopt.sampler import Lhs
import numpy as np

def contains_element(a, b):
    return any(li in a for li in b)

np.random.seed(42)

rows = 5
cols = 3

dummy = np.zeros((rows, cols))

ignore = [
    [3, 1],
    [4, 1]
]

space = Space([(0, rows - 1), (0, cols - 1)])

contains_row = True
while contains_row:

    lhs = Lhs(criterion="maximin", iterations=1000)
    lh = lhs.generate(space.dimensions, 3)
    contains_row = contains_element(lh, ignore)
    print(lh)
    print(contains_row)
    print('-----------------------\n')

lh = np.array(lh)
dummy[lh[:, 0], lh[:, 1]] = 1

print(dummy)

打印出来的

[[2, 0], [0, 2], [4, 1]]
True
-----------------------

[[2, 0], [1, 2], [4, 1]]
True
-----------------------

[[4, 2], [0, 1], [2, 0]]
False
-----------------------

[[0. 1. 0.]
 [0. 0. 0.]
 [1. 0. 0.]
 [0. 0. 0.]
 [0. 0. 1.]]

因此,这里需要 3 次迭代,直到找到不在 ignore 中的位置。如果有人知道更简单的解决方案,请告诉我!

【讨论】:

以上是关于可以限制 skopt.Lhs.generate 的结果吗?的主要内容,如果未能解决你的问题,请参考以下文章

Post 提交,参数长度有限制吗

是否可以将 mongoDB 中的更新查询限制为特定限制?

各位,activemq可以限制客户端连接数吗

有人可以解释一下 MongoDB 中文档的大小限制吗?它说每个文档有 16MB 的限制,但这是啥意思?

这是不是可以获得具有偏移限制的总行数

Docker: 限制容器可用的内存