【问题标题】:Efficient random sampling of constrained n-dimensional space约束 n 维空间的高效随机采样
【发布时间】:2011-04-28 13:32:06
【问题描述】:

我将优化由 n (n>=1,通常 n=4) 非负变量定义的问题。这不是一个 n 维问题,因为所有变量的总和必须为 1。

最直接的方法是让每个 x_i 扫描整个范围 0

冗余是什么意思?

以二维情况为例。如果没有约束,这将是一个需要优化两个变量的二维问题。但是,由于 X1 + X2 == 0 的要求,只需要优化一个变量,因为 X2 由 X1 决定,反之亦然。如果一个人决定独立扫描 X1 和 X2 并将它们归一化为 1 的总和,那么许多候选解决方案将与问题相同。例如 (X1==0.1, X2==0.1) 与 (X1==0.5, X2==0.5) 相同。

【问题讨论】:

  • 出于好奇:您在说什么“冗余”?我对这个领域不是很熟悉。
  • 您可能还可以在一个专门的 SE 网站上获得更多运气(关于统计信息的完全独立的网站,IIRC)
  • 很多有趣的词大多是不必要的,但完全缺少的是算法的目标。标题“受约束的 n 维空间的有效随机抽样”表示一个 n 维问题,然后在第一段中被驳斥。我不确定这些值的总和与问题空间的维度有何关系,也许您可​​以解释一下。
  • @Lazarus:约束 (sum == 1) 将空间缩减为 (n-1) 维子空间。但我必须承认,我也没有看到“冗余”。
  • @Henrik:我现在明白了,谢谢。

标签: algorithm language-agnostic genetic-algorithm


【解决方案1】:

如果您正在处理实值变量,那么获得 2 个相同的样本是不太可能的。但是,您确实存在样品不均匀的问题。你更可能选择 (0.5, 0.5) 而不是 (1.0, 0)。解决此问题的一种方法是二次采样。基本上你所做的是,当你沿着某个点缩小空间时,你会缩小选择它的概率。

所以基本上你所做的是将单位立方体内满足相同方向的所有点映射到单个点。这些相同方向的点形成一条线。线越长,您选择投影点的概率就越大。因此,您希望通过该线的长度的倒数来偏置选择一个点的概率。

这是可以做到的代码(假设您正在寻找 x_is 总和为 1):

while(true) {
      maximum = 0;
      norm = 0;
      sum = 0;
      for (i = 0; i < N; i++) {
         x[i] = random(0,1);
         maximum = max(x[i], max);
         sum += x[i];
         norm += x[i] * x[i];
      }
      norm = sqrt(norm);
      length_of_line = norm/maximum;
      sample_probability = 1/length_of_line;

      if (sum == 0 || random(0,1) > sample_probability) {
        continue;
      } else {
      for (i = 0; i < N; i++) {
         x[i] = x[i] /sum;
      } 
      return x;
    }

【讨论】:

    【解决方案2】:

    这里是 provided 之前由 Amit Prakash 翻译的同一个函数,翻译成 python

    import numpy as np
    
    def f(N):
        while(True):
            count += 1
            x = np.random.rand(N)
            mxm = np.max(x)
            theSum = np.sum(x)
            nrm = np.sqrt(np.sum(x * x))
            length_of_line = nrm / mxm
            sample_probability = 1 / length_of_line
            if theSum == 0 or rand() > sample_probability:
                continue
            else:
                x = x / theSum
            return x
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-01
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      相关资源
      最近更新 更多