我有一个数字数组数值= [1、2、3、4、5、6、7、8、9、10]从这里,我想根据高斯分布随机挑选6个数字。这意味着挑选5和6的概率高于挑选1和10的概率。除此之外,我想确保我挑选的所有6个数字必须是唯一的。例如1、4、5、7、8、10是可接受的输出。我想在matlab中做这个,我在matlab中是一个完全的新手,我希望如果有人能帮助我做这个。
gopyfrb31#
一种可能的解决方案是生成足够大(例如100)数量的样本,并使用unique和'stable'选项来提取前6个非重复样本:
unique
'stable'
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);
zi8p0yeb2#
你问题的实质是:我如何进行加权随机排列,即无替换样本?2在我看来,困难的部分只是“无替换”部分。在下面的方法中,我使用normpdf()函数将nums值转换为期望概率,然后通过简单的算术运算将其转换为频率/计数。我使用比例因子100将counts值的相似度增加到概率。* 注:如果目标是重新采样并替换,我们可以简单地使用这些概率来代替randsample()函数中的weight参数。为了得到而不替换采样,我用repelem()函数扩展了nums向量,得到了一个表示nums中每个值的不同概率的数组,然后我从数组中随机采样,每次迭代时删除唯一的采样值,直到满足采样大小要求。我希望这对你有帮助!
normpdf()
nums
counts
randsample()
weight
repelem()
% 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);
2条答案
按热度按时间gopyfrb31#
一种可能的解决方案是生成足够大(例如100)数量的样本,并使用
unique
和'stable'
选项来提取前6个非重复样本:zi8p0yeb2#
你问题的实质是:我如何进行加权随机排列,即无替换样本?2在我看来,困难的部分只是“无替换”部分。
在下面的方法中,我使用
normpdf()
函数将nums
值转换为期望概率,然后通过简单的算术运算将其转换为频率/计数。我使用比例因子100将counts
值的相似度增加到概率。* 注:如果目标是重新采样并替换,我们可以简单地使用这些概率来代替randsample()
函数中的weight
参数。为了得到而不替换采样,我用
repelem()
函数扩展了nums
向量,得到了一个表示nums
中每个值的不同概率的数组,然后我从数组中随机采样,每次迭代时删除唯一的采样值,直到满足采样大小要求。我希望这对你有帮助!