當數據具有高斯分佈時,有多少樣本將表徵它?
分佈在單個維度上的高斯數據需要兩個參數來表徵它(均值、方差),據傳,大約 30 個隨機選擇的樣本通常足以以相當高的置信度估計這些參數。但是隨著維度數量的增加會發生什麼?
在二維(例如高度、重量)中,需要 5 個參數來指定一個“最佳擬合”橢圓。在三維中,這上升到 9 個參數來描述一個橢球,而在 4-D 中,它需要 14 個參數。我很想知道估計這些參數所需的樣本數量是否也以可比的速度增加,以較慢的速度或(請不要!)以更高的速度增加。更好的是,如果有一個被廣泛接受的經驗法則表明需要多少樣本來表徵給定數量的維度中的高斯分佈,那將是一件好事。
更準確地說,假設我們要定義一個以平均點為中心的對稱“最佳擬合”邊界,我們可以確信 95% 的所有樣本都會落在該邊界內。我想知道以適當高(> 95%)的置信度找到近似此邊界的參數(一維中的間隔,二維中的橢圓等)可能需要多少樣本,以及該數字如何隨著維數增加。
將多元正態分佈的參數估計到給定置信度的指定精度內所需的數據量不隨維度而變化,所有其他條件都相同。 因此,您可以將任何二維的經驗法則應用於更高維的問題,而無需任何更改。
為什麼要呢?只有三種參數:均值、方差和協方差。均值的估計誤差僅取決於方差和數據量,. 因此,當具有多元正態分佈,並且有差異,然後估計只依賴於和. 因此,為了在估計所有,我們只需要考慮需要的數據量擁有最大的. 因此,當我們考慮一系列增加維度的估計問題時,我們只需要考慮最大的將增加。當這些參數在上述範圍內時,我們得出結論,所需的數據量不依賴於維度。
類似的考慮適用於估計方差和協方差:如果一定數量的數據足以估計一個協方差(或相關係數)達到所需的精度,那麼——假設基礎正態分佈具有相似的參數值——相同數量的數據將足以估計任何協方差或相關係數.
為了說明並為這一論點提供經驗支持,讓我們研究一些模擬。以下為指定維度的多正態分佈創建參數,從該分佈中繪製許多獨立的、相同分佈的向量集,從每個此類樣本中估計參數,並根據 (1) 它們的平均值總結這些參數估計的結果- - 證明它們是無偏的(並且代碼工作正常 - 以及(2)它們的標準偏差,它量化了估計的準確性。(不要混淆這些標準偏差,它量化了在多個獲得的估計之間的變化量模擬的迭代,標準差用於定義基礎多正態分佈!變化,只要作為變化,我們不會將更大的方差引入基礎多正態分佈本身。
在此模擬中,通過使協方差矩陣的最大特徵值等於. 隨著維度的增加,這將概率密度“雲”保持在範圍內,無論該雲的形狀如何。隨著維度的增加,系統的其他行為模型的模擬可以簡單地通過改變特徵值的生成方式來創建;
R
一個示例(使用 Gamma 分佈)在下面的代碼中被註釋掉了。我們正在尋找的是驗證參數估計的標準偏差在維度時不會發生明顯變化被改變。因此,我展示了兩個極端的結果,和,使用相同數量的數據 () 在這兩種情況下。 值得注意的是,當估計的參數數量, 等於, 遠遠超過向量的數量 () 甚至超過個別數字 () 在整個數據集中。
讓我們從二維開始,. 有五個參數:兩個方差(標準差為和在此模擬中),協方差(SD =) 和兩種方法 (SD =和)。使用不同的模擬(可通過更改隨機種子的起始值獲得),這些會有所不同,但當樣本大小為. 例如,在下一個模擬中,SD 是,,,, 和,分別:它們都發生了變化,但具有可比的數量級。
(這些陳述在理論上可以得到支持,但這裡的重點是提供純粹的經驗證明。)
現在我們搬到,保持樣本量為. 具體來說,這意味著每個樣本由向量,每個都有組件。而不是一一列舉標準偏差,讓我們看看它們的圖片,使用直方圖來描述它們的範圍。
第一行的散點圖比較了實際參數
sigma
() 和mu
() 到期間作出的平均估計在這個模擬中迭代。灰色的參考線標記了完全相等的位置:很明顯,估計值按預期工作並且沒有偏見。直方圖顯示在底行,分別針對協方差矩陣中的所有條目(左)和均值(右)。個體差異的 SD往往介於和而單獨組件之間協方差的 SD往往位於和: 正好在達到的範圍內. 同樣,平均估計的 SD 往往介於和,這與看到的情況相當. 當然,沒有跡象表明 SD增加了從上升到.
代碼如下。
# # Create iid multivariate data and do it `n.iter` times. # sim <- function(n.data, mu, sigma, n.iter=1) { # # Returns arrays of parmeter estimates (distinguished by the last index). # library(MASS) #mvrnorm() x <- mvrnorm(n.iter * n.data, mu, sigma) s <- array(sapply(1:n.iter, function(i) cov(x[(n.data*(i-1)+1):(n.data*i),])), dim=c(n.dim, n.dim, n.iter)) m <-array(sapply(1:n.iter, function(i) colMeans(x[(n.data*(i-1)+1):(n.data*i),])), dim=c(n.dim, n.iter)) return(list(m=m, s=s)) } # # Control the study. # set.seed(17) n.dim <- 60 n.data <- 30 # Amount of data per iteration n.iter <- 10^4 # Number of iterations #n.parms <- choose(n.dim+2, 2) - 1 # # Create a random mean vector. # mu <- rnorm(n.dim) # # Create a random covariance matrix. # #eigenvalues <- rgamma(n.dim, 1) eigenvalues <- exp(-seq(from=0, to=3, length.out=n.dim)) # For comparability u <- svd(matrix(rnorm(n.dim^2), n.dim))$u sigma <- u %*% diag(eigenvalues) %*% t(u) # # Perform the simulation. # (Timing is about 5 seconds for n.dim=60, n.data=30, and n.iter=10000.) # system.time(sim.data <- sim(n.data, mu, sigma, n.iter)) # # Optional: plot the simulation results. # if (n.dim <= 6) { par(mfcol=c(n.dim, n.dim+1)) tmp <- apply(sim.data$s, 1:2, hist) tmp <- apply(sim.data$m, 1, hist) } # # Compare the mean simulation results to the parameters. # par(mfrow=c(2,2)) plot(sigma, apply(sim.data$s, 1:2, mean), main="Average covariances") abline(c(0,1), col="Gray") plot(mu, apply(sim.data$m, 1, mean), main="Average means") abline(c(0,1), col="Gray") # # Quantify the variability. # i <- lower.tri(matrix(1, n.dim, n.dim), diag=TRUE) hist(sd.cov <- apply(sim.data$s, 1:2, sd)[i], main="SD covariances") hist(sd.mean <- apply(sim.data$m, 1, sd), main="SD means") # # Display the simulation standard deviations for inspection. # sd.cov sd.mean