等距迴歸
| 一位華夏公益教科書使用者認為此頁面應該分成更小的頁面,包含更窄的子主題。 您可以透過將此大頁面拆分成更小的頁面來提供幫助。請確保遵循命名策略。將書籍分成更小的部分可以提供更多關注,並允許每個部分都做好一件事,這對每個人都有利。 |
給定值及其對應的正權重,儘可能接近地用逼近它們,這些值滿足類約束。
- 給定
- 值,
- 權重,使得對於所有都有,
- 約束集,
- 最小化 相對於 ,受制於 對所有
如果所有權重都等於 1,則該問題稱為無權單調回歸,否則稱為有權單調回歸。
圖 必須是無環的。例如,約束 和 不能同時存在。
例子
- 最小化 受制於
線性順序
[edit | edit source]特別有趣的是線性順序單調回歸。
- 給定
- 值,
- 權重,使得對於所有都有,
- 最小化 相對於 ,受制於

對於線性順序單調回歸,存在一種簡單的線性演算法,稱為#相鄰違反者池演算法 (PAVA)。
如果所有權重都等於 1,則該問題稱為無權線性排序單調回歸。
線性順序單調回歸可以被認為是用非遞減函式逼近給定的 1 維觀測序列。它類似於平滑樣條,區別在於我們使用單調性而不是平滑性來消除資料中的噪聲。
例子
[edit | edit source]
- 單調回歸用於 個點。
- 左邊:點 ,其中 。 的機率由邏輯函式決定。僅顯示了 1000 個點。
- 右邊:單調回歸的結果(黑色曲線)與邏輯函式(紅色曲線)對比。邏輯函式以高精度恢復。
線性排序單調回歸作為模型
[edit | edit source]有時,線性排序單調回歸被應用於一組觀測值 ,其中 是解釋變數,y 是因變數。這些觀測值按其 排序,然後將單調回歸應用於 ,同時附加約束 對於所有 。
其他變體
[edit | edit source]非歐幾里得度量
[edit | edit source]有時使用其他度量代替歐幾里得度量,例如 度量
或未加權的 度量
網格上的點
[edit | edit source]有時,值被放置在二維或更高維度的網格上。擬合值必須沿著每個維度增加,例如
- 最小化 關於 y,受制於
相鄰違規者演算法 (PAVA) 是一種用於線性階等距迴歸的線性時間(和線性記憶體)演算法。
該演算法基於以下定理
定理:對於一個最佳解,如果 ,那麼
證明:假設相反,即 。然後對於足夠小的 ,我們可以設定
這會減少總和 而不違反約束。因此,我們最初的解不是最優解。矛盾。
由於 ,我們可以將兩點 和 合併為一個新點 .

然而,在將兩個點 和 合併到新的點 後,這個新點可能會違反約束 。在這種情況下,它應該與 個點合併。如果合併後的點違反了它的約束,它應該與前一個點合併,依此類推。
演算法
[edit | edit source]輸入
- 包含
n個值的陣列:initial_values[1] ... initial_values[n] - 包含
n個權重的陣列:weights[1] ... weights[n]
輸出
- 名為
results的陣列 (results[1] ... results[n]),透過i對weights[i] * (initial_values[i] - results[i]) ** 2的總和進行最小化
演算法
- 初始化
- pooled_value[1] = initial_values[1]
- pooled_weight[1] = weights[1]
- num_segments = 1
- segment_end[0] = 0
- segment_end[1] = 1
- 對於 current_index = 2 到 n 執行
- num_segments++
- pooled_value[num_segments] = initial_values[current_index]
- pooled_weight[num_segments] = weights[current_index]
- 當 num_segments > 1 且 pooled_value[num_segments] < pooled_value[num_segments - 1] 時執行
- pooled_value[num_segments - 1] =
- (pooled_weight[num_segments] * pooled_value[num_segments] + pooled_weight[num_segments - 1] * pooled_value[num_segments - 1]) /
- (pooled_weight[num_segments] + pooled_weight[num_segments - 1])
- pooled_weight[num_segments - 1] += pooled_weight[num_segments]
- num_segments--
- pooled_value[num_segments - 1] =
- segment_end[num_segments] = current_index
- 對於 segment_index = 1 到 num_segments 執行
- 對於 value_index = segment_end[segment_index - 1] + 1 到 segment_end[segment_index] 執行
- result[value_index] = pooled_value[segment_index]
- 對於 value_index = segment_end[segment_index - 1] + 1 到 segment_end[segment_index] 執行
這裡 定義了每個新點對應於哪些舊點。
任意情況演算法
[edit | edit source]在任意情況下,這可以作為二次問題解決。最佳演算法需要 時間,參見
- Maxwell, WL and Muckstadt, JA (1985), "Establishing consistent and realistic reorder intervals in production-distribution systems", Operations Research 33, pp. 1316-1341.
- Spouge J, Wan H, and Wilbur WJ (2003), "Least squares isotonic regression in two dimensions", J. Optimization Theory and Apps. 117, pp. 585-605.
實現
[edit | edit source]R
[edit | edit source]isoreg
[edit | edit source]函式 isoreg 執行非加權線性排序等距迴歸。它不需要任何包。對於許多簡單的情況,它就足夠了。
使用示例
x=sort(rnorm(10000))
y=x+rnorm(10000)
y.iso=isoreg(y)$yf
plot(x,y,cex=0.2)
lines(x,y.iso,lwd=2,col=2)
該isoreg函式還將線性排序等距迴歸實現為模型
x=rnorm(10000)
y=x+rnorm(10000)
y.iso=isoreg(x,y)$yf
plot(x,y,cex=0.2)
lines(sort(x),y.iso,lwd=2,col=2)
Iso
[edit | edit source]Iso 包包含三個函式
- pava - 線性排序等距迴歸,加權或非加權。
- biviso - 2-d 等距迴歸
- ufit - 單峰排序(先遞增後遞減)
使用示例
install.packages("Iso") # should be done only once
library("Iso") # should be done once per session
x=sort(rnorm(10000))
y=x+rnorm(10000)
y.iso=pava(y)
plot(x,y,cex=0.2); lines(x,y.iso,lwd=2,col=2)
isotone
[edit | edit source]這是最先進的包。它包含兩個函式
- gpava - 線性排序等距迴歸,加權或非加權,適用於任何指標。類似於isoreg, gpava可以將線性排序等距迴歸實現為模型。
- activeSet - 適用於任何指標的一般等距迴歸。
使用示例
install.packages("isotone") # should be done only once
library("isotone") # should be done once per session
x=sort(rnorm(10000))
y=x+rnorm(10000)
y.iso=gpava(y)$x
plot(x,y,cex=0.2); lines(x,y.iso,lwd=2,col=2)
速度比較
[edit | edit source]由於所有三個庫都以某種方式實現了 PAVA 演算法,因此我們可以比較它們的速度。
從下面的圖形可以看出,對於非加權線性排序等距迴歸 (LOIR) 和 ,isoreg應該使用。對於加權 LOIR 和非加權 LOIR 以及 ,pava應該使用。至於gpava, 它應該只用於非歐幾里得指標。
此外,R 上加權簡單排序等距迴歸的實現遠非完美。
Java
[edit | edit source]Weka 是一款免費的機器學習演算法集合,用於資料探勘任務,由 懷卡託大學 開發,包含一個 等距迴歸分類器。該分類器深深植根於 Weka 的類層次結構中,無法在沒有 Weka 的情況下使用。
Python
[edit | edit source]雖然 scikit-learn 實現等距迴歸,但 Andrew Tulloch 為線性排序等距迴歸製作了該演算法的 Cython 實現,該實現速度提高了 14 到 5000 倍,具體取決於資料大小。參見 [Speeding up isotonic regression in scikit-learn by 5,000x https://tullo.ch/articles/speeding-up-isotonic-regression/]。如果您只需要程式碼,請點選 [這裡 https://gist.github.com/ajtulloch/9447845#file-_isotonic-pyx]。
用法
[edit | edit source]校準分類機率的輸出
[edit | edit source]有關更多資訊,請參閱 Alexandru Niculescu-Mizil 和 Rich Caruana 的“使用監督學習預測良好機率”。
大多數監督學習演算法,例如隨機森林 [1]、增強樹、SVM 等,擅長預測最可能的類別,但不擅長預測機率。其中一些演算法傾向於高估高機率並低估低機率。(一個值得注意的例外是神經網路,它們本身會產生經過良好校準的預測。)
為了獲得正確的機率,可以使用未加權線性排序等距迴歸
其中
- 是機率的最終預測
- 是模型給出的預測
- 是一個非遞減函式
為了找到 f,模型在驗證集上的預測與輸出變數匹配,並將等距迴歸應用於這些對。
另一種方法是將 透過 sigmoid 函式傳遞
這被稱為 Platt 校準。
對於小型資料集,Platt 校準優於等距迴歸。從 200 到 5000 個觀測值開始,等距迴歸略微優於 Platt 校準。還要注意,這種等距迴歸比 Platt 校準所需的邏輯迴歸更簡單、更快。
推薦模型的校準
[edit | edit source]問題
[edit | edit source]以下示例適用於推薦引擎,其通用目的是預測使用者 給專案 的評分。
我們有一個模型 M,它可以預測在訓練集上訓練的另一個模型的殘差 r。對於使用者或專案數量較少的案例,模型會過擬合,因此需要放鬆預測
其中
- 是對使用者 、物品 的最終預測。
- 是模型給出的預測。
- 是一個非遞減函式
- 可以是 (訓練集中包含使用者 的觀察次數),或 (訓練集中包含物品 的觀察次數),或 ,這取決於模型的性質。字母 代表支援。
給定來自驗證資料庫的三元組集合 ,我們有
因此,對於第 個觀測值,我們應該設定權重 和值 。然後,三元組 按照 進行排序,然後對它們應用等距迴歸。
當一個函式直接預測評分或接受率,而不是預測其他模型的殘差時,我們可以定義 作為該模型與一些更簡單模型(例如,專案的平均評分加上使用者的平均評分修正)之間的差異。這個模型被稱為基本模型。
通常,我們知道輸出變數單調地依賴於輸入變數,但除此之外,我們對依賴關係幾乎沒有先驗知識。在這種情況下,等距迴歸可以提供關於依賴關係的重要線索。
給定專案-專案相似性矩陣,多維標度 (MDS) 演算法將專案放置到 N 維空間中,以便相似的專案彼此更靠近,而不同的專案則更遠離。這對於視覺化目的特別有用。
根據相似性和距離之間的關係以及距離的定義,有幾種型別的 MDS。對於非度量 MDS,距離可以是相似性的任何單調函式。該函式通常使用等距迴歸找到,參見維基百科中關於 非度量多維標度 的內容。非度量多維標度在 R 的 MASS 庫中作為 [2] 實現。
優點
- 非引數
- 速度快(線性時間)
- 簡單
缺點
- 區間末端的點有時會有噪聲
- 只有當統計量足夠大時(,理想情況下 )時,與其他方法相比,它具有優勢。
透過對等距迴歸的結果進行平滑,可以改善這些缺點。透過這種方式,我們可以兼顧兩全其美(平滑性和單調性)。
- 等距迴歸演算法,作者:Quentin F. Stout - 對當前最佳可用演算法的回顧
- 使用監督學習預測良好機率,作者:Alexandru Niculescu-Mizil、Rich Coruana
- 支援向量機的機率輸出以及與正則化似然方法的比較,作者:John C. Platt