![](/img/trans.png)
[英]Randomly generating numbers within a fixed non-Gaussian distribution in matlab
[英]Extract non repeated numbers from a list based on gaussian distribution in matlab
我有一組數字。 讓我們說
數字 = [1, 2, 3, 4, 5, 6, 7, 8,9,10]
由此,我想根據高斯分布隨機選擇六個數字。 這意味着選擇 5 和 6 的概率高於選擇 1 和 10 的概率。除此之外,我想確保我選擇的所有六個數字都必須是唯一的。 例如
1、4、5、7、8、10 是可接受的 output。
我想在 matlab 中執行此操作,我是 matlab 中的新手,我希望有人可以幫助我。
一種可能的解決方案是生成足夠大(例如 100)的樣本,並使用帶有'stable'
選項的unique
性來提取前 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);
您問題的實質是:如何進行加權隨機排列,即不放回樣本? 在我看來,困難的部分只是“無替換”部分。
通過下面的方法,我使用normpdf()
function 將nums
值轉換為預期概率,然后通過簡單的算術轉換為頻率/計數。 我增加了counts
數值與概率的相似度,比例因子為 100。注意:如果目標是使用替換重采樣,我們可以簡單地使用這些概率代替randsample()
function 中的weight
參數。
為了獲得無替換采樣,然后我使用repelem()
function 擴展了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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.