前言
保序回歸問題應該算是一個非常詭異也非常困難的問題。
只是因為去年聯合省選出了,出於義務決定學習一下。然而也沒能學得特別深(實力限制),只能算作是淺談。
參考的是高睿泉的論文《淺談保序回歸問題 》,只是記下了其中的一部分內容。
偏序關系
一個非常基礎的概念,但這里還是簡單講一下。
設\(\texttt{op}\)是集合\(S\)上的一種二元運算,滿足:
- 自反性:\(\forall x\in S,x\ \texttt{op}\ x\)。
- 自對稱性:\(\forall x,y\in S\),若\(x\ \texttt{op}\ y\)且\(y\ \texttt{op}\ x\),則\(x=y\)。
- 傳遞性:\(\forall x,y,z\in S\),若\(x\ \texttt{op}\ y\)且\(y\ \texttt{op}\ z\),則\(x\ \texttt{op}\ z\)。
那么,就稱\(\texttt{op}\)是\(S\)上的非嚴格偏序關系,記作\(\le\)。
\(L_p\)問題的定義
給定正整數\(p\),一張點集為\(V\),邊集為\(E\)的有向無環圖\(G\),每個點上有兩個代價參數\(y_i\)和\(w_i\)。
對於\(G\)中的一條有向路徑\(v_i\rightarrow v_j\),它表示的是\(v_i\le v_j\)。
而我們要做的是求出一個點值序列\(f\),滿足\(\forall v_i\le v_j,f_i\le f_j\),最小化代價:
對於相同的\(p\),這種問題就稱作\(L_p\)問題。
整體二分求解保序回歸問題
一些特殊的保序回歸問題有着特殊的解法,但這里只介紹它的通法,就是整體二分。
在此之前先定義一個序列\(s\)向集合\(S=\{a,b\}\)取整的概念,就是指讓\(s\)中小於\(a\)的所有數變成\(a\),大於\(b\)的所有數都變成\(b\),使得所有的數都落在\(S=\{a,b\}\)這個值域區間內。
然后我們在原問題的基礎上構造一個新的\(S=\{a,b\}\)問題,就是要讓原問題不僅滿足原本的限制,還要讓所有\(f_i\in[a,b]\),同時最小化回歸代價。
對此,來要分\(p\)是否等於\(1\)兩種情況來討論。
第一類:\(p=1\)
引理: 在\(L_1\)問題中,如果任意\(y_i\)均不在區間\((a,b)\)中,且存在一個最優解序列\(z\)滿足任意\(z_i\)均不在區間\((a,b)\)中,若\(z^S\)為\(S\)問題的一組最優解,那么原問題一定存在一個最優解序列\(z\)滿足\(z\)可以向\(S\)取整得到\(z^S\)。
證明就考慮反證法,要分成多類討論,這里略去了。
根據這個引理,只要通過一組\(S\)問題的最優解,就能確定原問題中\(z_i\)與\((a,b)\)的大小關系。
因此我們只需整體二分,每當二分到一個區間\([L,R]\)的時候,只需求解其中\(S=\{mid,mid+1\}\)的問題的最優解,這樣一來就能確定出每個\(f_i\)的取值應該落在哪半區間中了。
第二類:\(1<p<\infty\)
定義一個點集的\(L_p\)均值為滿足\(\forall f_i=k\)時回歸代價最小的\(k\)。
引理: 當\(1<p<\infty\)時,點集的\(L_p\)均值唯一。
證明就是考慮對於\(g(x)=\sum_{v_i\in V}|x-y_i|^p\)求導,發現:
因為隨着\(x\)的增大,前者顯然遞增,后者顯然遞減,二者相減則\(g'(x)\)必然單調,因此\(g'(x)\)至多只有一個零點。
又由於\(\forall y_i<x\)時顯然\(g'(x)>0\),\(\forall y_i>x\)時顯然\(g'(x)<0\),因此\(g'(x)\)必然有零點。
其實對於\(1<p<\infty\)時的情況,我們仍舊能像前面那樣子去整體二分,只不過最優解可能為實數。
實數的情況下,只要把代價修改為中點處的導數即可。
網絡流處理\(S\)問題
整體二分時要處理\(L_p\)問題對應的\(S\)問題,相當於是一個集合划分,每個點只有兩種選擇。
而一對偏序關系\(v_i\le v_j\),此時就能看作把\(v_i\)選入了右集合就必須把\(v_j\)也選入右集合,成了經典的最小權閉合子圖問題,可以網絡流求解。
算法流程總結
我們整體二分,記錄當前點集對應的答案區間\([L,R]\)。
把區間根據\(mid\)划分成兩份,每個點計算選入左右區間的貢獻差,與源點和匯點連邊。
按照最小權閉合子圖的套路,給存在偏序關系的點之間連邊。
跑網絡流,由於網絡流會跑到增廣失敗才結束,最后一次增廣失敗時未被訪問到的點相當於是保留與匯點的邊被選入左集合,被訪問到的點相當於是保留與源點的邊被選入右集合
然后遞歸下去做即可。