如果我没记错的话,Prof Lin在课堂上提到,Least Median of Squares是一个难题:它的目标是最小化误差平方的中位数。当时上课我没去考虑这个问题,晚上突然想起,这个问题不管怎么说至少可以有暴力解法,比如用BFGS等方法去优化就能算出系数了。
但是转念一想,LMS这个东西怎么看着眼熟,打开MASS一看,原来是自己以前用过的。MASS包的lqs()可以计算各种稳健和耐抗回归,LMS是其中一种。LMS是一种稳健回归方法(下第一幅图),然而MASS的文献指出它对大量堆在中间位置上的数值敏感(下第二幅图)。

图1 离群点对普通最小二乘有严重影响,LMS却没问题

图2 大量的中间值让LMS失效,普通最小二乘却没事
# png("lms.png", width = 500, height = 400)
par(mar = c(4, 4, 0.1, 0.1))
library(MASS)
set.seed(1)
x = runif(50)
set.seed(1)
y = 2 + 3 * x + rnorm(50)
# an outlier
x = c(x, 2); y = c(y, 30)
plot(x, y, pch = 20)
abline(lqs(y ~ x, method = "lqs"), col = "blue", lty = 2)
abline(lm(y ~ x), col = "red")
legend("topleft", legend = c("OLS", "LMS"), col = c("red",
"blue"), lty = 1:2, bty = "n")
# dev.off()
# png("lms-central.png", width = 500, height = 400)
par(mar = c(4, 4, 0.1, 0.1))
library(MASS)
set.seed(1)
x = runif(50)
set.seed(1)
y = 2 + 3 * x + rnorm(50)
# 500 central values
x = c(x, jitter(rep(mean(x), 500), 3))
y = c(y, jitter(rep(mean(y), 500), 3))
plot(x, y, pch = 20, cex = c(rep(1, 50), rep(0.1, 500)))
abline(lqs(y ~ x, method = "lqs"), col = "blue", lty = 2)
abline(lm(y ~ x), col = "red")
legend("topleft", legend = c("OLS", "LMS"), col = c("red",
"blue"), lty = 1:2, bty = "n")
# dev.off()
赞赏
作为一名没有固定工作的自由职业者,我非常感谢您通过捐赠的方式来支持我的写作和开源软件开发。当然,捐赠纯属自愿。无论金额多少,都是一片诚挚的心意。支付方式如下:
| 微信 | ← 奋力支开它俩 → | 支付宝 |
|---|---|---|
![]() |
其它爱心通道 ↓ Venmo: @yihui_xie Zelle: xie@yihui.name PayPal: xie@yihui.name |
![]() |
若使用 Venmo/Zelle/Paypal,请添加备注“gift”或“donation”,以免捐赠被视为我的可税收入。若使用 Paypal,支付类型请选 Family and Friends,而不要选 Goods and Services。
在不影响生活的前提下,我会将收到的捐赠以尽量大的比例回馈给开源社区和慈善机构。作为参考,2024-25 年间我共收到约三万美元捐赠,完税后我转手捐出了一万五千美元。

