跳转至

Regularized High-Dimensional Additive Tensor Autoregressive Model

作者: Debika Ghosh, Nilanjana Chakraborty, Samrat Roy
主题: 高维统计 / 随机矩阵
相关性: 6/10
链接: https://arxiv.org/abs/2608.26366


一、领域脉络与小综述

这个方向是什么

高维张量时间序列建模的核心问题:如何利用过去的多维观测(三维或更高阶张量)预测未来,同时处理参数爆炸(参数数量随维度乘积增长)和内在结构(行、列、管等模式间的交互)。当前成熟度:向量VAR(高维稀疏正则化)已成熟;矩阵VAR(双线性形式)已有若干工作;张量VAR(Tucker分解形式)刚起步,但存在可解释性差、非凸优化、低维模式刻画不足等问题。本文试图在张量VAR中引入加性结构,并用低秩+稀疏分解来同时捕捉共享和特异性的时序依赖,且保持凸优化可解。

发展脉络(history)

  • 奠基工作:高维稀疏VAR(Basu & Michailidis, 2015 [1])建立了ℓ1正则化VAR的有限样本误差界,依赖谱密度和受限强凸性。这是后续所有高维时序正则化估计的理论模板。
  • 矩阵/张量VAR的兴起:Chen, Xiao & Yang (2018 [15]) 提出矩阵自回归(MAR),用双线性形式 \(AY_{t-1}B'\) 捕捉行、列依赖。Li & Xiao (2021 [16]) 将其推广到张量,用Tucker分解 \(Y_{t-1} \times_1 A_1 \times_2 A_2 \times_3 A_3\)。这些工作保留了多路结构,但参数仍多,且优化非凸。
  • 低维结构探索:为降维,研究者对过渡矩阵施加低秩或稀疏约束(Wang et al. 2019 [16] 用张量分解;Hsu et al. 2021 [19] 用双线性加空间邻域;Xiao et al. 2022 [18] 用降秩)。但这些仍基于Tucker的乘性交互,难以分离各模式效应。
  • 加性替代:Zhang (2023 [23]) 提出矩阵加性自回归(Add-ARM),将行、列效应加性组合,提升可解释性。本文将其扩展到张量,并进一步引入低秩+稀疏分解。
  • 本文位置:在加性矩阵自回归基础上,首次为张量时间序列提出加性结构,并同时施加低秩+稀疏正则化,给出凸优化算法和完整的高维误差界。作者声称这是“novel contributions to the field of high-dimensional tensor time series analysis”(Section 1末句)。

子线索聚类

  1. 高维稀疏VAR及其理论([1] Basu & Michailidis 2015, [13] Kock & Callot 2012, [19] Ghosh et al. 2018):建立ℓ1正则化VAR的误差界、后验一致性,依赖谱密度和受限强凸性。本文的偏差界推导直接继承自[1]。
  2. 矩阵/张量自回归的乘性模型([15] Chen et al. 2018, [16] Li & Xiao 2021, [18] Xiao et al. 2022, [19] Hsu et al. 2021):用双线性或Tucker分解捕捉模式间交互,但优化非凸,可解释性受限。本文明确批评其“convoluted multiplicative interaction form”(Section 1 (a))。
  3. 加性矩阵/张量自回归([23] Zhang 2023):提出矩阵加性形式,本文是其张量推广。
  4. 低秩+稀疏分解的凸优化理论([31] Agarwal et al. 2011, [30] Negahban et al. 2012):为矩阵分解提供统一框架,包括受限强凸性、可分解正则化、非相干条件。本文的证明路线直接借用这些工具,但将其适配到张量时序的加性结构。

这个方向在追问的核心问题

  • Q1:如何在高维张量时序中同时实现可解释性(各模式效应可分离)和统计效率(参数数量可控)?
  • Q2:如何设计凸优化算法来估计张量自回归参数,避免Tucker分解的非凸性?
  • Q3:在加性结构下,低秩+稀疏分解的可识别性条件是什么?误差界如何随维度、秩、稀疏度变化?
  • Q4:与乘性模型(Tucker)相比,加性模型的预测能力是否损失?理论保证是否更强?

当前主流方法(Tucker分解+稀疏/降秩)在Q1上失败(效应纠缠),在Q2上非凸,在Q3上仅给出整体维度的误差界([16] Theorem 3)。本文声称在Q1-Q3上均有改进。

⚠️ 作者的 framing(必须明确标注成“这是作者的说法”)

  • 作者把缺口 frame 成什么:作者在Section 1列出三个问题:(a) Tucker乘性形式使行、列、管效应“convoluted”,难以分离解释;(b) 低秩+稀疏在乘性形式下只能降维,不能显式捕捉“baseline + idiosyncratic”模式;(c) 优化非凸。因此,加性形式是“显然的下一步”,且凸优化+低秩稀疏分解能同时解决这三个问题。
  • 哪些竞争路线被他淡化或回避了:
  • 因子模型([40] Wang et al. 2016)仅在Discussion中提了一句“future research”,未在正文中比较。因子模型也能处理高维张量时序,且可解释性不差(因子载荷可解释),但作者未讨论其与加性模型的优劣。
  • 贝叶斯方法(如[19] Ghosh et al. 2018的VAR后验一致性)被完全忽略,尽管贝叶斯张量时序也有工作。
  • 深度学习方法(如LSTM、Transformer)未被提及,尽管在OD预测中常见。
  • 什么明显该被引/该存在、却没出现在intro里:
  • 关于张量时间序列的贝叶斯工作(如Tensor Train变分推断)未被引用。
  • 关于加性模型可识别性的经典文献(如Hastie & Tibshirani 1990的GAM)未被引用,尽管本文的加性结构本质上是GAM在张量时序上的特例。
  • 关于低秩+稀疏分解在矩阵补全/回归中的非凸算法(如交替最小化,[14] Liu et al. 2016)被引用,但未讨论其与本文凸优化的计算效率对比。

张力

未见明显对立引用。所有被引工作基本一致认为Tucker分解是主流,但本文指出其不足。没有发现同一问题下不同方法得出相反结论的情况。


二、最核心、最简单的例子 / 数学问题

第一步:把符号、模型、可观测数据交代清楚

  • 符号:
  • \(Y_t \in \mathbb{R}^{d_1 \times d_2 \times d_3}\):第 \(t\) 时刻的三维张量观测(可观测)。
  • \(d_1, d_2, d_3\):三个模式的维度(已知常数)。
  • \(T\):时间序列长度(样本量)。
  • \(Y_{t-1(1)} \in \mathbb{R}^{d_1 \times (d_2 d_3)}\):\(Y_{t-1}\) 的模式-1(行)展开矩阵(可观测)。
  • \(Y_{t-1(2)} \in \mathbb{R}^{d_2 \times (d_1 d_3)}\):模式-2(列)展开。
  • \(Y_{t-1(3)} \in \mathbb{R}^{d_3 \times (d_1 d_2)}\):模式-3(管)展开。
  • \(B_1 \in \mathbb{R}^{d_1 \times d_1}, B_2 \in \mathbb{R}^{d_2 \times d_2}, B_3 \in \mathbb{R}^{d_3 \times d_3}\):过渡矩阵,捕捉各模式时序依赖(待估参数)。
  • \(L_k, S_k \in \mathbb{R}^{d_k \times d_k}\):\(B_k\) 的低秩和稀疏分解,\(B_k = L_k + S_k\)(待估参数)。
  • \(E_t \in \mathbb{R}^{d_1 \times d_2 \times d_3}\):误差张量(不可观测,假设独立或弱相关)。
  • \(\text{fold}_k(\cdot)\):将矩阵“折叠”回张量的操作,是展开的逆。
  • \(\|\cdot\|_F\):Frobenius范数;\(\|\cdot\|_*\):核范数;\(\|\cdot\|_1\):元素ℓ1范数。
  • \(\lambda_{L_k}, \lambda_{S_k}\):正则化参数(需选择)。
  • \(R_k\):\(L_k\) 的秩;\(s_k\):\(S_k\) 的非零元素个数(均为未知,但假设远小于 \(d_k^2\))。
  • \(\hat{L}_k, \hat{S}_k\):估计量。
  • \(\hat{\Delta}_{L_k} = \hat{L}_k - L_k\),\(\hat{\Delta}_{S_k} = \hat{S}_k - S_k\):估计误差。

  • 模型:

    \[Y_t = \text{fold}_1\big[(L_1 + S_1) Y_{t-1(1)}\big] + \text{fold}_2\big[(L_2 + S_2) Y_{t-1(2)}\big] + \text{fold}_3\big[(L_3 + S_3) Y_{t-1(3)}\big] + E_t\]
    这是一个一阶自回归模型,但加性分解为三个模式独立的线性变换。\(L_k\) 捕捉“共享”或“基线”模式(低秩意味着行/列间有线性依赖),\(S_k\) 捕捉“特异”或“异质”模式(稀疏意味着仅少数位置有额外效应)。

  • 可观测数据:\(\{Y_t\}_{t=1}^T\) 是唯一可观测的量。\(Y_{t-1(k)}\) 由 \(Y_{t-1}\) 通过确定性展开得到。误差 \(E_t\) 不可观测,需假设分布(高斯或次指数)。参数 \(L_k, S_k\) 是待估的潜在量。

第二步:讲最小内核

最简特例:考虑 \(d_1 = d_2 = d_3 = 2\),即每个时刻的观测是 \(2 \times 2 \times 2\) 张量。假设 \(L_1, L_2, L_3\) 均为秩1矩阵,\(S_1, S_2, S_3\) 均只有1个非零元素(其余为零)。此时模型为:

\[Y_t = \text{fold}_1\big[(L_1 + S_1) Y_{t-1(1)}\big] + \text{fold}_2\big[(L_2 + S_2) Y_{t-1(2)}\big] + \text{fold}_3\big[(L_3 + S_3) Y_{t-1(3)}\big] + E_t\]
其中 \(L_1 = u_1 v_1^\top\)(秩1),\(S_1\) 仅在位置 \((i_1, j_1)\) 非零;类似定义 \(L_2, S_2, L_3, S_3\)。可观测数据为 \(\{Y_t\}_{t=1}^T\),\(T\) 需足够大(如 \(T=100\))。

核心思路:估计问题转化为最小化凸目标函数(3),其中核范数惩罚 \(\|L_k\|_*\) 鼓励低秩,ℓ1惩罚 \(\|S_k\|_1\) 鼓励稀疏。由于目标函数联合凸,可用交替块最小化(Algorithm 1)求解:每次固定其他块,更新一个 \(L_k\) 或 \(S_k\),子问题分别是核范数正则化最小二乘(可用近端梯度法)和ℓ1正则化最小二乘(可用软阈值)。

在这个特例下,要证的命题退化成什么? 定理3.1的误差界(高斯误差)退化为:

\[e^2 \preceq s_1 \frac{Q_1^2 \log d_1}{T} + s_2 \frac{Q_2^2 \log d_2}{T} + s_3 \frac{Q_3^2 \log d_3}{T} + R_1 \frac{Q_1^2 d_1}{T} + R_2 \frac{Q_2^2 d_2}{T} + R_3 \frac{Q_3^2 d_3}{T}\]
加上非相干项 \(s_k \gamma^2 \alpha_k^2 / d_k^2\)。在 \(d_1=d_2=d_3=2\) 时,\(\log d_k \approx 0.69\),\(d_k=2\),因此主导项是 \(s_k/T\) 和 \(R_k/T\)。由于 \(s_k=1, R_k=1\),误差界约为常数除以 \(T\),即估计误差以 \(O_p(1/\sqrt{T})\) 速率收敛(忽略对数因子)。证明的关键是验证受限强凸性(Assumption 3.1)和非相干条件(Assumption 3.2)在此特例下成立,然后通过确定性误差界(Lemma 3.1)和偏差界(高斯或次指数)得到最终结果。

为什么这个特例抓住了核心困难? 即使维度很小,加性结构导致三个模式同时贡献,误差项 \(E_t\) 的偏差需要同时控制三个方向(行、列、管)的谱范数和无穷范数。证明中需要处理三个 \(D_k\) 矩阵的偏差,以及它们与正则化参数的关系。特例下,这些偏差的维数降低,但结构不变,因此理解特例有助于理解一般情况。


三、这篇论文做了什么

三句话

  1. 研究了什么问题:针对高维张量时间序列,提出一个加性自回归模型(RATAR),将时序依赖分解为行、列、管三个模式的加性项,并对每个模式的过渡矩阵施加低秩+稀疏正则化,以同时捕捉共享和特异性的时序模式。
  2. 核心工具/方法:凸优化(核范数+ℓ1范数联合惩罚),交替块最小化算法,受限强凸性+非相干条件+可分解正则化框架(Negahban et al. 2012),以及基于谱密度的高斯/次指数偏差界(Basu & Michailidis 2015, Götze et al. 2019)。
  3. 主要结论:在受限强凸性和非相干条件下,给出有限样本误差界(Lemma 3.1, Theorem 3.1, Theorem 3.2),误差由 \(s_k \log d_k / T\)、\(R_k d_k / T\) 和非相干项 \(s_k / d_k^2\) 主导。模拟和真实数据(NYC出租车OD需求)验证了估计和预测性能优于Tucker-based TAR和稀疏VAR。

关键设定与假设

  • 模型:式(1)-(2),加性结构,\(B_k = L_k + S_k\)。
  • 假设:
  • Assumption 3.1 (受限强凸性):损失函数在误差属于某个“受限集”时具有曲率 \(\gamma > 0\)。该受限集由Lemma A.1和A.2刻画,本质上是误差的核范数和ℓ1范数受控。相比已有文献(如[30]),这是标准假设,但本文需要同时处理三个模式的误差。
  • Assumption 3.2 (非相干条件):\(\|L_k\|_\infty \leq \alpha_k / \sqrt{d_k d_k}\),即低秩矩阵的“尖峰性”受控。这比涉及奇异向量非相干的假设(如[32,33])更弱,作者声称“milder”。该条件确保低秩和稀疏分量可识别。
  • Assumption 3.3 (正则化参数下界):\(\lambda_{L_k} \geq 4\|D_k\|_{\text{sp}}\),\(\lambda_{S_k} \geq 4\|D_k\|_\infty + 4\gamma \alpha_k / \sqrt{d_k d_k}\),其中 \(D_k = \frac{1}{T} \sum_t E_{t(k)} Y_{t-1(k)}^\top\)。这是标准条件,确保偏差项被正则化参数覆盖。
  • 相比已有文献的放宽/强化:
  • 相比Tucker-based TAR [16]:本文的加性结构更可解释,且优化凸([16]非凸)。但[16]的误差界只针对Kronecker积表示,本文则给出每个模式独立的速率。
  • 相比矩阵加性模型 [23]:本文扩展到张量,并引入低秩+稀疏分解([23]只考虑低秩或稀疏之一?实际上[23]未用低秩+稀疏,而是用Gershgorin圆盘定理保证平稳性)。
  • 相比矩阵分解理论 [31]:本文将其从独立同分布误差推广到时序相关误差(通过谱密度控制)。

主要结果

  • Lemma 3.1 (确定性误差界):在Assumptions 3.1-3.3下,\(e^2 \preceq \lambda_{L1}^2 R_1 + \lambda_{S1}^2 s_1 + \lambda_{L2}^2 R_2 + \lambda_{S2}^2 s_2 + \lambda_{L3}^2 R_3 + \lambda_{S3}^2 s_3\)。这是后续所有定理的基础。
  • Theorem 3.1 (高斯误差):若 \(\text{vec}(E_t) \sim \text{MVN}(0, \Sigma)\) 且 \(\Sigma\) 有可加结构(\(\Sigma_1 \otimes I + I \otimes \Sigma_2 + I \otimes I \otimes \Sigma_3\)),则选择 \(\lambda_{L_k} \propto Q_k \sqrt{2d_k/T}\),\(\lambda_{S_k} \propto Q_k \sqrt{2\log d_k/T} + 4\gamma \alpha_k / \sqrt{d_k d_k}\),可得:
    \[e^2 \leq s_1 \left(c_1 \frac{Q_1^2 \log d_1}{T} + c_2 \frac{\gamma^2 \alpha_1^2}{d_1^2}\right) + \cdots + c_7 R_1 \frac{Q_1^2 d_1}{T} + \cdots\]
    概率至少 \(1 - \max(e^{-c_{10}\log d_1}, e^{-c_{11}\log d_2}, e^{-c_{12}\log d_3})\)。
  • 直觉:稀疏部分代价为 \(s_k \log d_k / T\)(类似Lasso),低秩部分代价为 \(R_k d_k / T\)(类似核范数正则化),非相干项 \(s_k / d_k^2\) 来自低秩与稀疏的纠缠。
  • 必要条件:\(T\) 需足够大使得 \(\log d_k / T\) 和 \(d_k / T\) 小;\(Q_k\) 有限(谱密度有界)。
  • 解决的技术难点:同时控制三个模式的偏差,且误差 \(E_t\) 与 \(Y_{t-1}\) 相关(时序依赖)。通过谱密度工具([1]的Proposition 2.4)得到偏差界。
  • Theorem 3.2 (次指数误差):若 \(\text{vec}(E_t)\) 的每个坐标有 \(\alpha\)-次指数尾(\(\alpha \in (0,1] \cup \{2\}\)),则误差界中 \(\log d_k\) 替换为 \((\log d_k)^{2/\alpha}\),\(d_k\) 替换为 \(d_k^{2/\alpha}\)。概率为 \(1 - \max(e^{-c_{10}(\log d_1)^{2/\alpha}}, \ldots)\)。这推广了高斯情形(\(\alpha=2\) 时退化回Theorem 3.1)。

证明路线与技术技巧

整体路线(以高斯误差为例): 1. 基本不等式:由最优性条件导出式(20),将损失函数差与正则化项差联系起来。 2. 受限集刻画:Lemma A.1和A.2证明误差 \(\hat{\Delta}_{L_k}, \hat{\Delta}_{S_k}\) 属于一个“受限集”,其中核范数和ℓ1范数被低秩和稀疏部分的对应范数控制(式(17)-(19))。这依赖于正则化参数下界(Assumption 3.3)。 3. 确定性误差界:利用受限强凸性(Assumption 3.1)将损失函数下界与Frobenius范数联系起来,再结合基本不等式和受限集性质,得到Lemma 3.1:\(e^2 \preceq \sum_k (\lambda_{L_k}^2 R_k + \lambda_{S_k}^2 s_k)\)。 4. 偏差界(高斯):需要找到 \(\lambda_{L_k}, \lambda_{S_k}\) 使得Assumption 3.3以高概率成立。即控制 \(\|D_k\|_{\text{sp}}\) 和 \(\|D_k\|_\infty\)。利用谱密度工具([1]的Proposition 2.4)和ϵ-net离散化,得到: - \(\|D_1\|_\infty \leq C Q_1 \sqrt{2\log d_1 / T}\) 以高概率(式(52))。 - \(\|D_1\|_{\text{sp}} \leq C Q_1 \sqrt{2d_1 / T}\) 以高概率(式(57))。 类似得到 \(D_2, D_3\) 的界。代入Lemma 3.1即得Theorem 3.1。 5. 次指数推广:将[1]的偏差界推广到\(\alpha\)-次指数线性过程(Lemma A.3-A.6),主要工具是Götze et al. (2019)的多项式浓度不等式。关键是将Hanson-Wright型不等式推广到次指数尾,并处理时序依赖(通过谱密度)。最终得到类似但更慢的速率(\(\log d_k\) 变为 \((\log d_k)^{2/\alpha}\))。

关键跳跃点: - 受限强凸性的验证:Lemma A.6证明在次指数误差下,样本协方差矩阵在稀疏锥上满足RSC。这需要将[1]的证明从高斯推广到次指数,依赖Lemma A.3的浓度不等式。 - 非相干条件的处理:在确定性误差界推导中,需要处理 \(\langle \hat{\Delta}_{L_k}, \hat{\Delta}_{S_k} \rangle\) 项,通过非相干条件将其上界为 \(\gamma \| \hat{\Delta}_{L_k} \|_\infty \| \hat{\Delta}_{S_k} \|_1 \leq \gamma (2\alpha_k / \sqrt{d_k d_k}) \| \hat{\Delta}_{S_k} \|_1\),然后被正则化项吸收(式(29)附近)。这是低秩+稀疏可识别的关键。

技术技巧点名: - 可分解正则化框架(Negahban et al. 2012 [30]):用于刻画核范数和ℓ1范数的受限集性质(Lemma A.1, A.2)。 - 谱密度与偏差界(Basu & Michailidis 2015 [1]):用于处理时序依赖下的偏差,包括ϵ-net离散化和谱密度最大特征值有界假设。 - 多项式浓度不等式(Götze et al. 2019 [34]):用于次指数情形,推广Hanson-Wright型不等式到\(\alpha\)-次指数随机变量(Lemma A.3)。 - 交替块最小化:算法1,每个子问题凸,可用近端梯度法或软阈值求解。

真实例子与应用

  • 数据:NYC TLC Yellow Taxi Trip Record,2017年1月至2026年2月共110个月。构造 \(6 \times 6 \times 5\) 张量:6个行政区(含EWR)作为起/终点,5个时段(早高峰、午间、晚高峰、夜间、深夜)。每个条目为对应起-终点-时段的月均出租车次数。
  • 方法应用:运行Algorithm 1,选择正则化参数使AIC最小(Section 4.2末)。得到 \(\hat{L}_1, \hat{L}_2, \hat{L}_3\) 均为秩3,\(\hat{S}_1, \hat{S}_2, \hat{S}_3\) 高度稀疏(图5.5)。
  • 结果:
  • 对 \(\hat{L}_1\)(起点模式)做varimax旋转,得到三个因子:机场相关(EWR vs Queens)、商业vs住宅(Manhattan vs Bronx/Brooklyn)、Staten Island孤立(图5.2)。
  • 对 \(\hat{L}_2\)(终点模式)类似:Staten Island孤立、核心城市需求(Manhattan/Brooklyn/Queens)、机场相关(图5.3)。
  • 对 \(\hat{L}_3\)(时段模式):夜间、午间vs深夜、早高峰vs晚高峰(图5.4)。
  • 预测比较(表5.2):对h=1,2,3,本文Additive TAR的RMSE(0.761, 0.747, 0.746)低于Tucker-based TAR(0.801, 0.794, 0.798)和稀疏VAR(1.229, 1.113, 1.053)。
  • 这个例子想说明什么:验证模型的可解释性(因子结构有实际意义)和预测优越性(加性结构优于乘性Tucker和朴素向量化)。同时展示AIC准则可用于实际选择正则化参数。

🔎 结论是否比证明窄

  • 窄的地方:Theorem 3.1和3.2的误差界中,非相干项 \(s_k \gamma^2 \alpha_k^2 / d_k^2\) 在 \(d_k\) 固定时是常数阶,不随 \(T\) 衰减。这意味着即使 \(T \to \infty\),误差也不会趋于0,除非 \(d_k \to \infty\) 或 \(\alpha_k \to 0\)。但作者在模拟中(表4.1,4.2)显示RE随T增加而下降,说明实际中非相干项可能被常数掩盖或假设更强。作者未明确讨论这一矛盾。
  • 泛化的claim:作者在Section 1末声称“the proposed methodology and the subsequent theoretical developments are novel contributions”,但理论部分仅覆盖一阶自回归和三维张量。对于更高阶滞后或更高维张量,仅在第6节作为未来工作提及,未给出理论保证。
  • 未证明的conjecture:在Discussion中,作者说“Though our proposed algorithm and all the theoretical derivations follow for this case as well”(指 \(D>3\)),但并未给出具体定理或证明,只是推测。

四、开放问题

  1. 动态因子模型的加性版本:作者在Section 6提到,可将加性思想用于矩阵因子模型([40]),即用加性行、列、管因子载荷替代双线性形式。这是一个直接扩展,但需要重新建立可识别性和误差界。扎根于论文Section 6第一句:“this method can be explored in the context of dynamic factor model as well”。

  2. 更高维张量(\(D>3\))的可视化与算法:当 \(D>3\) 时,模式展开和折叠操作仍可行,但“visualize different mode-wise matricized data”困难。作者建议“explore a new variant ... that provides a more effective visualization”。扎根于Section 6第二段。

  3. 贝叶斯加性张量自回归:作者指出“overall Bayesian literature is sparse in the context of matrix and tensor-variate time series models”,并建议贝叶斯实现和理论。扎根于Section 6末句。

  4. 非相干项 \(s_k / d_k^2\) 的紧性:Theorem 3.1中非相干项不随 \(T\) 衰减,但模拟中RE下降。是否可能通过更精细的证明(如利用 \(L_k\) 的奇异向量非相干)消除该项?或者这是低秩+稀疏可识别性的固有代价?这需要检查Lemma 3.1证明中非相干项的处理(式(29)附近),看是否可改进。这是一个理论问题,扎根于Theorem 3.1的表达式和模拟结果(表4.1,4.2)。


Maintained by 陈星宇 · Homepage · Source on GitHub

评论