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

CVXPY中Variable作numpy索引触发IndexError的建模问题

问题原因

你遇到的报错核心是CVXPY的优化变量不能作为numpy数组的切片索引:y_pred >= cut返回的是CVXPY约束对象,不是numpy布尔数组,无法给revenue/roi这类numpy数组做动态筛选。
除此之外原始建模还有两处不符合CVXPY语法规则的问题:

  • cp.sum_largest的第二个参数必须是固定正整数,不能传入优化变量n
  • 动态筛选集合的求和、求均值逻辑,无法通过运行时切片实现,需要用大M法引入二进制指示变量重构筛选逻辑。
正确建模思路

针对LTV阈值筛选的场景,引入长度为客户总数的二进制优化变量z,z[i] = 1代表第i个客户通过cut阈值被选中,z[i] = 0代表未被选中,把所有动态筛选逻辑转化为线性约束:

  1. 阈值准入约束:如果客户被选中(z[i]=1),必须满足预测LTVy_pred[i] >= cut,用大M法写为y_pred[i] + M*(1 - z[i]) >= cut,其中M取大于y_pred最大值减最小值的常数即可,保证z[i]=0时约束恒成立。
  2. ROI约束:所有被选中客户的平均ROI不低于1.1,等价于总ROI贡献≥1.1*选中客户数,即cp.sum(cp.multiply(z, roi)) >= 1.1 * cp.sum(z),避免动态切片求均值。
  3. 目标函数:业务场景中通常触达客户数由预算决定为固定值k,目标就是最大化选中客户的收入总和,等价于原逻辑中过线客户top k的收入和最大化。如果需要把选中人数n作为优化变量,补充成本、预算类约束即可。
修正后可运行代码
import cvxpy as cp
import numpy as np
import scipy.stats as st

# 模拟数据
t = 100
np.random.seed(1)
y_pred = st.norm.rvs(1, 0.5, size=t)
roi = st.norm.rvs(1, 0.5, size=t)
revenue = st.halfnorm.rvs(0, 0.5, size=t)

# 超参数:固定选中客户数,可根据业务调整
select_k = 20
# 大M常数,取足够大的值保证约束逻辑正确
M = y_pred.max() - y_pred.min() + 1

# 优化变量
cut = cp.Variable(1)
z = cp.Variable(t, boolean=True)  # 二进制选择变量

# 约束
constraints = [
    cp.sum(z) == select_k,  # 固定选select_k个客户
    # 阈值准入约束:z[i]=1时必须满足y_pred[i] >= cut
    y_pred + M * (1 - z) >= cut,
    # 平均ROI >=1.1 约束
    cp.sum(cp.multiply(z, roi)) >= 1.1 * cp.sum(z)
]

# 目标:最大化选中客户的总收入
objective = cp.Maximize(cp.sum(cp.multiply(z, revenue)))
prob = cp.Problem(objective, constraints)

# 求解,用支持混合整数规划的开源求解器CBC
result = prob.solve(solver=cp.CBC)

# 业务落地用实际入选客户的最小预测LTV作为cut,避免数值精度误差
selected_mask = z.value > 0.5
actual_cut = y_pred[selected_mask].min()
print(f"最优截止阈值cut: {actual_cut:.4f}")
print(f"选中客户总收入: {result:.4f}")
print(f"选中客户平均ROI: {roi[selected_mask].mean():.4f}")
说明
  • 如果不需要固定选中人数,可以把cp.sum(z) == select_k约束替换为业务约束(比如总成本上限、触达量上下限等),目标保持最大化总收入即可。
  • 求解需要安装支持混合整数规划的求解器,开源选项CBC可通过pip install cbcpy安装,也可替换为GLPK、Gurobi等其他求解器。
  • 求解得到的selected_mask中值为True的索引就是最终选中的客户,直接取这些客户的最小y_pred作为落地阈值即可,不需要额外优化cut的取值。

内容的提问来源于stack exchange,提问作者Mithril

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:09:21