一个可再生的计算就是每次运行时都给出相同的结果。再现性对于以下方面很重要:
调试——要纠正异常结果,需要重新生成结果。
自信——当你能重现结果时,你就能调查并理解它们。
修改现有代码——当您更改现有代码时,您希望确保不会破坏任何东西。
一般来说,您不需要确保计算的再现性。通常,当你想要重现性时,最简单的技术是串行运行而不是并行运行。在串行计算中,你可以简单地调用rng
函数如下:
s = rng %获取随机流的当前状态%运行统计函数rng(s) %将流重置为以前的状态%再次运行统计函数,得到相同的结果
本节讨论了当函数使用随机数,并且希望并行地得到可重复的结果时的情况。本节还讨论了希望在并行中得到与串行中相同的结果的情况。
要重复运行统计和机器学习工具箱™功能:
设置UseSubstreams
选项真正的
使用statset
.
设置流
支持子流的类型的选项:金宝app“mlfg6331_64”
或“mrg32k3a”
.有关这些流的信息,请参见RandStream.list
.
要并行计算,请设置UseParallel
选项真正的
.
使合奏适合并行使用fitcensemble
或fitrensemble
,创建一个树模板“复制”
名称-值对设置为真正的
:
t = templateTree (“复制”,真正的);实体= fitcensemble (X, Y,“方法”,“包”,“学习者”t...“选项”、选择);
使用options结构调用函数。
要重新生成计算,请重置流,然后再次调用函数。
要理解为什么这种技术具有重现性,请看子流如何实现可重复的并行计算.
例如,使用“mlfg6331_64”
可重复计算流:
创建一个合适的选项结构:
s = RandStream (“mlfg6331_64”);选择= statset (“UseParallel”,真的,...“流”年代,“UseSubstreams”,真正的);
运行并行计算。说明,请参阅快速启动并行计算的统计和机器学习工具箱.
重置随机流:
重置(年代);
重新运行并行计算。你会得到相同的结果。
一个substream是随机流的一部分吗RandStream
很快可以访问。有一个数字米
对于任何正整数k
,RandStream
可以去公里
流中的伪随机数。从这一点上,RandStream
可以在流中生成后续条目。目前,RandStream
有米
= 272,大约5e21,或更多。
不同子流中的条目具有良好的统计属性,类似于单个流中的条目的属性:独立性和缺乏性k-路相关在不同的滞后。子流非常长,以至于你可以将子流视为独立的流,如下图所示。
两个RandStream
流类型支持子流:金宝app“mlfg6331_64”
和“mrg32k3a”
.
当MATLAB®并行地执行计算parfor
,每个worker以不可预测的顺序接收循环迭代。因此,您无法预测哪个工作人员获得哪个迭代,因此无法确定与每个迭代相关的随机数。
子流允许MATLAB将每个迭代与特定的随机数序列联系起来。parfor
给每个迭代一个索引。迭代使用索引作为子流编号。由于随机数与迭代有关,而与工人无关,所以整个计算是可重复的。
要获得可重复的结果,只需重置流,当再次调用时,所有子流都会生成相同的随机数。当所有工作人员使用相同的流且流支持子流时,此方法会成功。金宝app这就结束了程序如何进入的讨论运行可重复的并行计算给出可重复的并行结果。
一些函数会在客户机上生成随机数,然后将它们分发给并行的工作人员。工人们不使用随机数,所以操作完全是确定性的。对于这些函数,可以使用任何随机流类型重复运行并行计算。
以这种方式操作的函数包括:
要获得相同的结果,重置客户端上的随机流或你传递给客户端的随机流。例如:
s = rng %获取随机流的当前状态%运行统计函数rng(s) %将流重置为以前的状态%再次运行统计函数,得到相同的结果
虽然此方法使您能够以并行方式重复运行,但结果可能与串行计算不同。造成这种差异的原因是parfor
循环以相反的顺序运行为
循环。因此,串行计算可以以不同于并行计算的顺序生成随机数。为了明确的重现性,在运行可重复的并行计算.
为了使用特定的随机数算法进行测试或比较,您必须设置随机数生成器。如何并行地设置这些生成器,或者以特定的方式初始化每个worker上的流?或者,您可能想使用与您运行过的任何其他随机数不同的序列来运行一个计算。如何确保所使用的序列在统计上是独立的?
并行统计和机器学习工具箱函数允许您显式地在每个工作人员上设置随机流。的信息创建多个流,输入帮助RandStream /创建
在命令行。方法创建四个独立的流“mrg32k3a”
发电机:
s = RandStream.create(‘mrg32k3a’,‘NumStreams 4…“CellOutput”,真正的);
将这些流传递给一个统计函数流
选择。例如:
= RandStream.create('mrg32k3a','NumStreams',4,…“CellOutput”,真正的);paroptions = statset('UseParallel',true,…流,年代);%设置4个不同的流x = [randn(700,1);4 + 2 * randn (300 1)];奈= 4:0.01:12;myfun = @(X) ksdensity(X,latt);pdfestimate = myfun (x);myfun B = bootstrp(200年,x,“选项”,paroptions);
这种分配流的方法为每个工作者提供了一个不同的计算流。然而,它不允许重复计算,因为工人以不可预测的顺序执行200次引导。如果您想执行可重复的计算,请使用子流,如运行可重复的并行计算.
如果你设置UseSubstreams
选项真正的
,然后设置流
选项为支持子流类型的单个随机流(金宝app“mlfg6331_64”
或“mrg32k3a”
).这个设置提供了可重复的计算。