簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM