首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >范围中的nD "cube“

范围中的nD "cube“
EN

Stack Overflow用户
提问于 2021-01-22 23:26:25
回答 1查看 27关注 0票数 1

我有一个混合整数的问题。我需要最小化一个函数,它是一个加权最小二乘回归,权重取决于回归(迭代地重新加权最小二乘)。7个参数定义了我的分段回归。我需要在第一次猜测的时候找到一个局部最小值。

我试着用gekko写这个问题,但不知何故我发现它很难实现。经过多次尝试,我在“负自由度”处停了下来。

不管怎样,我决定强行解决这个问题。它是有效的,但速度很慢。我在7D中围绕我的工作点构建了一个立方体(itertools),并计算了3^7个点中每个点的加权平方误差。我对每个维度都有边界,有时我的工作点在我的7D域的其中一个面上。从技术上讲,我有2^p * 3^(7-p)点。我现在有了一个所有值的列表,找到最小值,将我的工作点移到那里并重新开始构建立方体,排除了我在前面的循环步骤中已经计算的所有点。

现在我想通过在我的工作点计算梯度来加速它,并且移动得更快(在我的循环中跳过一两步)。np.gradient需要7d阵列才能正常运行。

给定一个点,该点周围有7个范围,如何以一种有效的方式创建一个7D数组?如何用我的函数的值制作这个数组的图像?

请不要说7 for循环。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-23 00:18:19

无论您的函数是否矢量化,您都可以对np.indices使用如下方法:

代码语言:javascript
复制
base_grid = np.indices(7 * (3,), sparse=False) - 1

这将生成一个包含所需的所有-1, 0, 1组合的数组。np.meshgrid做了类似的事情,但是数组将被分成一个元组,这是不方便的。

在每次迭代中,使用您的步长(缩放)和偏移量修改网格:

代码语言:javascript
复制
current_grid = base_grid * scale + offset

如果你的函数是矢量化的,你可以直接调用它,网格是7个3x3x3x3x3x3x3数组。如果它接受七个输入,只需使用星形扩展。

如果您的函数没有矢量化,您仍然可以使用np.nditer在一个循环中单步执行相应的元素,而不是七个循环

代码语言:javascript
复制
with np.nditer([current_grid, None],
        op_axes=[list(range(1, current_grid.ndim)), None]) as it:
    for x, y in it:
        y[:] = f(*x)
    j = it.operands[1]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65847978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档