我想使用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
所以,有人能解释一下为什么我会收到这样的错误吗?我在这里做错了什么?
1条答案
按热度按时间5f0d552i1#
我刚刚算出了解。我添加的约束将找到一个解,使得
A*x <= b
。因此,将在A*x和b之间进行比较。比较的输出为形(二、二)(我不明白为什么虽然矩阵乘法的形状是(2,1),B也是).长话短说,最小化函数期望约束比较的返回是包含与I定义的初始θ相同的两个值的列表。因此,我需要修改我的约束函数,使它返回与初始theta相同的形状。