保序回归问题学习笔记

保序回归问题

发现好像保序回归鸽了太久了,总是被喜欢保序回归的 \(\text{CXY07}\) 暴虐,悟一下论文

问题描述

给定正整数 \(p\),和一张偏序关系形成的 \(DAG\),和代价函数 \((y,w),w_i>0\),其中如果 \(i\) 能到达 \(j\),则有 \(v_i\leq v_j\) 的偏序关系

求点值序列 \(f\),满足对于点对 \((i,j)\) 满足 \(v_i\leq v_j\),均有 \(f_i\leq f_j\),最小化回归代价:

\[\sum_{i=1}^nw_i|f_i-y_i|^p,p\in[1,+\infty)\\ \max\{w_i|f_i-y_i|\},p=+\infty \]

对于相同的 \(p\),统称 \(L_p\) 问题

约定

  1. 称"将序列 \(a\) 中不大于 \(l\) 的元素变为 \(l\),不小于 \(r\) 的元素变成 \(r\)"为将序列 \(a\) 向集合 \([l,r]\) 取整
  2. 点集 \(S\)\(L_p\) 均值为满足最小化 \(\sum_{i=1}^nw_i|v-y_i|^p,p\in[1,+\infty)\)\(\max\{w_i|v-y_i|\},p=+\infty\)\(v\)

特殊情形下的做法

贪心算法——例1 Approximation

给定长度为 \(n\) 的正整数序列 \(y,w\) ,求单调不减的实数序列 \(f\) ,最小化 \(\sum_{i=1}^nw_i(f_i-y_i)^2\)

\(n\leq 2\times 10^5\)

​ 引理 1:点集 \(S\)\(L_2\) 均值为其加权平均数 \(\dfrac{\sum_{i\in S}w_iy_i}{\sum_{i\in S}w_i}\)

​ 证明:运用导数易证

​ 引理 2:\(\forall 1\leq i<n\),若有 \(y_i>y_{i+1}\),那么最优解中一定满足 \(f_i=f_{i+1}\)

​ 证明见论文

​ 有了上述两个引理算法就很 naive 了

​ 我们只需要把 \(y_i>y_{i+1}\)\(i\) 全部合并到一起用 \(L_2\) 均值即可

​ 具体实现可以使用单调栈,时间复杂度 \(O(n)\)

事实上,这样的做法可以扩展到 \(1\leq p<+\infty\),只需将 \(L_2\) 均值改成 \(L_p\) 均值即可

但是这个做法无法推广到一般的偏序结构上,因为引理2不再成立

维护折线算法——例2 「2018 集训队互测 Day 2」有向图

给定一个 \(n\) 个点 \(n−1\) 条边的有向弱连通图 \(G = (V, E)\) ,每个点均有点权 \(d_i\) 和修改耗时 \(w_i\)

对于每个 \(i(1\leq i\leq n)\) ,每次修改可以花费 \(w_i\) 的时间把 \(d_i\)\(1\) 或减 \(1\) ,求最少消耗多少时间,使得 \(\forall(u, v)\in E,d_u ≤ d_v\)

\(n\leq 3\times 10^5,1\leq d_i\leq 10^9,1\leq w_i\leq 10^4\)

​ 题目等价于偏序集为一棵树的 \(L_1\) 问题,即最小化 \(\sum_{i=1}^nw_i|f_i-d_i|\)

​ 容易想到树形 dp

​ 首先,\(f_i\) 的取值一定在集合 \(D=\{d_1,d_2,\dots,d_n\}\) 中,记 \(D_i\) 表示集合 \(D\) 中第 \(i\) 小的元素

​ 设 \(f_{i,j}\) 表示 \(f_i=D_j\) 且将边看成无向边时,最小的 \(\sum_{k\in subtree(i)}w_k|f_k-d_k|\)

​ 动态规划的转移可以根据子边的指向利用 \(P_{i,j}=\min_{k\leq j}f_{i,k},S_{i,j}=\min_{k\geq j}f_{i,k}\) 来转移

​ 引理:\(\forall x\in [1,n],f_x,P_x,S_x\) 均为斜率单调不降的折线

​ 证明:对于叶子节点 \(x\),显然满足

​ 对于任意节点 \(x\) ,其 \(f_x\) 可以由其所有子节点的 \(P_x\)\(S_x\) 以及折线 \(y=w_i|x−d_i|\) 叠加得到

​ 而 \(P_x\) 为将 \(f_x\) 斜率大于 \(0\) 的部分变成 \(y=\min f_{i,j}\)\(S_x\) 为将 \(f_x\) 斜率小于 \(0\) 的部分变成 \(y=\min f_{i, j}\)

​ 所以可以归纳地证明结论

​ 可以用线段树维护折线 \(f,P,S\) 的每一段,显然折线的分界点在集合 \(D\)

​ 运用线段树合并即可实现此问题,时间复杂度 \(O(n\log n)\)

我们发现维护折线的做法仍然无法向一般的偏序结构上扩展,瓶颈在于需要整张图的偏序结构支持自底向上的 dp

一般问题的做法

整体二分法

考虑在 \(L_p\) 问题的基础上构造一个新的 \(S=(a,b)\) 问题:

在满足原问题的所有限制条件下还满足限制 \(a\leq f_i\leq b\),最小化回归代价

\(p=1\) 的情况

引理:在 \(L_1\) 问题中,如果任意 \(y_i\) 均不在区间 \((a,b)\) 内,且存在一个最优解序列 \(f\) 满足其 元素 \(f_i\) 均不在区间 \((a,b)\) 内,若 \(f^S\)\(S\) 问题的一组最优解,那么一定存在 \(f\) 是原问题的一组最优解且 \(f\) 可以通过向 \(S\) 取整得到 \(f^S\)

​ 证明见论文

根据引理,通过一组 \(S\) 问题的最优解,可以知道某一组原问题最优解中 \(f_i\)\(a,b\) 的大小关系

对于 \(L_1\) 问题,最优解 \(f_i\) 一定在 \(Y=\{y_1,y_2,\dots,y_n\}\) 中,故只需要在该集合上做整体二分:

当二分到区间 \([l,r]\) 时,计算 \(S=(Y_{mid},Y_{mid+1})\) 问题的最优解,即可将节点划分到左右两边

这样对于每个节点,仅需 \(\log n\) 层计算即可确定选值

\(1<p<+\infty\) 的情况

引理 1:当 \(1<p<+\infty\) 时,任意集合 \(S\)\(L_p\) 均值是唯一的

​ 证明:求导证明导函数单调性和至少有一个零点即可,具体证明见论文

引理 2:如果 \(V\) 的任意非空子集的 \(L_p\) 均值均不在区间 \((a, b)(a<b)\) 内,且存在最优解 \(f\) 满足其元素 \(f_i\) 也均不在 \((a,b)\) 内。若 \(\hat f\) 为相同偏序集上代价函数为 \((y',w')\)\(L_1\) 问题的一组最优解:

\[(y'_i,w'_i)=\left\{\begin{matrix}(0,w_i((b-y_i)^p-(a-y_i)^p)),y_i\leq a\\(1,w_i((y_i-a)^p-(y_i-b)^p)),y_i>a\end{matrix}\right. \]

存在 \(f\) 是原问题的一组最优解,满足 \(\hat f_i=0\) 当且仅当 \(f_i\leq a\)

​ 证明见论文

根据引理1,最优解中的元素和所有的 \(L_p\) 均值的并集为有限集,故对于任意 \(a\) ,一定存在 \(\epsilon>0\),满足区间 \((a,a+\epsilon)\) 中不存在上述元素

考虑到引理2中的 \(w'_i\) 直接做是一个浮点数,可能有精度问题,我们可以把所有 \(w'_i\) 除以 \(\epsilon\)

\(w'_i\)\(f(x)=w_i(x-y_i)^p\)\(w_i(y_i-x)^p\) 的导数即可,注意第二种式子可能需要带负号

套用 \(p=1\) 的做法,改成实数上整体二分即可

对于 \(f_i\) 取值为整数的情况下,可以参考 [省选联考 2020 A 卷] 魔法商店

建立网络流模型

对于 \(L_1\) 上的 \(S\) 问题,可以看作一个 \(0/1\) 决策问题,而 \(f_i\leq f_j\) 的限制可以看作 \(f_i\)\(1\)\(f_j\) 也得选 \(1\)

这样问题就变为了经典的最小权闭合子图问题,可以用网络流解决

例3 ExtremeSpanningTrees

给定一张 \(n\) 个点 \(m\) 条边的无向连通图 \(G = (V, E)\) 和边集 \(E_1,E_2(E_1,E_2\in E)\) ,每条边有初始的权值 \(d_i\) ,每次操作可以把一条边的权值加 \(1\) 或减 \(1\) ,求通过最少多少次操作可以满足:

  1. 边集 \(E_1\) 组成的子图是整张图的最小生成树
  2. 边集 \(E_2\) 组成的子图是整张图的最大生成树

\(n\leq 50,m\leq 1000\)

可以对 \(m\) 条边建立偏序关系,计算生成树中非树边和其对应树上路径中的树边的偏序关系

之后问题转化为一般偏序集上的 \(L_1\) 问题

特殊偏序结构上的优化

树上问题

对于类似例2的偏序集为树形的保序回归问题,可以在整体二分的基础上套用线性的树形 dp 来解决 \(S\) 问题

特别的是,该算法能够扩展到仙人掌上,在环上 dp 时只用枚举一个点的 \(0/1\) 选值,破环成链即可

时间复杂度为 \(O(n\log n)\)(忽略了计算 \(x^{p-1}\) 的复杂度)

多维偏序

未施工

\(L_{\infty}\) 问题的算法

二分法

由于 \(L_{\infty}\) 问题要求最小化 \(\max\),想到二分答案

每次二分后可以确定每个点的选值范围,然后在 \(DAG\) 上 dp

计算每个点在考虑完所有其后继节点后 \(f_x\) 的最小值并检查其是否可行

时间复杂度 \(O(m\log \max{y_i})\)

posted @ 2021-09-20 23:10  juju527  阅读(321)  评论(0编辑  收藏  举报