想象一下,在给定浮点x和y坐标(以及符合维数的其他组件)的情况下,有一个函数可以评估曲面的高程:
double ComputeElevation(double x, double y, ...., double z) { }
这不是分析函数,因此无法计算导数。我需要做的是找到任何给定{x,y}对的表面最陡的方向。单次评估可能非常昂贵(在最坏的情况下,可以考虑几秒甚至几分钟)。
我在2D情况下的典型方法是在与{x,y}相邻的N个位置对样本进行采样,然后在这些样本中拟合曲线并在曲线中搜索最高点,因为此搜索不会受到影响昂贵的评价:
在上面的图像中,P0是给定的坐标。 {S0,S1,S2,S3}是围绕P0的4个随机放置的样本,PM是曲线上的最高点。因此,矢量PM-P0是最陡上升的方向。
但我不知道如何将其扩展到N维度,或者是否有更多更智能的算法来实现这一目标。
维度的数量可能非常大(几十到几百),因此无论采用何种方法,我最终使用的方法都必须在样本数量少于维度时使用。我不是在寻找确切的答案,这是不可能的,但是中途的正常近似已经非常受欢迎。
PS。我在C#中这样做,并不是很重要,但我无法访问非C#语言功能。
答案 0 :(得分:2)
看起来您正在尝试估算给定点附近的一组随机样本的渐变。
很遗憾,如果您有n
维度,则需要至少n+1
个点才能正确估算渐变。如果点数较少,则尺寸需要退出,并且您将估计渐变的较低尺寸投影。也就是说,如果您捕获k
维,则可能是您的项目将获得真实渐变长度的sqrt(k/n)
。
这是一种方法。假设您在点周围有k+1
个随机点,并进一步假设它们是线性无关的。选择其中一个作为“原点”,然后您将拥有k
维度。找到另外n-k
个与之前所有点正交的点,并输入原点的值。 (这将导致这些尺寸不在渐变中表示。)
现在你有n
个向量和每个渐变的点积的估计值。取每个标准单位向量,并将其写为向量的线性组合。斜率的相同线性组合将为您提供梯度的该分量的估计。对所有单位向量执行此操作,将它们添加到一起,瞧,您可以估计渐变。
请注意,如果你试图使用一些近点和一些远点,其中一些不是线性独立的,那么这种方法将不起作用,你需要做一些更复杂的事情。
答案 1 :(得分:0)
我不完全清楚为什么计算曲线比随机采样点便宜,但这让我想起了http://en.wikipedia.org/wiki/Gradient_descent。您可以将问题视为尝试优化当前位置与新点之间的高程差异。它可能比尝试随机点更快,并且很容易推广到多维度
由于函数可能非单调递增,因此您可能希望将其定义为与边界的关系(在起始点的x个单位内)。