[学习笔记] 保序回归问题

保序回归问题

参考2018年集训队论文《浅谈保序回归问题》

问题描述

注意这里的偏序关系是非严格偏序关系。
给定正整数 \(p\), 一张有向无环图 \(G\), 以及代价函数 \((y_i, w_i) (\forall i, w_i > 0)\)。如果在 \(G\) 中有 \(v_i \rightarrow v_j\) 的有向路径, 那么存在偏序关系 \(v_i \leq v_j\) 。求点值序列 \(f\), 满足 \(\forall v_i \leq v_j (i, j \in [1, n])\) , 有 \(f_i \leq f_j\), 最小化下列回归代价。

\[\sum_{i = 1}w_i|f_i - y_i|^p, 1 \leq p 《 \infty \]

\[\max_{i = 1}w_i|f_i - y_i|, p = \infty \]

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

一些约定

  • 将序列 \(z\) 中不超过 \(a\) 的元素变为 \(a\) ,不小于 \(b\) 的元素变为 \(b\) 称为序列 \(z\) 向集合
    \(S = {a, b}\) 取整。
  • 点集 \(U\)\(L_p\) 均值为满足 \(\sum_{v_i \in U}w_i|y_i - k|^p(1 \leq p < \infty)\)\(\max_{i = 1}w_i|k - y_i|, p = \infty\) 最小的 \(k\)

特殊情况下的算法

一种贪心算法

Approximation 加强版

给定正整数序列 \(y, w\), 求一个单调不减的实数序列 \(f\), 最小化 \(\sum_{i = 1}^nw_i(f_i - y_i)^2\)
\(n \leq 2\times 10^5\)
Problem Link

可以发现这种情况下可以直接计算其 \(L_2\) 均值, 其 \(L_2\) 均值为 \(\frac{\sum_{v_i\in U}w_iy_i}{\sum_{v_i\in U}w_i}\) 。直接求一阶导数即可证明。
还有一个性质是, 如果 \(y_{i + 1} > y_i\) , 那么 \(f_i = f_{i + 1}\)

那么有这样一个基于贪心的算法。

  • 考虑维护一个栈, 栈中元素为一个三元组 \((S, y, w)\) 。其中 \(S\) 是一个集合。
  • 从左往右扫描, 每次加入元素 \(({i}, y_i, w_i)\) 。 如果存在某个时刻使得栈顶的 \(y\) 小于栈顶下面那个数的 \(y\), 弹出栈顶, 根据之前的 \(f\) 相等的结论, 合并之前弹出的栈顶和当前的栈顶即可。
  • 具体来说, 令新元素为 \((S_1 \cup S_2, \frac{y_1w_1+y_2w_2}{w_1+w_2}, w_1 + w_2)\)
  • 最后每个元素所属集合对应得 \(y\) 就是答案了。
  • 基于扰动容易看出答案正确。

维护折线的算法

由于在保序回归中折线算法可以被整体二分代替, 不为讨论。

一般问题的算法

新问题的构造

\(L_p\) 基础上加入另一个限制,得到 \(S = (a,b)(a<b)\) 问题:满足原问题所有限制的同时,还满足 \(a\leq f_i \leq b\) ,最小化回归代价。

\(p = 1\) 的情况

讨论

有一个性质, 最优解的所有 \(f\) 都在 \({y_i}\) 中。
有一个引理, 在 \(L_1\) 问题中, 如果

  • 任意 \(y_i\) 不在区间 \((a, b)\)
  • 存在一个最优解序列 \(z\) 满足 \(z_i\) 均不在 \((a,b)\) 中。
  • \(z^S\)\(S\) 问题的一个最优解。

那么一定存在一组最优解 \(z\), 使得 \(z\)\(S\) 取整可以得到 \(z^S\)
那么有下面这样的整体二分做法。
考虑整体二分 \(z^S\) 的取值, 二分到 \(y_l, y_r\) 的时候, 计算 \(S = (y_{mid}, y_{mid + 1})\) 的最优解, 然后根据每个 \(z\) 选择了 \(y_{mid}\) 还是 \(y_{mid + 1}\) 就可以确定其取值在 \([y_l, y_{mid}]\) 中还是在 \([y_{mid + 1}, y_r]\) 中。然后递归下去就好。
至于如何求最优解,可以发现这就是一个 \(01\) 选择的问题, \(f_i \leq f_j\) 相当于 \(f_i\)\(1\) 的时候, \(f_j\) 必须选 \(1\) , 使用网络流做最大权闭合子图即可。

ExtremeSpanningTrees

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

  • 边集 \(E1\) 组成的子图是整张图的最小生成树
  • 边集 \(E2\) 组成的子图是整张图的最大生成树

\(n ≤ 50, m ≤ 1000\)

要求是最小生成树实际上就是要求树上的边小于等于环上的边, 最大生成树类似。把所有的限制拿出来。
据说虽然论文里面要求是 \(DAG\), 但是不是 \(DAG\) 也是可以直接做的, 据说不影响结论证明。
那么直接按照论文搞就好了, 复杂度 \(O(nm^3\log_2m)\)

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

讨论

引理 : 可以证明任意集合 \(U\)\(L_p\) 均值唯一,且代价函数在 \(<L_p\) 时递减, \(>L_p\) 时递增。
证明可以考虑对函数求导以后, 只有一个零点。
然后还有这样一个引理 :

\(solve(U, a, b)\) 的一组最优解为 \(z'\) , 且满足 \(z' \notin (a, b), \forall i \in U\) 。则
存在 \(solve(U, l, r)\) 的一组最优解 \(z\), 使得 \(z_i \leq a\) 当且仅当 \(z_i' = a\)

\(solve(U, mid, mid + \epsilon)\)的过程与 \(L_1\) 相同, 节点 \(i\) 的权值为 \(w_i[(b - y_i) ^ p - (a - y_i)^p]\) 。取反以后是最大权闭合子图。
那么有这个引理的话, 可以用 \(solve(U, mid, mid + \epsilon)\) 的结果确定 \(z\) 的范围然后整体二分。
考虑一定存在足够小的 \(\epsilon\) 可以区分所有点, 考虑把所有点的权值除以 \(\epsilon\), 那么权值就是 \(w_i(mid - y_i)^p\) 关于 \(mid\) 的导数。当 \(p = 2\) 时, 权值为 \(2w_i(mid - y_i)\)

[省选联考 2020 A 卷] 魔法商店

Problem Link

把线性基里面 \(A\) 可以替换 \(B\) 看成一条边, 可以建立一个DAG。
然后就是跑跑跑。
记录实现细节。

  • 由于要求是整数, 所以在 \(R - L = 1\) 的时候特殊处理。
  • 分治的时候, 每个点的权值是 \(- 2w_i(mid - y_i)\) 这样就是最大权闭合子图。
  • 和源点连接的是在大的那一边。也就是最后一次跑到的是在大的那一边。因为没割掉才算选取。
  • 特判 \(R - L = 1\) 的时候, 代价差也就是每个点的权值是 \(- (L + 1 - y_i)^2 + (L - y_i) ^ 2 = - 2(y_i - L) - 1\) 。也就是小减大。
posted @ 2022-01-20 16:47  HN-wrp  阅读(40)  评论(0编辑  收藏  举报