在Matlab中基于高斯分布的不重号抽取

txu3uszq  于 2022-12-13  发布在  Matlab
关注(0)|答案(2)|浏览(154)

我有一个数字数组
数值= [1、2、3、4、5、6、7、8、9、10]
从这里,我想根据高斯分布随机挑选6个数字。这意味着挑选5和6的概率高于挑选1和10的概率。除此之外,我想确保我挑选的所有6个数字必须是唯一的。例如
1、4、5、7、8、10是可接受的输出。
我想在matlab中做这个,我在matlab中是一个完全的新手,我希望如果有人能帮助我做这个。

gopyfrb3

gopyfrb31#

一种可能的解决方案是生成足够大(例如100)数量的样本,并使用unique'stable'选项来提取前6个非重复样本:

data = 1:10;
mn = min(data)
mx = max(data);
m = mean(data);
s = std(data);

random_data = m + randn(1, 100) * s;
random_data = round(random_data(random_data > mn-0.5 & random_data < mx+0.5));
u = unique(random_data, 'stable');
result = u(1:6);
zi8p0yeb

zi8p0yeb2#

你问题的实质是:我如何进行加权随机排列,即无替换样本?2在我看来,困难的部分只是“无替换”部分。
在下面的方法中,我使用normpdf()函数将nums值转换为期望概率,然后通过简单的算术运算将其转换为频率/计数。我使用比例因子100将counts值的相似度增加到概率。* 注:如果目标是重新采样并替换,我们可以简单地使用这些概率来代替randsample()函数中的weight参数。
为了得到而不替换采样,我用repelem()函数扩展了nums向量,得到了一个表示nums中每个值的不同概率的数组,然后我从数组中随机采样,每次迭代时删除唯一的采样值,直到满足采样大小要求。
我希望这对你有帮助!

% create data array
nums = 1:10;

% create normal probability density from nums
probs = normpdf(nums,mean(nums),std(nums));

% convert probability in to frequency/counts
counts = ceil(probs./min(probs).*100);
% expand nums by counts
numsExpanded = repelem(nums,counts);

% shuffle for extra-randomness
numsExpanded(randperm(sum(counts))) = numsExpanded;

% initialize sampling parameters
nSamples = 6;
sampleValues = [];

while numel(sampleValues) < nSamples
  sampleValues(end+1) = randsample(numsExpanded,1);
  % remove sampled value to prevent replacement
  numsExpanded(numsExpanded == sampleValues(end)) = [];
end

disp(sampleValues);

相关问题