“索引错误:尝试使用scipy.optimize.minimize时数组”“得索引太多

pzfprimi  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(176)

我想使用Scipy最小化函数来寻找最优值,以实现最小误差函数。我使用了scipy.optimize.minimize,它要求我指定橡胶和下限以及任何要传递给最小化函数的约束。我想添加一个不等式约束,如A*x < b,所以下面是我的代码:

from scipy.optimize import minimize, LinearConstraint
import numpy as np

def error_func(theta):
  return theta[0] - theta[1]

theta0 = [100, 0]
A = np.array([[1, 0], [0, 1]])
b = np.array([[100], [0]])
bnds = ((0, 100), (0, 0))

constraint = LinearConstraint(A, lb=-np.inf, ub=b)
theta = minimize(error_func, theta0, method='trust-constr',constraints=constraint, bounds=bnds, options={'maxiter': 500})

但是,当我运行代码时,我在优化函数行上收到以下错误:

/usr/local/lib/python3.7/dist-packages/scipy/optimize/_constraints.py in __init__(self, constraint, x0, sparse_jacobian, finite_diff_bounds)
    259         mask = keep_feasible & (lb != ub)
    260         f0 = fun.f
--> 261         if np.any(f0[mask] < lb[mask]) or np.any(f0[mask] > ub[mask]):
    262             raise ValueError("`x0` is infeasible with respect to some "
    263                              "inequality constraint with `keep_feasible` "

IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed

所以,有人能解释一下为什么我会收到这样的错误吗?我在这里做错了什么?

5f0d552i

5f0d552i1#

我刚刚算出了解。我添加的约束将找到一个解,使得A*x <= b。因此,将在A*x和b之间进行比较。比较的输出为形(二、二)(我不明白为什么虽然矩阵乘法的形状是(2,1),B也是).长话短说,最小化函数期望约束比较的返回是包含与I定义的初始θ相同的两个值的列表。因此,我需要修改我的约束函数,使它返回与初始theta相同的形状。

from scipy.optimize import minimize, NonlinearConstraint
import numpy as np

def error_func(theta):
  return theta[0] - theta[1]

theta0 = [100, 0]
A = np.array([[1, 0], [0, 1]])
b = [100, 0]
bnds = ((0, 100), (0, 0))
func = lambda x: A.dot(x).tolist()
constraint = NonlinearConstraint(func, -np.inf, b)
theta = minimize(error_func, theta0, method='trust-constr',constraints=constraint, bounds=bnds, options={'maxiter': 500})

相关问题