[國集論文筆記] 淺談保序迴歸問題

C202044zxy 發表於 2021-03-13

1.前言

這個東西其實就是把國家集訓隊的論文照抄下來,但是由於作者會加一些自己的理解(相當於是加註釋),希望能讓原本晦澀的論文好懂一些,也方便自己複習。

由於我看得比較慢,所以這篇文章可能更新得很慢

2.保序迴歸問題

偏序關係

\(R\) 是集合 \(S\) 上的一個二元關係,若 \(R\) 滿足:

  • 自反性:\(\forall x\in S\),有 \(x\space R\space x\)
  • 反對稱性:\(\forall x,y\in S\),若有 \(x\space R\space y,y\space R\space x\),則有 \(x=y\)
  • 傳遞性:\(\forall x,y,z\in S\),若有 \(x\space R\space y,y\space R\space z\),則有 \(x\space R\space z\)

那麼就稱為 \(R\)\(S\) 上的非嚴格偏序關係,記作 \(\preceq\)

這個東西感性理解一下就行,\(oier\) 誰管這些定義?

問題描述

我們有一張 \(n\) 個點的表示偏序關係的有向圖,給定兩個代價陣列 \(y\)\(w\),每條邊表示連線的兩個點之間有直接的偏序關係,那麼圖上兩個點滿足 \(v_i\preceq v_j\) 當且僅當在圖上有一條簡單路徑。

求陣列 \(f\) 滿足 \(\forall v_i\preceq v_j\),都有 \(f_i\leq f_j\),那麼最小化迴歸代價

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

\[\max_{i=1}^nw_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_{v_i\in U}w_i|y_i-k|\) 最小的 \(k\)

也就是如果一堆點非要選一個相同的 \(f\) 那麼選哪個數會最好。

3.特殊情形下的演算法

一種貪心演算法

例一:題目描述

給定正整數序列 \(y,w\),求單調不減的實數序列 \(f\),最小化 \(\sum_{i=1}^nw_i(f_i-y_i)^2\)

\(n\leq 200000\)

例一:解法

本題的偏序關係就是 \(f_i\leq f_j\) 的一條鏈,先給出兩個比較重要的結論。

結論1:點集 \(U\)\(L_2\) 均值為其加權平均數 \(\frac{\sum_{v_i\in U}w_iy_i}{\sum_{v_i\in U}w_i}\)

直接把平方展開之後就是二次函式的最值點。

如果有凸單調性但是更為複雜的函式最值,說不定可以讓導數為 \(0\) 然後反解出那個位置的 \(x\)

結論2\(\forall 1\leq i<n\),如果有 \(y_i>y_{i+1}\),那麼最優解一定有 \(f_i=f_{i+1}\)

證明用到了微調法反證法,如果在最優解中 \(f_i<f_{i+1}\),那麼我們選擇極小的 \(\epsilon>0\),得到的 \(f_i'=f_i+\epsilon w_{i+1},f_{i+1}'=f_{i+1}-\epsilon w_i\),你可能覺得這樣微調有點奇怪,但是這樣能讓微調的變化取決於 \(y_i\)\(y_{i+1}\) 的關係,展開就知道了:

\[w_i(f_i'-y_i)^2+w_{i+1}(f_{i+1}'-y_{i+1})^2-w_i(f_i-y_i)^2-w_{i+1}(f_{i+1}-y_{i+1})^2 \]

\[=-2\epsilon w_{i}w_{i+1}(f_{i+1}-f_i+y_i-y_{i+1})+\epsilon^2w_iw_{i+1}(w_i+w_{i+1})<0 \]

雖然我不是很懂極限,這個柿子和 \(0\) 的關係取決於一階無窮小的大小,那麼微調後答案變小,所以矛盾。

回到這道題,我們考慮怎麼利用這兩個結論,由於 \(f\) 取等的條件是 \(y_i>y_{i+1}\),那麼我們可以維護關於 \(y\) 的單調不減的單調棧,如果已知一個集合中的點取的 \(f\) 是相同的,那麼可以把這個集合合併為一個點考慮,最優取值就是其 \(L_2\) 均值,具體的演算法流程是這樣的:

  • 維護一個單調棧,棧內的每個元素為 \((S_i,y_i',w_i')\),分別表示這個元素代表的集合,這個集合的 \(L_2\) 均值,這個集合的 \(w_i\) 的求和。
  • 每次就加入 \((\{i\},y_i,w_i)\),如果有 \(y'_{top}>y_i\),那麼直接把這兩個集合合併,新集合的 \(L_2\) 均值也可以很好地算出來,那麼把原來的元素刪除,再把 \((\{i\}|S_{top},\frac{y_i+y'_{top}}{w_i+w'_{top}},w_i+w'_{top})\) 加入單調棧中即可,然後繼續看這個元素能不能彈出棧頂。
  • 最後 \(f_i\) 就是集合包含 \(i\) 元素的 \(L_2\) 均值(也就是 \(y'_{x}\)

上述演算法的時間複雜度 \(O(n\log n)\)(因為好像要維護集合),如果能算出 \(L_p\) 均值那麼是可以向 \(L_p(1\leq p<\infty)\) 擴充套件的。

這個演算法的侷限性在於結論 \(2\) 並不是一直適用的,如果換了一個偏序關係就 \(gg\) 了。

相關文章