使用约束扩展网格(或电源集)

Posted

技术标签:

【中文标题】使用约束扩展网格(或电源集)【英文标题】:Expand grid (or power set) with constraints 【发布时间】:2018-05-26 00:35:50 【问题描述】:

这个问题可能太笼统了,但我觉得它在我的工作中一次又一次地出现,因此可能会引起其他人的兴趣。

假设我想创建一个基于扩展网格的数据表(或矩阵)。

 library(data.table)
 Vmat1 = data.table(expand.grid(c(list(d = 1:5, w = 1:(3)))))

但是,假设如果我这样做,这将导致真实功率集的内存错误。但是,我想施加一些限制,例如:

如果w>1,那么它一定是d

这会给出较小的最终集,不会导致内存错误:

Vmat1[w>1 & d<3 | w==1]
   d w
1: 1 1
2: 2 1
3: 3 1
4: 4 1
5: 5 1
6: 1 2
7: 2 2
8: 1 3
9: 2 3

我的问题是,是否可以在创建网格时预先施加限制?构建完整的电源组然后调节和减少的成本太高。

【问题讨论】:

为 expand.grid 拆分成组? ***.com/q/50400696/3358272 的可能重复项。 (实际上是一回事……懒惰地扩展网格,例如 python2 的xrange),带有约束。) 【参考方案1】:

如果你关心的是记忆,你可以按照@chinsoon 的建议分成几组。

# Filter Method
V = CJ(d = 1:5, w = 1:3) # same as data.table(expand.grid(c(list(d = 1:5, w = 1:(3))))) except ordering
a <- V[w>1 & d<3 | w==1]

# Sets Method
d <- 1:5
w <- 1:3
b <- rbindlist(list(
      CJ(d = d[d < 3], w = w[w > 1]) 
    , CJ(d = d, w = w[w == 1])))

all(a == b[order(d, w)])

# [1] TRUE

【讨论】:

如果您有一个将列相互关联的条件怎么办?例如,另外假设,最后必须始终为真,d+w CJ 也可以与列表一起使用吗?假设我有一个列表,其中包含 d 和 w 的可能向量作为单独的元素。如果我有很多变量或不想对其进行硬编码,这很有用 您可以使用do.call(CJ, listname) 将列表元素作为参数传递给CJ(或其他函数)。对于更复杂的约束,您需要使用 r2evans 的功能(或类似功能)

以上是关于使用约束扩展网格(或电源集)的主要内容,如果未能解决你的问题,请参考以下文章

管道和网格搜索的 SKLearn 错误

DoJo 增强的网格动态更新约束不起作用

iOS:使用约束动画 UICollectionView 垂直扩展?

iOS 对等宽/高按钮网格的约束导致位置和大小发生变化

如何将按钮或图像添加到道场网格

调参-网格搜索(Grid Search)