如何掌握MATLAB中的随机生成器以应用于自助法人工神经网络模型

我正在处理水文时间序列数据,并尝试构建自助法人工神经网络模型。为了使用置信区间进行不确定性评估,必须确保在重新抽样/自助法处理原始时间序列数据集时,原始时间序列中的每个值在所有自助样本中至少被保留两次,以便计算该时间点的方差和置信区间。

背景介绍如下:

我使用了一个包含标准降水指数值的月度时间步长的水文时间序列,该时间序列跨度为429行×1列,我们称这个时间序列向量为XX的所有元素/值都已被归一化和标准化到01之间。

然后使用神经网络将时间序列X与一些目标值(与X具有相同长度和条件)进行训练,以生成目标值的新估计,我们称这个输出向量为O(与X具有相同长度和条件)。

现在我需要对X进行ii =1:1:200次重新抽样(即自助样本大小为200),长度为429,且有放回抽样。让我们称所有自助样本放置的矩阵为M。我使用B = randsample(X, length(X), true)并通过for循环填充M,使得M(:,ii) = B。注意:我还在randsample语句之后添加了rng('shuffle'),以保持随机数生成器移动到新的状态,希望它能提供更随机的结果。

现在我需要测试我的数据重新抽样用于创建置信区间的效果如何。

我的程序如下:

  1. 生成一个for循环,使用上述程序创建M
  2. 创建一个新变量Xc,它将保存自助样本ii for ii = 1:1:200中未被重新抽样的X的所有值
  3. 对于j=1:1:length(X),使用Xc(j,ii) = setdiff(X, M(:,ii))填充'Xc',如果元素j存在于M(:,ii)中,则用NaN填充Xc(j,ii)
  4. Xc现在是一个与M相同大小和维度的矩阵。计算Xc每行的NaN值数量,并放入向量CI中。
  5. 如果CI中的任何行大于[自助样本大小,在本例中为(200) - 1],则在此点无法创建置信区间。

当我运行这个程序时,我发现从我的集合X中选择的值几乎总是重复的,即用于生成M中所有样本的X的值是相同的。大约是原始时间序列中相同的~200个数据点总是被选中来创建新的自助样本。

我如何有效地修改我的程序或使用任何特定的函数来避免第(5)点的负面解决方案?

以下是我的代码示例,但请注意脚本中使用的变量可能与此处的文本不同。

感谢您的帮助,请查看下面的代码。

for ii = 1:1:Blen % for循环创建我们想要的自助样本数量    B = randsample(Xtrain, wtrain, true); % 对数据系列'X'进行自助重抽样,抽样元素数量为'how many elements',有放回抽样    rng('shuffle');    M(:,ii) = B; % 创建一个包含所有自助重抽样样本的矩阵,根据for循环创建的数量    [C,IA] = setdiff(Xtrain,B); % 创建一个包含未包含在自助样本'ii'中的'Xtrain'的所有元素的向量,以及每个元素的位置    [IAc] = setdiff(k,IA); % 创建一个包含在自助样本'ii'中使用的'Xtrain'元素位置的向量 --> ***IA + IAc = wtrain***    for j = 1:1:wtrain % 遍历每个向量的行            if ismember(j,IA)== 1 % 如果计数变量等于'IA'中的一个值                XC(j,ii) = Xtrain(j,1); % 如果上述语句为真,则将变量放入样本'ii'的矩阵中的位置'j'            else                XC(j,ii) = NaN; % 用NaN值保留位置,表示此值已在自助样本'ii'中使用            end            dum1(:,ii) = wtrain - sum(isnan(XC(:,ii))); % 虚拟变量,允许通过'isnan'限制的'IAs'转置 --> 用于计算IA中元素的数量            dum2(:,ii) = sum(isnan(XC(:,ii))); % 虚拟变量,允许通过'isnan'限制的'IAsc'转置             IAs = transpose(dum1) ; % 变量计算在'M'中未被重新抽样的元素数量在集合'i'中,***即为每个重抽样集合'i'计算'IA'            IAsc = transpose(dum2) ; % 变量计算在'M'中被重新抽样的元素数量在集合'i'中,***即为每个重抽样集合'i'计算'IAc'            chk = isnan(XC); % 在NaN位置返回1,在实际值位置返回0            chks = sum(chk,2); % 计算训练时间集长度内每行中NaN的数量            chks_cnt = sum(chks(:)<(Blen-1)); % 计算原始时间序列中可以提供置信区间的值的数量,应等于wtrain以提供完整的CIs    endend

回答:

这似乎不是randsample的问题,而是您代码中的其他地方的问题。randsample做得对。例如:

x = (1:10)';nSamples = 10;for iter = 1:100;    data(:,iter) =  randsample(x,nSamples ,true); end; hist(data(:)) %这大致是均匀分布的

randsample抽样相当随机…

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注