Appearance
Online 演算法入門:一次掃描資料也能完成計算
原文連結:https://www.johndcook.com/blog/2026/05/29/online-one-pass-algorithms/
文章說明
這是統計學家與應用數學家 John D. Cook 撰寫的技術科普文,介紹 online(one-pass)演算法的核心概念:只需掃描資料流一次,無需儲存完整資料集,就能精確或近似計算統計量。文章以樣本變異數為範例,並延伸到高階動差、回歸分析等應用。
內容介紹
經典範例:樣本變異數
標準的樣本變異數公式看起來需要兩次掃描:
$$s^2 = \frac{1}{n-1}\sum_{i=1}^n (x_i - \bar{x})^2$$
先算平均值 $\bar{x}$,再回頭計算每個點與平均值的平方差。
教科書會給另一個「等價」公式(基於平方和):
$$s^2 = \frac{1}{n(n-1)}\left(n\sum_{i=1}^n x_i^2 - \left(\sum_{i=1}^n x_i\right)^2\right)$$
這個公式理論上正確,但數值不穩定(numerically unstable)。Cook 實際見過它在真實資料上返回負數(理論上不可能),導致程式在計算標準差時崩潰(對負數開根號)。
Welford 演算法(1962):
真正的解法是 B. P. Welford 在 1962 年提出的演算法,能在一次掃描中精確計算平均值與變異數,且數值穩定。Cook 在另一篇文章中提供完整實作。
"Online" 一詞的歷史:
Cook 澄清,電腦科學中的 "online algorithm" 這個術語遠早於網際網路。他引用 1965 年的論文 [1],當時 "online" 意指:
"在 online 計算中,輸入資料一次一個符號地提供給機器……在 offline 計算中,所有輸入符號在計算開始前就寫在磁帶上。"
現在為了避免與「線上服務」混淆,現代文獻也使用 "streaming algorithm"(串流演算法)一詞。
擴展應用:
高階動差:不只平均值與變異數,偏度(skewness)與峰度(kurtosis)也能 online 計算
簡單線性回歸:單變數回歸係數可以用類似方法遞增更新,Cook 有舊筆記說明
多元回歸:多變數情況更複雜,需要遞迴最小平方法(recursive least squares, RLS)。Cook 引用兩篇論文 [2][3] 但未深入
與函數式編程的連結:
Online 演算法的概念與函數式編程中的 fold(摺疊)操作密切相關。Cook 列出相關文章:
參考文獻:
[1] F. C. Hennie, "One-Tape, Off-Line Turing Machine Computations," Information and Control 8, 553-578 (1965)
[2] Arthur Albert & Robert W. Sittler, "A Method for Computing Least Squares Estimators that Keep Up with the Data," SIAM Journal on Control, 1965
[3] Petre Stoica & Per Ashgren, "Exact initialization of the recursive least-squares algorithm," Int. J. Adapt. Control Signal Process., 2002
你可以帶走的重點
理論正確 ≠ 數值穩定:基於平方和的變異數公式在浮點運算中可能返回負數,Welford 演算法才是工程實務標準。
One-pass 不只省記憶體,也避免多次 I/O:當資料在磁碟或網路上時,減少掃描次數可大幅降低成本。
Online 演算法是函數式 fold 的特例:許多遞增更新的統計量都可以用 fold 抽象化,這是函數式編程與數值計算的美妙交會點。
多元回歸需要矩陣遞迴更新:不像單變數那麼直觀,但 RLS 演算法已有成熟理論與實作(Kalman filter 的近親)。
歷史術語會演化:"Online" 在 1965 年指的是即時輸入,現在可能被誤解為雲端服務,所以現代文獻改用 "streaming"。
適合誰閱讀
- 資料工程師與串流處理系統開發者
- 需要處理大規模即時統計的後端工程師
- 學習數值穩定性與浮點誤差的計算機科學學生
- 函數式編程愛好者(想看 fold 的實際應用)
- 統計軟體庫開發者(需要實作標準差、回歸等基礎功能)
- 對統計計算與演算法有興趣的讀者