You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 18:12:34