生成(伪)随机高维函数的算法

时间:2015-05-21 10:20:56

标签: algorithm random

我不是指生成随机数的函数,而是生成random function 的算法

“高维”表示该函数是多变量的,例如, 100-Dim函数有100个不同的变量。

假设域为[0,1],我们需要生成函数f:[0,1] ^ n-> [0,1]。该函数是从某类函数中选择的,因此选择任何这些函数的概率是相同的。 (这类函数可以是全部连续的,也可以是K阶导数,无论哪种算法都方便。)

由于闭区间域上的函数不可数,我们只需要算法是伪随机的。

是否有多项式时间算法来解决这个问题?

我只是想在问题中添加一个可能的算法(但由于其指数时间复杂度而不可行)。该算法是由首先提出这个问题的朋友提出的:

该算法可简单描述如下。首先,我们假设维度d = 1。考虑区间上的平滑函数I = [a; B]。首先,我们分割域[a; b]成N个小间隔。对于每个区间Ii,我们生成一个生成在某些特定分布中的随机数fi(高斯分布或均匀分布)。最后,我们进行插值 系列(ai; fi),其中ai是Ii的特征点(例如,我们可以选择ai作为Ii的中间点)。插值后,我们得到一条平滑的曲线,可以看作是一个生活在函数空间Cm [a; b](其中m取决于我们选择的插值算法)。

这只是说算法不需要那么正式和严谨,而只是提供有用的东西。

2 个答案:

答案 0 :(得分:0)

所以,如果我做对了,你需要从向量中返回标量的函数;

我看到的最简单的方法是使用点积

  • 例如,让n成为您需要的维度
  • 所以创建包含范围a[n]
  • 中的随机系数的随机向量<0,1>
  • 并且所有系数的总和为1

    1. 创建float a[n]
    2. 用正随机数(无零)喂它
    3. 计算a[i]
    4. 的总和
    5. a[n]除以此总和
  • 现在功能y=f(x[n])只是

  • y=dot(a[n],x[n])=a[0]*x[0]+a[1]*x[1]+...+a[n-1]*x[n-1]
  • 如果我没有错过任何目标范围{@ 1}}
  • 如果<0,1>x==(0,0,0,..0)
  • 如果y=0;x==(1,1,1,..1)

如果你需要更复杂的东西,可以使用更高阶的多项式

  • 类似于y=1;
  • 的内容
  • 其中y=dot(a0[n],x[n])*dot(a1[n],x[n]^2)*dot(a2[n],x[n]^3)...表示x[n]^2

Booth接近导致功能相同&#34;方向&#34;

  • 如果任何(x[0]*x[0],x[1]*x[1],...)上升,那么x[i]也会上升
  • 如果您想要更改它,那么您还必须允许y
  • 的负值
  • 但要做到这一点,你需要添加一些偏移到a[]从负值转移......
  • 并且y规范化过程会更复杂
  • 因为你需要寻找最小值,最大值......
  • 更简单的选项是添加随机标记向量a[]以处理
  • m[n]会标记是否应使用m[i]代替1-x[i]
  • 这样以上所有内容都保持原样......
  • 您可以创建更多类型的映射,使其更具可变性

答案 1 :(得分:0)

这可能不仅很难,而且如果你真的希望能够生成每个连续的功能,那也是不可能的。

对于一维案例,您可以通过查看Faber-Schauder-System(另请参阅wiki)来创建有用的近似值。这为您提供了间隔连续函数的Schauder基础。如果包含基线矢量的无限线性组合,则此类基础仅涵盖整个矢量空间。因此,您可以通过在此基础上构建随机线性组合来创建一些随机函数,但通常您将无法通过这种方式创建实际由无限量的基础向量表示的函数。

编辑以响应您的更新:

似乎选择顺序为K的随机多项式函数(对于K次可微函数的类)可能就足够了,因为任何这些函数都可以近似(在给定点附近)一个那些(见taylor's theorem)。选择随机多项式函数很简单,因为您可以选择K个随机实数作为多项式的系数。 (请注意,这将不会返回类似于abs(x)的函数)