如何让Scipy最小二乘法输出0-100范围内的正整数解?
解决带整数约束的权重最小二乘问题
scipy.optimize.lsq_linear仅支持连续变量的线性最小二乘求解,无法直接施加整数约束。要实现目标向量(权重[i,j,k])为0~100之间的正整数,需要换用支持整数约束的优化方法,以下是两种可行方案:
方案一:用SciPy的启发式优化方法(differential_evolution)
differential_evolution是基于进化算法的启发式求解器,支持直接指定整数变量,适合这类非凸的整数优化场景:
import numpy as np from scipy.optimize import differential_evolution # 已知参数示例 x = [1.2, 3.4, 5.6] # 对应问题中的[x,y,z] expected = 100.0 # 预期值 # 定义目标函数:最小化残差平方 def objective(w): actual = np.dot(x, w) return (expected - actual) ** 2 # 每个权重的取值范围:0到100 bounds = [(0, 100)] * 3 # 指定所有3个变量为整数,求解 result = differential_evolution(objective, bounds, integers=[0, 1, 2]) print("最优整数权重:", result.x.astype(int)) print("最小残差平方:", result.fun)
方案二:用专门的整数规划库(CVXPY)
CVXPY是凸优化建模库,支持整数变量约束,求解逻辑更严谨:
import cvxpy as cp import numpy as np # 已知参数示例 x = np.array([1.2, 3.4, 5.6]) expected = 100.0 # 定义整数变量权重 w = cp.Variable(3, integer=True) # 目标:最小化残差平方 objective = cp.Minimize((expected - x @ w) ** 2) # 约束:权重在0~100之间 constraints = [0 <= w, w <= 100] # 求解问题 prob = cp.Problem(objective, constraints) prob.solve() print("最优整数权重:", w.value.round().astype(int)) print("最小残差平方:", prob.value)
注意事项
- 由于整数约束会将问题变为整数最小二乘,属于NP难问题,无法保证找到全局最优解(尤其是变量维度较高时),你提到的"非最优解"是这类问题的正常现象。
- 启发式方法的求解结果可能受初始参数影响,可通过调整
differential_evolution的popsize、maxiter等参数提升求解稳定性。
内容的提问来源于stack exchange,提问作者azazelspeaks
相关产品推荐
相关产品推荐

