小镇上有家点心铺,老板阿福每天打烊后都要在账本上记一笔当天的营业额。日子久了,他发现账面数字的变化其实有规律:店开得越久生意越好的“大方向”、夏天绿豆糕好卖冬天热汤圆俏的“时令波动”、还有中秋月饼春节年糕卖爆的“节日高峰”。阿福把这三件事拆开算,账就变得清清楚楚。Facebook 开源的时序预测工具 Prophet 用的正是这个思路——把一条时间序列拆成趋势、季节、节假日三大块,各自建模再相加。它号称“调参少、对缺失值和异常值鲁棒”,特别适合做业务指标预测。这篇文章就带你从阿福的账本出发,把 Prophet 的分段线性趋势和傅里叶季节项彻底看明白。

岗位关联

对 AI 从业者而言,Prophet 是你简历上“业务时序预测”最实用的一块拼图:不用死磕数学也能上线,结果还能用人话向业务方解释。

目录
  1. 可视化演示
  2. 三段分解框架
  3. 分段线性趋势
  4. 变点检测
  5. 傅里叶季节项
  6. 节假日效应
  7. 鲁棒与调参
  8. 优劣与应用
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

交互式展示Prophet模型将时间序列分解为趋势分量、傅里叶季节项和噪声的过程,调节变点先验尺度观察趋势灵活度变化。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Prophet加法模型分解 y(t) = g(t) + s(t) + h(t) + epsilon 组合模式:趋势+季节性叠加展示完整分解 g(t)=(k+a(t)^T delta)t + m + a(t)^T gamma 调节滑块改变变点先验尺度,观察趋势灵活度变化

三段分解框架

阿福记账有个习惯:每天打烊后,他会把当天的营业额拆成三行——“今天比昨天多卖的是大趋势带起来的”“这个月比上月多卖的是时令带来的”“今天多卖是因为过节了”。剩下对不上的零头,他就随手写在备注里当“运气”。这么一拆,月底回头看账本,每笔钱都有来历,心里特别踏实。

Prophet 做的就是一模一样的事。给定一条时间序列 y(t),它假定每个时刻的值可以拆成四项相加:长期趋势 g(t)、季节项 s(t)、节假日项 h(t),以及一个随机噪声 εₜ。趋势是“店越开越好”的大方向,季节是年复一年的周期性波动,节假日是某个特殊日子的脉冲式冲击,噪声则是说不清的随机因素。这种把复杂信号拆成若干可解释成分的“加法模型”,是 Prophet 理解时间序列的起点。

之所以用加法而不是乘法,是因为业务指标里这三种效应往往是“各自贡献一段”的关系:趋势贡献 100 元,季节贡献 30 元,节日贡献 200 元,加起来就是今天的营业额。加法模型的好处是每一项都能单独拿出来向业务方解释——“这个月涨了,主因是趋势 + 季节,节日没贡献”,这种透明性在商业决策里非常值钱。

阿福的三本账在 Prophet 里变成了三个函数,各有各的记法。接下来的每一节,我们分别翻开这三本账看看它们是怎么记的。

y(t)=g(t)+s(t)+h(t)+εt\displaystyle y(t) = g(t) + s(t) + h(t) + \varepsilon_t
这个公式是 Prophet 的总纲:预测值等于趋势、季节、节假日三项的加和,再叠一个随机误差项。
  1. 左侧是目标值y(t) 表示在时刻 t 观测到的序列值,比如阿福第 t 天的营业额。
    y(t)\displaystyle y(t)
  2. 趋势项g(t) 是长期走向,描述“生意整体变好还是变差”,是慢变量。
    g(t)\displaystyle g(t)
  3. 季节项s(t) 是周期性波动,比如每年度的夏季高峰、冬季低谷。
    s(t)\displaystyle s(t)
  4. 节假日项h(t) 是特殊日子的短时冲击,只在节假日当天或邻近日不为零。
    h(t)\displaystyle h(t)
  5. 噪声项εₜ 是模型解释不了的随机残留,通常假设均值为零、方差较小。
    εt\displaystyle \varepsilon_t

分段线性趋势

阿福有个习惯:每半年他把每天的营业额拉成一张折线图,用直尺比着画一条最贴合的直线,看看“生意到底是在涨还是在跌”。后来他发现,一条直线根本不够——前年搬到新店面之后,生意明摆着往上跳了一档,画一条线就会把前后两段都带歪。

Prophet 的趋势项 g(t) 也是这个思路:把整段时间轴切成若干段,每一段用一条直线来拟合,段与段的连接点就是“变点”(changepoint)。公式里用两个量描述一条直线:斜率 k(每天都涨多少)和截距 m(起点在哪里)。当时间越过某个变点 cⱼ 时,增长率发生变化,斜率增加一个增量 δⱼ;为了不让线在变点处断开,截距也要同步做补偿 γⱼ。

这个公式看起来长,其实就是在说:任意时刻 t 的斜率等于“基础斜率 k”加上“所有已经发生变点的增量之和”;截距同理。a(t) 是一个指示向量,它的第 j 个分量在 t ≥ cⱼ(已经越过第 j 个变点)时为 1,否则为 0——它像一串开关,控制在 t 时刻该开哪些增量。

阿福用直尺画的“生意走向线”,在 Prophet 里变成了一段段首尾相连的直线。搬店面那天的变点 cⱼ 被激活后,斜率整体上抬,趋势线就清晰地分成了“老店段”和“新店段”两段。

g(t)=(k+a(t)⊤δ)t+(m+a(t)⊤γ)\displaystyle g(t) = \left( k + \mathbf{a}(t)^\top \boldsymbol{\delta} \right) t + \left( m + \mathbf{a}(t)^\top \boldsymbol{\gamma} \right)
趋势线的斜率 = 基础增长率 + 已激活变点增量的总和;截距也做同样的补偿,保证变点前后线条连续。
  1. 基础斜率k 是整段时间的初始增长率,相当于阿福开业第一年的日均上涨额。
    k\displaystyle k
  2. 变点指示向量a(t) 的每个分量都是 0/1 开关,标记“时间 t 是否越过了第 j 个变点”。
    a(t)∈{0,1}S\displaystyle \mathbf{a}(t) \in \{0,1\}^S
  3. 变点增量δ 是各变点的增长率增量向量,δⱼ 表示第 j 个变点让斜率改变了多少。
    δ=(δ1,δ2,…,δS)⊤\displaystyle \boldsymbol{\delta} = (\delta_1, \delta_2, \ldots, \delta_S)^\top
  4. 动态斜率括号里基础斜率加已激活增量,就是 t 时刻实际的增长率。
    k+a(t)⊤δ\displaystyle k + \mathbf{a}(t)^\top \boldsymbol{\delta}
  5. 截距补偿γ 是与 δ 配套的截距修正项,让线段在变点处平滑衔接、不断裂。
    m+a(t)⊤γ\displaystyle m + \mathbf{a}(t)^\top \boldsymbol{\gamma}

变点检测

阿福盯着折线图发愁:他说不清到底是哪天生意开始变好的。是搬店那天?还是搬店前一周就开始有人排队了?如果他来定变点,多半会拍脑袋乱猜。Prophet 的做法是让数据自己说话——它先放一批“候选变点”,再逐个检验哪些是真的。

实际实现中,Prophet 默认在历史数据的时间轴上等距地放置一批候选变点(比如每段历史约 25% 的位置放一个),然后为每个候选变点的增量 δⱼ 设置一个拉普拉斯先验分布。拉普拉斯分布的特点是“中间特别尖、尾巴特别长”,它对增量有强烈的“往 0 缩”的拉扯力——除非数据真的需要这个变点来解释,否则它的增量就按 0 处理。

这个“稀疏化”的数学表达就是一个先验公式:δⱼ 服从以 0 为中心、尺度参数 τ 控制的拉普拉斯分布。τ 的大小非常关键:τ 越小,拉扯力越强,能留下来的变点越少,趋势越简单;τ 越大,变点增量越自由,趋势越容易跟着噪声摆动。

阿福最终发现,候选变点里绝大多数都被账本“否决”了:增量被压成 0,意思是“那段时间并没有真的改变走向”。只有搬店前后的那一两个变点拿到了非零增量,成了真正意义上的“转折日”。

δj∼Laplace(0,τ)\displaystyle \delta_j \sim \text{Laplace}(0, \tau)
每个候选变点的增长率增量都服从一个“喜欢 0”的分布,大多数变点会被压成 0,只有真正改变走势的时刻才会留下非零增量。
  1. 单个变点增量δⱼ 是第 j 个候选变点导致的斜率变化量,正数代表增长加速。
    δj\displaystyle \delta_j
  2. 拉普拉斯分布以 0 为峰值的尖峰分布,密度函数在 0 处最高、向两边指数衰减。
    Laplace(⋅∣0,τ)=12τe−∣⋅∣/τ\displaystyle \text{Laplace}(\cdot \mid 0, \tau) = \frac{1}{2\tau} e^{-|\cdot|/\tau}
  3. 先验尺度τ 控制分布“尖”的程度——τ 越小曲线越尖,对增量的收缩越强,变点越稀疏。
    τ>0\displaystyle \tau > 0

傅里叶季节项

阿福的账本有个明显的规律:每年夏天绿豆糕和酸梅汤卖得凶,冬天热汤圆和姜茶卖得俏,春天秋天各有各的小高峰。如果只看“大趋势”,这些起伏全被抹平了;但如果把连续两三年的数据叠在一起,就能看到一条几乎年年重复的曲线。

Prophet 用傅里叶级数来画这条年复一年的曲线。傅里叶的思想很朴素:任何周期为 P 的平滑曲线,都可以看作若干个不同频率的正弦波和余弦波的叠加。把这些波的振幅(系数)交给模型去学,它就能凑出“夏天高、冬天低”这种任意形状的季节形态。

公式里的 P 是周期长度,年季节性取 365.25,周季节性取 7,日季节性取 1。N 是谐波阶数,控制用多少个波来叠加——N 越大,能刻画的形态越复杂,但也越容易把噪声也学进去,所以 Prophet 的默认值很保守:年季节性 N=10,周季节性 N=3。

阿福的“四季菜单曲线”在 Prophet 里就是一组不同频率正余弦波的合唱:低频大波负责“夏高冬低”的主旋律,几个高频小波负责给曲线打上春秋季节的小转折。阶数 N 越多,合唱团成员越多,能演奏的细节也越丰富。

s(t)=∑n=1N(ancos⁡(2πntP)+bnsin⁡(2πntP))\displaystyle s(t) = \sum_{n=1}^{N} \left( a_n \cos\left( \frac{2\pi n t}{P} \right) + b_n \sin\left( \frac{2\pi n t}{P} \right) \right)
季节项是 N 个正余弦波的加权求和,周期 P 决定波动节奏,权重 aₙ、bₙ 由数据学习,阶数 N 控制曲线的“自由程度”。
  1. 谐波序号n 从 1 到 N,表示第 n 个叠加波,n 越大频率越高、形状细节越丰富。
    n=1,2,…,N\displaystyle n = 1, 2, \ldots, N
  2. 周期长度P 是季节周期的天数,年季节用 365.25(含闰年),周季节用 7。
    P=365.25 或 7\displaystyle P = 365.25 \text{ 或 } 7
  3. 余弦部分cos 波负责描述对称性波动,比如“以年为周期的高峰低谷”。
    ancos⁡(2πntP)\displaystyle a_n \cos\left( \frac{2\pi n t}{P} \right)
  4. 正弦部分sin 波与 cos 相位互补,负责把波峰不在原点处的形态也表达出来。
    bnsin⁡(2πntP)\displaystyle b_n \sin\left( \frac{2\pi n t}{P} \right)
  5. 叠加求和N 个波加权求和,系数大则这个频率的贡献强,最终拼出整条季节曲线。
    ∑n=1N(⋯ )\displaystyle \sum_{n=1}^{N} \left( \cdots \right)

节假日效应

到了中秋前三天,阿福就开始加班烤月饼;除夕前两天,年糕的订单排到了店门外。这些日子的营业额,既不是“大趋势”涨出来的,也不是“时令”带起来的——纯粹是因为日历上写着那几个字。

Prophet 对节假日效应的处理非常直白:你给它一份“节假日名单”(哪一天是什么节),它就把每个节日变成一个 0/1 指示变量——这一天过节就取 1,不过节就取 0,然后把所有节日的指示变量做加权求和。权重 κᵢ 就是“这个节日平均能多卖多少钱”,由模型从数据里学出来。

节假日不只是当天有效:中秋前三天就开始囤货,大年初一到初七都在走亲访友。所以 Prophet 允许你给每个节日设一个“影响窗口”lower_window / upper_window,把节前节后的日子也一并编码成 1。窗口内的每一天都共享这个节日的权重,相当于阿福把“中秋效应”摊到了前后几天。

阿福的节日账本在 Prophet 里就是一个名单加一堆开关:名单里写着“中秋”“春节”“端午”,窗口告诉模型“提前三天开始算”,学过数据的权重则告诉他——中秋平均多卖 800 元,而端午只多 300 元。

h(t)=∑iκi⋅1{t∈Di}\displaystyle h(t) = \sum_{i} \kappa_i \cdot \mathbb{1}_{\{ t \in \mathcal{D}_i \}}
节假日项等于所有节日的加权指示变量之和:t 落在节日窗口内就取 1,否则取 0;权重 κᵢ 是每个节日对目标的影响幅度。
  1. 节日窗口集合Dᵢ 是第 i 个节日的日期集合,包含节日本身和指定的前后窗口天。
    Di={窗口内的所有日期}\displaystyle \mathcal{D}_i = \{\text{窗口内的所有日期}\}
  2. 指示函数当 t 属于 Dᵢ 时函数值为 1,否则为 0,相当于“今天过节吗”的开关。
    1{t∈Di}\displaystyle \mathbb{1}_{\{ t \in \mathcal{D}_i \}}
  3. 节日权重κᵢ 是第 i 个节日的平均影响幅度,正值表示节日让销量上升。
    κi\displaystyle \kappa_i
  4. 求和汇总叠加所有节日的影响,得到 t 当天节假日效应对总值的贡献。
    ∑iκi⋅(开关)\displaystyle \sum_{i} \kappa_i \cdot (\text{开关})

鲁棒与调参

台风天阿福没开门,账本上那天是空的;有一次网红探店,营业额突然爆到平日的五倍。阿福很清醒:这两种日子不该影响他对“正常生意”的判断。Prophet 也是这么想的,而且它把这种抗干扰能力做进了机制里。

对缺失值,Prophet 的策略是“跳过”:拟合时只使用有观测的时间点,缺失位置不参与计算,也不需要插值。对异常值,Prophet 在模型拟合的最后一步使用鲁棒回归(Huber 损失),把偏离过大的点的权重自动压低,让“网红探店爆单”这类极端值不至于把趋势线拽偏。

调参方面,Prophet 刻意做得精简。核心超参数就四个:变点先验尺度 τ(控制趋势突变的猛烈程度)、季节阶数 N(控制季节曲线的复杂程度)、节假日先验尺度(控制节日权重的可信范围)、节假日窗口长度(控制影响天数)。剩下的全部交给默认值。这背后的哲学是:让模型把大部分工作自动化,人只需要在“业务常识”层面做判断。

阿福的原则是“账本偶尔缺页不要紧,个别爆单不往心里去”。Prophet 把这一原则写进了算法:缺的日子跳过,怪的日子降权,真正需要你拍板的只有几个业务参数——这比传统时序模型动辄十几个超参数要友好得多。

优劣与应用

阿福的记账方式适合他的点心铺,但隔壁老王的烧烤摊就不一定适用——烧烤摊冬天生意惨淡,夏天火爆到排队,这种“季节性”很强且几乎没有长期趋势的业务,用趋势加季节的三本账也能记,但爆发式增长(比如连锁扩张)就超出了直线加波动的表达能力。

Prophet 的优点很突出:高度可解释,每一块预测都能拆成趋势、季节、节日逐项汇报;自动变点检测省去了人工标注转折点;对缺失值和异常值鲁棒;超参数少,业务人员也能上手。它的局限也很清晰:对指数级增长或带有硬上限(如市场容量)的序列需要手动做对数变换或设置饱和下限;高频数据或多重长周期(如 52 周 + 365 天同时存在)会让傅里叶项数量和计算量明显上升;它不擅长捕捉变量之间的复杂交互效应。

实际部署中,Prophet 最常见的定位是“业务指标基线预测”:日粒度的 GMV、DAU、订单量、库存需求量等。它给出的预测区间(不确定性带)还能直接用于异常检测——实际值跌出区间就报警。阿福的账本记的是营业额,Prophet 的账本记的是任何一个“每天记一笔”的业务指标:只要你的数据有趋势、有季节、有节日,它就能把账算得明明白白。

AI 应用场景

电商零售销量预测

阶段:需求预测与供应链计划

解决的问题:电商运营靠 Excel 手工预测下月销量,遇到“双十一”“年货节”要么拍脑袋加系数,要么完全漏掉。Prophet 把历史订单量拆成趋势、每周季节性、年度季节性和平台大促节假日效应,自动给出未来 30 天的日销量基线及置信区间,采购备货有了数据依据。

具体案例:某食品品牌在天猫的旗舰店用 Prophet 预测每日订单量,输入过去两年的日订单数据和促销活动日历,模型识别出“年货节前 5 天销量开始爬坡”的窗口规律,备货准确率同比提升 20%。

业务指标监控与异常预警

阶段:可观测性与异常检测

解决的问题:DAU 或 GMV 波动时,运营分不清是“正常季节起伏”还是“真的出事了”。Prophet 先为指标建立趋势 + 季节 + 节假日的基线预测,再用实际值与预测区间的偏离程度判定异常,把“判断异常”从人工经验变成可量化的规则。

具体案例:某内容社区每天用 Prophet 预测次日 DAU,并输出 80% 预测区间。某天实际 DAU 跌出区间下界,系统自动告警,排查发现是首页推荐接口超时。事后把该日期加入异常日历,避免同类事件漏报。

供应链与库存需求规划

阶段:智能补货决策

解决的问题:零售仓库的补货计划需要预判未来几周的出库量,传统方法对“节假日闭店”“促销加仓”等特殊日期建模困难,常常超储或断货。Prophet 的节假日窗口机制天然适配这种“特殊日子集中影响”的场景。

具体案例:某连锁便利店对 3000 个 SKU 的周出库量分别训练 Prophet 模型,节假日名单内置春节、国庆、双十一,每个节日的窗口长度由历史数据校验后确定。上线后整体库存周转天数下降 12%,缺货率下降 30%。

Python 演示

python51 行
import numpy as np  def make_trend_basis(t, changepoints):    """分段线性趋势设计矩阵: [t, max(t-c1,0), max(t-c2,0), ...]"""    cols = [t]    for cp in changepoints:        cols.append(np.maximum(0, t - cp))    return np.column_stack(cols)  def make_fourier_basis(t, period, n_harmonics):    """傅里叶季节项设计矩阵: 每组 N 对 cos/sin 波"""    cols = []    for n in range(1, n_harmonics + 1):        cols.append(np.cos(2 * np.pi * n * t / period))        cols.append(np.sin(2 * np.pi * n * t / period))    return np.column_stack(cols)  def fit_prophet(t, y, changepoints, period=365.25, n_harmonics=6):    """拼接趋势+季节设计矩阵, 最小二乘解出所有系数"""    X = np.hstack([        make_trend_basis(t, changepoints),        make_fourier_basis(t, period, n_harmonics),    ])    beta, *_ = np.linalg.lstsq(X, y, rcond=None)    return beta  def predict(t, beta, changepoints, period=365.25, n_harmonics=6):    """用训练好的系数对未来时间点做预测"""    X = np.hstack([        make_trend_basis(t, changepoints),        make_fourier_basis(t, period, n_harmonics),    ])    return X @ beta  if __name__ == "__main__":    rng = np.random.default_rng(42)    t = np.arange(0, 730)  # 730天, 两年    trend = 0.01 * t + 0.5 * np.maximum(0, t - 365)    season = 3 * np.sin(2 * np.pi * t / 365.25) + 1.2 * np.sin(4 * np.pi * t / 365.25)    y = trend + season + rng.normal(0, 0.3, len(t))     chpts = [365.0]    beta = fit_prophet(t, y, chpts)    yhat = predict(t, beta, chpts)    mae = np.mean(np.abs(y - yhat))    print(f"MAE = {mae:.3f}")
目的:演示 Prophet 核心思想的简化实现——把时间序列构造成“分段线性趋势基 + 傅里叶季节基”的线性模型,然后用最小二乘一步求解。
  1. make_trend_basis(t, changepoints)对每个变点生成一列“越过它之后才生效”的斜坡特征,对应趋势公式里的 a(t)δ。
  2. np.maximum(0, t - cp)这是分段直线的关键:t 未到变点时该列为 0,越过变点后线性增长,实现“后半段斜率改变”。
  3. make_fourier_basis(t, period, n_harmonics)为周期 P 生成 N 组正余弦列,对应季节项的傅里叶级数。
  4. np.linalg.lstsq(X, y)一次最小二乘求解所有系数,无需迭代,这也是 Prophet 拟合快的根本原因。
  5. X @ beta预测时直接用系数矩阵乘设计矩阵,得到趋势与季节的叠加预测值。

常见误区

误区“Prophet 内置了所有节日,我只要把数据丢进去,春节、双十一它自己就懂了。”

正解Prophet 并不知道世界上有哪些节日。它只能对“你提供的节假日列表”学习权重。不传节假日名单,它就完全忽略节日效应,把节日当天当成普通日子,节假日产生的峰值会被塞进趋势或噪声里。正确做法是把业务关心的所有特殊日期(含平台大促、公司活动)整理成名单,并为每个节日设置合理的影响窗口。阿福的账本如果没写“中秋”两个字,月饼的爆单就永远是一笔“说不清”的账。

为何常见:Prophet 的 demo 里自带了美国节假日数据集,给使用者造成“节日自动识别”的错觉。

误区“季节形态很复杂,把傅里叶阶数 N 调大,波形拟合得更精细,预测肯定更准。”

正解N 增大意味着模型有更多自由度,能把训练数据里的随机噪声也一并“记住”,造成过拟合。年季节性默认 N=10 已经能覆盖绝大多数平滑周期形态;N 调到 20 以上,预测区间会明显变宽,且季节曲线出现无意义的抖动。判断 N 是否合适,要看验证集误差而非训练集拟合度。阿福不会因为某一天卖得特别多,就把“四季菜单曲线”改成“每天一个花样”。

为何常见:人天然认为“更复杂的模型 = 更强的能力”,忽略了统计学习里偏差与方差的权衡。

误区“既然变点能捕捉转折,那把候选变点放得密密麻麻,模型就能灵活贴合每段走势。”

正解变点增量受拉普拉斯先验的稀疏约束,但如果你把变点先验尺度 τ 调得很大,约束形同虚设,趋势会剧烈抖动并拟合噪声;τ 保持默认时,过多候选变点只会增加计算量,并不会带来更准的拟合。变点检测的精髓是“用最少的转折解释最大的变化”,而不是“处处转折”。阿福不会把每天生意的小起伏都当成“店面升级”。

为何常见:把“分段”误解为“切得越碎越好”,忽略了模型对简洁性的偏好。

误区“Prophet 是 Facebook 开源的,调参又少,直接把 CSV 丢进去跑就行。”

正解Prophet 假设序列 = 趋势 + 平滑季节 + 稀疏节假日 + 噪声。对指数级增长(如用户量爆发期)需要手动设置饱和增长模式并给定上限;对存在多重长周期(如 52 周和 365 天同时显著)的数据,它建模吃力;对分钟级高频数据,计算量会明显膨胀。它适合“日粒度、有清晰周期、有可枚举节假日”的业务指标,不是万能的黑箱。阿福的账本适合点心铺,硬要拿去记隔壁烧烤摊的炭火成本,就会变形。

为何常见:开源库的易用性让使用者误以为“少调参 = 免思考”,忽略了任何模型都有适用边界。

面试题

Q1. Prophet 把时间序列分解成哪三项的加和?

单选题 · easy

  • A.趋势、季节、节假日← 正确答案
  • B.均值、方差与噪声
  • C.自回归、差分、白噪声
  • D.趋势、周期与随机游走

答案:A。Prophet 的核心公式是 y(t) = g(t) + s(t) + h(t) + ε,即趋势、季节、节假日三项加和。自回归/差分是 ARIMA 的思路,均值方差描述的是分布而非分解结构,随机游走是另一种时序假设,都不符合 Prophet 的三项分解框架。

Q2. Prophet 的趋势项为什么用分段线性函数而非高阶多项式?

单选题 · easy

  • A.计算简单且不易摆动← 正确答案
  • B.能拟合任意指数曲线
  • C.只需要一个全局斜率
  • D.完全不需要设定变点

答案:A。分段线性的优点是拟合速度快、可解释性强,且不会像高阶多项式那样在数据边缘出现剧烈摆动(龙格现象)。指数曲线需要手动对数变换,全局斜率无法表达转折,变点恰恰是分段线性必需的设定,所以 B、C、D 都不对。

Q3. 在 Prophet 中,候选变点增长率增量的先验分布是?

单选题 · mid

  • A.拉普拉斯分布← 正确答案
  • B.标准正态分布
  • C.均匀分布
  • D.泊松分布

答案:A。δⱼ ~ Laplace(0, τ),拉普拉斯先验的尖峰形状将大多数增量收缩到 0,实现变点的稀疏选择。正态分布收缩力度弱且不均匀,均匀分布无收缩效果,泊松分布用于计数数据,均不适用。

Q4. 变点先验尺度 τ 对模型的影响是什么?

单选题 · mid

  • A.控制趋势突变的猛烈程度← 正确答案
  • B.决定季节周期长度
  • C.调整预测未来天数
  • D.指定节假日窗口宽度

答案:A。τ 是拉普拉斯先验的尺度参数,τ 越大变点增量越不受约束、趋势越容易剧烈跳变;τ 越小增量越被压向 0、趋势越平缓。它不涉及季节周期、预测时长和节假日窗口,那些分别由周期 P、预测区间和 lower/upper_window 控制。

Q5. 周季节性的傅里叶级数中,周期 P 通常取多少天?

单选题 · mid

  • A.7← 正确答案
  • B.365
  • C.12
  • D.30

答案:A。周期参数必须等于该季节性的自然周期:周季节性一周 7 天,P 取 7;年季节性含闰年取 365.25,月季节性通常取 30.44 或直接按周分解。12 是天数还是月份数都不符合周周期定义,故排除。

Q6. 节假日效应对应哪种数学建模方式?

单选题 · mid

  • A.指示变量加权求和← 正确答案
  • B.高斯核密度估计
  • C.自回归滑动平均
  • D.指数平滑递推

答案:A。h(t) = Σ κᵢ·1_{t∈Dᵢ},每个节假日用一个 0/1 指示变量表示“今天是否在窗口内”,权重 κᵢ 由数据学习。高斯核是连续密度估计,ARMA 与指数平滑都是对整体序列的时序建模,都不针对稀疏离散的节日冲击。

Q7. Prophet 自动变点检测在优化目标上等价于对增量施加哪种正则?

单选题 · hard

  • A.L1 稀疏正则← 正确答案
  • B.L2 岭正则
  • C.主成分截断
  • D.随机森林剪枝

答案:A。拉普拉斯先验对应负对数似然中的绝对值惩罚,即 L1 正则,它将大多数 δⱼ 精确压成 0,实现稀疏变点选择。L2 正则只缩小不归零,主成分和随机森林是另一类方法,不涉及参数稀疏化。

Q8. 以下哪些做法能降低 Prophet 的过拟合风险?

多选题 · mid

  • A.调低傅里叶季节项阶数← 正确答案
  • B.调小变点先验尺度 τ← 正确答案
  • C.调大变点先验尺度 τ
  • D.排除异常值后重新拟合← 正确答案

答案:ABD。调低阶数 N 减少季节自由度,调小 τ 增强趋势稀疏约束,剔除异常点避免极端值拉扯曲线,三者都能降低过拟合。调大 τ 反而放大变点自由度,加剧过拟合,故不选。

Q9. 关于 Prophet 的节假日效应,正确的说法是?

多选题 · hard

  • A.可为节日设置前后影响窗口← 正确答案
  • B.节假日名单需由用户提供← 正确答案
  • C.模型会自动发现未列出的节日
  • D.每个节日的影响幅度由数据学习← 正确答案

答案:ABD。upper_window/lower_window 控制节日影响范围,节假日名单必须由用户显式提供,权重 κᵢ 通过拟合数据自动学习。模型不会自动发现未列入名单的节日,它只对名单内的日期建模,故 C 错误。

Q10. 以下哪些场景更适合使用 Prophet?

多选题 · mid

  • A.日粒度的电商销量预测← 正确答案
  • B.带节假日效应的 DAU 基线预测← 正确答案
  • C.秒级高频交易数据的逐笔预测
  • D.分钟级且无明显日周期的传感器信号

答案:AB。Prophet 定位是“日粒度 + 清晰季节周期 + 可枚举节假日”的业务指标预测,电商销量和 DAU 正是典型场景。秒级高频数据计算量失控且噪声主导,无周期传感器的信号缺乏季节结构和节假日先验,都不属于 Prophet 的前沿能力范围。