均值和中值屬性
有人可以解釋清楚將兩個語句(a)和(b)聯繫在一起的數學邏輯嗎?讓我們有一組值(一些分佈)。現在,
a) 中位數不依賴於每個值[它只依賴於一個或兩個中間值];b) 中位數是最小絕對偏差總和的軌跡。
同樣,相反,
a)(算術)平均值取決於每個值;b) 均值是偏離它的最小平方和的軌跡。
到目前為止,我對它的理解是直觀的。
這是兩個問題:一個是關於平均值和中位數如何最小化損失函數,另一個是關於這些估計對數據的*敏感性。*正如我們將看到的,這兩個問題是相互關聯的。
最小化損失
可以通過讓匯總值更改並想像批次中的每個數字對該值施加恢復力來創建一批數字中心的匯總(或估計量) 。當力從不將值推離數字時,可以說力平衡的任何點都是批次的“中心”。
二次方 ( $ L_2 $ ) 損失
例如,如果我們在摘要和每個數字之間附加一個經典彈簧(遵循胡克定律),則力將與到每個彈簧的距離成正比。彈簧會以這種方式和那種方式拉動摘要,最終穩定在一個能量最小的獨特穩定位置。
我想提請注意剛剛發生的一個小花招:能量與距離**平方和成正比。牛頓力學告訴我們力是能量的變化率。 **達到平衡——最小化能量——導致平衡力。**能量的淨變化率為零。
讓我們稱之為“ $ L_2 $ 摘要”或“平方損失摘要”。
絕對 ( $ L_1 $ ) 損失
另一個總結可以通過假設恢復力的大小是恆定的,而不管值和數據之間的距離如何。然而,力本身並不是恆定的,因為它們必須始終將值拉向每個數據點。因此,當該值小於數據點時,力的方向為正,而當該值大於數據點時,力的方向為負。現在能量與值和數據之間的距離成正比。通常會有一個能量恆定且合力為零的整個區域。這個區域中的任何值,我們可以稱之為“ $ L_1 $ 總結”或“絕對損失總結”。
這些物理類比為這兩個摘要提供了有用的直覺。例如,如果我們移動其中一個數據點,摘要會發生什麼情況?在裡面 $ L_2 $ 附有彈簧的外殼,移動一個數據點可以拉伸或放鬆其彈簧。結果是對摘要的作用力發生了變化,因此它必須響應變化。 但在 $ L_1 $ 在大多數情況下,數據點的變化對匯總沒有任何影響,因為力是局部恆定的。力可以改變的唯一方法是數據點在摘要中移動。
(事實上,很明顯,一個值上的淨力是由大於它的點數給出的 - 將其向上拉 - 減去小於它的點數 - 將其向下拉。因此,這 $ L_1 $ summary 必須出現在超過它的數據值的數量正好等於小於它的數據值的數量的任何位置。)
描述損失
由於力和能量加起來,在任何一種情況下,我們都可以將淨能量分解為來自數據點的個體貢獻。通過將能量或力繪製為匯總值的函數,可以詳細了解正在發生的事情。摘要將是能量(或統計術語中的“損失”)最小的位置。等效地,它將是力平衡的位置:數據中心出現在損失的淨變化為零的地方。
該圖顯示了一個包含六個值的小型數據集的能量和力(每個圖中用微弱的垂直線標記)。黑色虛線曲線是彩色曲線的總和,顯示了各個值的貢獻。x 軸表示摘要的可能值。
算術平均值是平方損失最小化的點:它將位於左上圖中黑色拋物線的頂點(底部)。它總是獨一無二的。中位數是絕對損失最小化的點。如上所述,它必須出現在數據的中間。它不一定是唯一的。它將位於右上角黑色虛線的底部。(底部實際上由一個短的平坦部分組成 $ -0.23 $ 和 $ -0.17 $ ; 此區間中的任何值都是中位數。)
分析靈敏度
之前我描述了當數據點變化時摘要會發生什麼。繪製摘要如何響應更改任何單個數據點而變化是有益的。(這些圖本質上是經驗影響函數。它們與通常的定義不同,它們顯示的是估計的實際值,而不是這些值的變化量。)總結的值在 y 上用“估計”標記-axes 提醒我們這個摘要是在估計數據集的中間位置。每個數據點的新(更改)值顯示在它們的 x 軸上。
該圖顯示了改變批次中每個數據值的結果 $ -1.02, -0.82, -0.23, -0.17, -0.08, 0.77 $ (與第一個圖中分析的相同)。每個數據值都有一個圖,該圖在其圖上突出顯示,底部軸上有一個長的黑色勾號。(剩餘的數據值用灰色短勾顯示。)藍色曲線描繪了 $ L_2 $ 總結——算術平均值——紅色曲線描繪 $ L_1 $ 總結——中位數。(由於中位數通常是一個值範圍,因此此處遵循繪製該範圍中間值的慣例。)
注意:
- 均值的敏感性是無限的:那些藍線上下無限延伸。中位數的敏感性是有界的:紅色曲線有上限和下限。
- 但是,在中位數確實發生變化的地方,它的變化比平均值要快得多。 每條藍線的斜率是 $ 1/6 $ (一般是 $ 1/n $ 對於一個數據集 $ n $ 值),而紅線傾斜部分的斜率都是 $ 1/2 $ .
- 平均值對每個數據點都很敏感,並且這種敏感性沒有界限(如第一張圖左下圖中所有彩色線的非零斜率所示)。儘管中位數對每個數據點都很敏感,但敏感度是有界的(這就是為什麼第一張圖右下角的彩色曲線位於零附近的狹窄垂直範圍內的原因)。當然,這些只是基本力(損失)定律的視覺重複:均值是二次的,中值是線性的。
- 可以改變中位數的時間間隔在數據點之間可能會有所不同。它始終受數據中兩個不變的接近中間值的限制。(這些邊界用微弱的垂直虛線標記。)
- 因為中位數的變化率總是 $ 1/2 $ ,因此它可能變化的量取決於數據集的近中間值之間的差距的長度。
儘管通常只注意到第一點,但所有點都很重要。特別是,
- “中位數不取決於每個值”絕對是錯誤的。 該圖提供了一個反例。
- 儘管如此,中位數並不“實質上”依賴於每個值,因為儘管改變單個值可以改變中位數,但變化量受到數據集中接近中間值之間的差距的限制。尤其是變化量是有界的。我們說中位數是一個“抗性”的總結。
- 雖然均值沒有抵抗力,而且任何一個數據值發生變化都會發生變化,但變化率相對較小。數據集越大,變化率越小。等效地,為了使大型數據集的平均值發生重大變化,至少一個值必須經歷相對較大的變化。這表明平均值的非抗性僅對 (a) 小數據集或 (b) 一個或多個數據的值可能與批次中間極遠的數據集有關。
這些評論——我希望這些數字能夠證明——揭示了損失函數和估計器的靈敏度(或阻力)之間的深層聯繫。 有關這方面的更多信息,請從維基百科關於 M 估計器的一篇文章開始,然後儘可能地追求這些想法。
代碼
此
R
代碼生成了數字,並且可以很容易地修改以以相同的方式研究任何其他數據集:只需將隨機創建的向量替換為y
任何數字向量。# # Create a small dataset. # set.seed(17) y <- sort(rnorm(6)) # Some data # # Study how a statistic varies when the first element of a dataset # is modified. # statistic.vary <- function(t, x, statistic) { sapply(t, function(e) statistic(c(e, x[-1]))) } # # Prepare for plotting. # darken <- function(c, x=0.8) { apply(col2rgb(c)/255 * x, 2, function(s) rgb(s[1], s[2], s[3])) } colors <- darken(c("Blue", "Red")) statistics <- c(mean, median); names(statistics) <- c("mean", "median") x.limits <- range(y) + c(-1, 1) y.limits <- range(sapply(statistics, function(f) statistic.vary(x.limits + c(-1,1), c(0,y), f))) # # Make the plots. # par(mfrow=c(2,3)) for (i in 1:length(y)) { # # Create a standard, consistent plot region. # plot(x.limits, y.limits, type="n", xlab=paste("Value of y[", i, "]", sep=""), ylab="Estimate", main=paste("Sensitivity to y[", i, "]", sep="")) #legend("topleft", legend=names(statistics), col=colors, lwd=1) # # Mark the limits of the possible medians. # n <- length(y)/2 bars <- sort(y[-1])[ceiling(n-1):floor(n+1)] abline(v=range(bars), lty=2, col="Gray") rug(y, col="Gray", ticksize=0.05); # # Show which value is being varied. # rug(y[1], col="Black", ticksize=0.075, lwd=2) # # Plot the statistics as the value is varied between x.limits. # invisible(mapply(function(f,c) curve(statistic.vary(x, y, f), col=c, lwd=2, add=TRUE, n=501), statistics, colors)) y <- c(y[-1], y[1]) # Move the next data value to the front } #------------------------------------------------------------------------------# # # Study loss functions. # loss <- function(x, y, f) sapply(x, function(t) sum(f(y-t))) square <- function(t) t^2 square.d <- function(t) 2*t abs.d <- sign losses <- c(square, abs, square.d, abs.d) names(losses) <- c("Squared Loss", "Absolute Loss", "Change in Squared Loss", "Change in Absolute Loss") loss.types <- c(rep("Loss (energy)", 2), rep("Change in loss (force)", 2)) # # Prepare for plotting. # colors <- darken(rainbow(length(y))) x.limits <- range(y) + c(-1, 1)/2 # # Make the plots. # par(mfrow=c(2,2)) for (j in 1:length(losses)) { f <- losses[[j]] y.range <- range(c(0, 1.1*loss(y, y, f))) # # Plot the loss (or its rate of change). # curve(loss(x, y, f), from=min(x.limits), to=max(x.limits), n=1001, lty=3, ylim=y.range, xlab="Value", ylab=loss.types[j], main=names(losses)[j]) # # Draw the x-axis if needed. # if (sign(prod(y.range))==-1) abline(h=0, col="Gray") # # Faintly mark the data values. # abline(v=y, col="#00000010") # # Plot contributions to the loss (or its rate of change). # for (i in 1:length(y)) { curve(loss(x, y[i], f), add=TRUE, lty=1, col=colors[i], n=1001) } rug(y, side=3) }