为什么 matlab bootstrap 程序评估 N+1 次?
Why does the matlab bootstrap procedure evaluate N+1 times?
我想 bootstrap 使用 matlab 使用内置命令 "bootstrp"。我注意到,当我只要求 N 次迭代时,该过程进行了 N+1 次迭代。这是为什么?当我构建一个手动循环来执行 bootstrapping 时,它实际上只是 运行s N 次,然后速度更快。这是问题的一个最小示例:
clear all
global iterationcounter
tic
iterationcounter=0;
data=unifrnd(0,1,1,1000); %draw vector of 1000 random numbers
bootstat = bootstrp(100,@testmean,data); %evaluate function for 100 bootstrap samples
toc
使用函数
function [ m ] = testmean( data )
global iterationcounter
m=mean(data);
iterationcounter=iterationcounter+1
end
函数应该评估 100 个样本,但是当我 运行 脚本时,它将评估函数 101 次:
...
iterationcounter =
101
Elapsed time is 0.102291 seconds.
那么为什么要使用这个看似浪费时间的内置 Matlab 函数呢?
bootstrp
调用 bootfun
(函数参数)进行完整性检查(来自源代码,在 MATLAB 2015b,bootstrp.m
,l.167 ff):
% Sanity check bootfun call and determine dimension and type of result
try
% Get result of bootfun on actual data, force to a row.
bootstat = feval(bootfun,bootargs{:});
bootstat = bootstat(:)';
catch ME
m = message('stats:bootstrp:BadBootFun');
MEboot = MException(m.Identifier,'%s',getString(m));
ME = addCause(ME,MEboot);
rethrow(ME);
end
我认为在实际的应用程序中,N>>100
,因此额外的开销(远)小于总运行时间的百分之一(不考虑可能的并行化带来的速度提升),因此应该没那么重要吧?
我想 bootstrap 使用 matlab 使用内置命令 "bootstrp"。我注意到,当我只要求 N 次迭代时,该过程进行了 N+1 次迭代。这是为什么?当我构建一个手动循环来执行 bootstrapping 时,它实际上只是 运行s N 次,然后速度更快。这是问题的一个最小示例:
clear all
global iterationcounter
tic
iterationcounter=0;
data=unifrnd(0,1,1,1000); %draw vector of 1000 random numbers
bootstat = bootstrp(100,@testmean,data); %evaluate function for 100 bootstrap samples
toc
使用函数
function [ m ] = testmean( data )
global iterationcounter
m=mean(data);
iterationcounter=iterationcounter+1
end
函数应该评估 100 个样本,但是当我 运行 脚本时,它将评估函数 101 次:
...
iterationcounter =
101
Elapsed time is 0.102291 seconds.
那么为什么要使用这个看似浪费时间的内置 Matlab 函数呢?
bootstrp
调用 bootfun
(函数参数)进行完整性检查(来自源代码,在 MATLAB 2015b,bootstrp.m
,l.167 ff):
% Sanity check bootfun call and determine dimension and type of result
try
% Get result of bootfun on actual data, force to a row.
bootstat = feval(bootfun,bootargs{:});
bootstat = bootstat(:)';
catch ME
m = message('stats:bootstrp:BadBootFun');
MEboot = MException(m.Identifier,'%s',getString(m));
ME = addCause(ME,MEboot);
rethrow(ME);
end
我认为在实际的应用程序中,N>>100
,因此额外的开销(远)小于总运行时间的百分之一(不考虑可能的并行化带来的速度提升),因此应该没那么重要吧?