nD "cube" 来自范围
nD "cube" from ranges
我有一个混合整数问题。我需要最小化一个函数,这是一个加权最小二乘回归,权重取决于回归(迭代重新加权最小二乘)。 7 个参数定义了我的分段回归。我需要在第一次猜测时找到局部最小值。
我试着把这个问题写在gekko中,但不知何故我发现它很难实现。经过多次尝试,我停在了“负景深”。
无论如何,我决定暴力破解这个问题。它有效,但速度很慢。我在 7D 中围绕我的工作点构建了一个立方体 (itertools),并计算了每个 3^7 点的加权平方误差。我对每个维度都有边界,有时我的工作点在我的 7D 域的其中一个面上。从技术上讲,我有 2^p * 3^(7-p) 点。我现在有了所有值的列表,找到最小值,将我的工作点移到那里并重新开始构建立方体,排除我在前面的循环步骤中已经计算的所有点。
现在我想通过计算我工作点的梯度来加速它并移动得更快(在我的循环中跳过一两步)。 np.gradient 需要 7 维数组才能正确执行。
给定一个点,以及围绕该点的 7 个范围,如何高效地制作一个 7 维数组?如何使用我的函数值制作此数组的图像?
请不要说7个for循环。
无论您的函数是否向量化,您都可以使用 np.indices
这样的方法:
base_grid = np.indices(7 * (3,), sparse=False) - 1
这将生成您需要的 -1, 0, 1
所有组合的数组。 np.meshgrid
做了类似的事情,但是数组会被分成一个元组,这很不方便。
在每次迭代中,您使用步长(比例)和偏移量修改网格:
current_grid = base_grid * scale + offset
如果你的函数是向量化的,你直接调用,网格是7个3x3x3x3x3x3x3的数组。如果它接受七个输入,就用星形展开。
如果您的函数未向量化,您仍然可以在单个循环中逐步执行相应的元素,而不是七个循环,使用 np.nditer
:
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]
我有一个混合整数问题。我需要最小化一个函数,这是一个加权最小二乘回归,权重取决于回归(迭代重新加权最小二乘)。 7 个参数定义了我的分段回归。我需要在第一次猜测时找到局部最小值。
我试着把这个问题写在gekko中,但不知何故我发现它很难实现。经过多次尝试,我停在了“负景深”。
无论如何,我决定暴力破解这个问题。它有效,但速度很慢。我在 7D 中围绕我的工作点构建了一个立方体 (itertools),并计算了每个 3^7 点的加权平方误差。我对每个维度都有边界,有时我的工作点在我的 7D 域的其中一个面上。从技术上讲,我有 2^p * 3^(7-p) 点。我现在有了所有值的列表,找到最小值,将我的工作点移到那里并重新开始构建立方体,排除我在前面的循环步骤中已经计算的所有点。
现在我想通过计算我工作点的梯度来加速它并移动得更快(在我的循环中跳过一两步)。 np.gradient 需要 7 维数组才能正确执行。
给定一个点,以及围绕该点的 7 个范围,如何高效地制作一个 7 维数组?如何使用我的函数值制作此数组的图像?
请不要说7个for循环。
无论您的函数是否向量化,您都可以使用 np.indices
这样的方法:
base_grid = np.indices(7 * (3,), sparse=False) - 1
这将生成您需要的 -1, 0, 1
所有组合的数组。 np.meshgrid
做了类似的事情,但是数组会被分成一个元组,这很不方便。
在每次迭代中,您使用步长(比例)和偏移量修改网格:
current_grid = base_grid * scale + offset
如果你的函数是向量化的,你直接调用,网格是7个3x3x3x3x3x3x3的数组。如果它接受七个输入,就用星形展开。
如果您的函数未向量化,您仍然可以在单个循环中逐步执行相应的元素,而不是七个循环,使用 np.nditer
:
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]