ELAI S.r.l.

库存与 AI:为何最准的预测可能给出错误订货量

从非对称损失到最优分位数:离散实例、成本、容量约束及销量截尾造成的偏差。

库存与 AI:为何最准的预测可能给出错误订货量

摘要:预测均值与选择数量是不同问题

最小化平方误差的网络即使完美估计平均需求,也可能给出经济上不佳的订货量。问题未必出在模型:缺货与过量的成本不同。合成实例中,MSE 最优均值为 78 单位,期望成本 190 欧元;经济相关分位数选择 200 单位,成本 122 欧元,尽管 MSE 显著更差。本文推导决策阈值、比较方案,并说明库存限制销量如何扭曲训练目标。

背景为易腐商品单周期补货,无中途补货、替代或固定成本。数量按单位计,成本为欧元/单位,需求非负。全部数字均为明确假设并用 Python 计算,不是 EL-AI 已实现节省。需要期望、累积分布和凸函数基础。结果针对特定决策模型,并非完整库存策略。

1. 先明确损失,再选择模型

设 D 为需求、Q 为可用数量,单位缺货成本 c_u、过量成本 c_o。损失为 c_u(D−Q)_+ + c_o(Q−D)_+,其中 z_+=max(z,0)。它们是增量成本,可包含损失利润与剩余商品净成本;已包含在系数中的采购或收入不能再次相加。本文直接设 c_u=9、c_o=1,最小化期望损失。

L(Q,D)=c_u·max(D−Q,0)+c_o·max(Q−D,0) R(Q)=E[L(Q,D)] τ=c_u/(c_u+c_o)

连续需求下,略增 Q:D<Q 时新增成本 c_o,D>Q 时节省 c_u。风险导数为 (c_u+c_o)F(Q)−c_u,在 F(Q)=τ 为零。离散需求跳点可能不可导,正确条件为 F(Q−)≤τ≤F(Q)。达到 τ 的最小分位数是最优解;若 CDF 在 τ 处平坦,可能有多个最优解。不需假设正态需求。

2. 可完全计算的离散实例

设 P(D=40)=0.50、P(D=80)=0.35、P(D=200)=0.15,均值为 78。CDF 在 40 为 0.50、80 为 0.85,因此 0.90 分位数是 200。订 80 时,期望过量 0.50·40=20,缺货 0.15·120=18,成本 20+9·18=182。订 200 无缺货,但期望过量 0.50·160+0.35·120=122。比较的是指定成本,不只是剩余数量。

Q成本 EURMSE 单位²平均缺货
40342.04400.038.0
78190.02956.019.0
80182.02960.018.0
120162.04720.012.0
200122.017840.00.0

脚本枚举 Q=0 至 240,验证 MSE 在 78 最小、成本在 200 最小。还检查每个整数差分 R(Q+1)−R(Q)=10F(Q)−9。Q 从 80 到 199,差分为 −0.5 欧元,每增一单位都降低期望成本;从 200 起为 +1 欧元。这项独立于最小值搜索的核验展示凸性及最优点成因。

同一合成分布上的期望损失。成本与 MSE 最优点不同,是因为目标不同;曲线不代表训练模型性能。
同一合成分布上的期望损失。成本与 MSE 最优点不同,是因为目标不同;曲线不代表训练模型性能。

3. 将分位数连接到 AI 目标

Pinball loss ρ_τ(D−Q) 对低估赋权 τ、高估赋权 1−τ,经济损失恰为 (c_u+c_o)ρ_τ(D−Q)。在数据、表示和优化允许时,条件模型可用此损失学习相关分位数。只换架构而保留 MSE,仍然以条件均值为目标。本例 MAE 也无法选择:40 至 80 的所有 Q 都有 MAE=38,但经济成本不同。

ρ_τ(z)=τ·max(z,0)+(1−τ)·max(−z,0) L(Q,D)=(c_u+c_o)·ρ_τ(D−Q)

若缺货成本降至 4、c_o=1,则 τ=0.80,最小最优解为 80;成本相同则 τ=0.50,整个 [40,80] 都最优。原始成本下,若容量最多 120,受约束最优量为 120、成本 162 欧元,不能忽视容量订 200。存在批量、跨产品共享预算或固定成本时,各商品独立分位数未必解决整体问题。

4. 服务水平与不可见需求

τ=0.90 不意味着恰有 90% 周期无缺货。离散分布从 F(80)=0.85 跳到 F(200)=1。此外,周期服务水平 P(D≤Q) 不等于满足率 1−E[(D−Q)_+]/E[D]。Q=80 时分别为 85% 和 76.9231%,因为稀有高需求周期包含大量缺货单位。即使都称“服务”指标,分母不同也会引导不同决策。

若历史库存始终上限 80,销量 S=min(D,80) 一半为 40、一半为 80,无法区分需求 80 与 200。销量的 90% 分位数为 80,表观成本仅 20 欧元,而潜在真实需求下成本 182。增加训练轮数不能解决目标截尾。缺货期需求即使为 1000,也产生同样销量历史,因此仅靠销量无法识别尾部。

真实应用需要库存时间记录、缺货标记和明确的未观测需求处理策略。评估应采用与决策一致的时间划分、声明成本并比较简单策略。未来信息泄漏或把截尾销量当完整需求,会误导离线评估。本文不训练模型,而是明确模型应学什么、如何衡量效用。

5. 少量数据学到的分位数有多脆弱?

此前分布已知。若只有二十个独立观测日,经验 90% 分位数为排序后的第十八个需求。需求为 200 的天数若不超过二,该分位数就不超过 80。次数 K 服从 n=20、概率 0.15 的二项分布。三项相加得到精确 P(K≤2)=0.404896278。因此约 40.49% 的小样本不会建议 200,即使没有截尾或优化器错误。这是尾部抽样不确定性,与库存限售造成的偏差不同。

P(K≤2)=Σ_(k=0)^2 binom(20,k)·0.15^k·0.85^(20−k) R(Q+1)−R(Q)=0.85−0.15·c_u, 80≤Q<200, c_o=1

成本系数也需敏感性分析。80 至 200 之间,仅当 c_u>0.85/0.15=17/3 欧元/单位,增加 Q 才有利。期望成本连续,但决策会突变:低于该值偏好 80,高于偏好 200,等于时全部中间数量成本相同。若实际 c_u=9 却估为 4,就会选 80,相对模型最优解每期多付期望成本 60 欧元。这是该总体上策略的理论差异,不是商业节省预测。

条件模型使用的季节、促销和交货期信息必须在订货前可得。应学习决策保障期间的需求,而不一定是次日销量。成本随上下文 x 改变时,τ(x) 也会改变。单个 90% 分位数输出不能自动回答新成本比;需要多个分位数或完整分布,并避免在用于宣称优势的同一时期选择模型。

6. 结论与方法来源

MIT newsvendor 讲义给出边际决策和成本比,已阅读推导及离散、连续实例。本文数值案例独立。结论不是库存越多越好,而是适当分位数取决于成本与约束,适当数据应表示需求而非受库存限制的销量。在比较 AI 架构前,先验证目标函数是否对应企业决策。

MIT OpenCourseWare, D-Lab: Supply Chains (Fall 2014), Newsvendor Inventory Problem, derivation and worked examples.

demand = [(40, .5), (80, .35), (200, .15)]
def cost(q):
    return sum(p*(9*max(d-q,0)+max(q-d,0)) for d,p in demand)
print(sum(d*p for d,p in demand))
print(min(range(241), key=cost))
for q in [40,78,80,120,200]:
    print(q,cost(q))

代码、数据与说明 · JSON. 教学计算使用 Python 3.14.0,图使用 Matplotlib 3.11.2。分析由 AI 辅助,不声称经过同行评审或人工审核。原创 ImageGen 封面仅作示意,不记录 EL-AI 人员、场所或实际安装。来源查阅于 2026 年 9 月 24 日。