一、簡介博客欄目
Bootstrap是一個很通用的算法,用來估計標準誤差、置信區間和偏差。由Bradley Efron於1979年提出,用於計算任意估計的標準誤差。術語“Bootstrap”來自短語“to pull oneself up by one’s bootstraps” (源自西方神話故事“TheAdventures of Baron Munchausen”,男爵掉到了深湖底,沒有工具,所以他想到了拎着鞋帶將自己提起來)。
在統計學中,自助法(BootstrapMethod,Bootstrapping或自助抽樣法)可以指任何一種有放回的均勻抽樣,也就是說,每當選中一個樣本,它等可能地被再次選中並被再次添加到訓練集中。自助法能對採樣估計的準確性(標準誤差、置信區間和偏差)進行比較好的估計,它基本上能夠對任何採樣分佈的統計量進行估計。
Bootstrap有兩種形式:非參數bootstrap和參數化的bootstrap,但基本思想都是模擬。參數化的bootstrap假設總體的分佈已知或總體的分佈形式已知,可以由樣本估計出分佈參數,再從參數化的分佈中進行再採樣,類似於MC。非參數化的bootstrap是從樣本中再抽樣,而不是從分佈函數中進行再抽樣。
二、非參數化Bootstrap
基本思想是:假設是我們的估計量爲,樣本大小爲N,從樣本中有放回的再抽樣N個樣本,原來每一個樣本被抽中的概率相同,均爲1/N,得到新的樣本我們稱爲Bootstrap樣本,重複B次之後我們得到B個bootstrap樣本集,在每一個樣本集上都有對應的估計量,對於B個,我們可以計算得到標準誤,置信區間,偏置等。
三、參數化Bootstrap
和非參數化Bootstrap不同的地方在於總體分佈函數的形式是已知的,需要根據樣本估計參數 (參數估計),這樣得到經驗分佈函數,從經驗分佈函數中再採樣得到Bootstrap樣本,非參數化Bootstrap是從原始樣本中再抽樣,得到的Bootstrap樣本與原始樣本有重合。
四、Matlab實例
假設我們的整體(population)來自與Bernouli分佈(擲硬幣),參數theta等於0.7,即投一次有0.7的概率出現1。爲了考察採樣點對估計的影響,我們分別採樣了10和100個樣本,採用了參數和非參數方法。
%% Bootstrap demo for the MLE for a Bernoulli
close all;
clear all;
%統計量或估計量,這裏是均值
estimator = @mean;
%Bernoulli分佈的參數theta
theta = 0.7;
%樣本數目分別爲10和100
Ns = [10 100];
for Ni=1:length(Ns)
%當前的樣本數
N = Ns(Ni);
%再採樣次數B
B = 2000;
%參數爲theta的Bernoulli分佈的採樣
X = rand(1,N) < theta;
%MLE參數估計
bmle = estimator(X);
%參數化Bootstrap方法對應的B次再採樣的統計量
mleBoot = zeros(1,B);
%非參數化Bootstrap方法對應的B次再採樣的統計量
mleBootNP=zeros(1,B);
for b=1:B
%參數化Bootstrap對應的分佈函數就是Bernoulli分佈,其參數爲Mle估計的參數,參數化Bootstrap再採樣得到樣本
Xb = rand(1,N) < bmle;
%對再採樣的Bootstrap樣本求統計量
mleBoot(b) = estimator(Xb);
%非參數化Bootstrap方法再採樣,從原來的樣本中再採樣
ndx = unidrnd(N,1,N);
Xnonparam = X(ndx);
%求統計量
mleBootNP(b) = estimator(Xnonparam);
end
%% 繪圖
%參數化Bootstrap繪圖
figure;
hist(mleBoot)
set(gca,'xlim',[0 1]);
%標準誤
se=std(mleBoot)/sqrt(B);
ttl = sprintf('Boot: true = %3.2f, n=%d, mle = %3.2f, se = %5.3f\n', ...
theta, N,mean(mleBoot), se);
title(ttl);
%非參數化Bootstrap繪圖
figure;
hist(mleBootNP)
set(gca,'xlim',[0 1])
nonParaSe=std(mleBootNP)/sqrt(B);
ttl = sprintf('NP boot: true = %3.2f, n=%d, mle = %3.2f, se = %5.3f\n', theta, N, mean(mleBootNP),nonParaSe);
title(ttl);
end
function [out] = bootstrap(data,B)
%
% Bootstrap method -produce B dataSet
%
% Inputs:
% data:origianl data set whose size is [M,N],which means feature Dimens is M and the original dataset contains N samples
% B:number of dataSet
% Outputs:
% out:B bootstrap resamples of the input data whose size is [M,N,B]
[M,N]=size(data);
% by default B=N;
if (exist('B')~=1), B=N; end;
out=zeros(M,N,B);
index=unidrnd(N,N,B);
out=reshape(data(:,index),M,N,B);
end
對於參數化Bootstrap方法,假設我們已知總體是Bernouli分佈,先從樣本中做MLE估計,得出參數theta,這樣我們就可以從分佈函數中直接抽樣,而不是像非參數Bootstrap一樣從樣本中再採樣。
to be continued....