给定按以下方式计算的概率密度函数和累积分布函数,我想生成遵循分布的 M 个伪随机数。为了在一维中做到这一点,我使用了反演方法,但现在我在二维中应用它时遇到了困难。有谁知道该怎么做?或者有其他方法可以达到相同的目标吗?
a = 4; % Limiti per x e y
N = 50; % Numero di valori equidistanti
M = 100000; % Numero di punti da generare
nBin = 30; % Numero di bin per l'istogramma
% Generazione dei punti e calcolo dell'errore
x = linspace(-a, a, N);
y = linspace(-a, a, N);
[X, Y] = meshgrid(x, y);
% Costruzione del campo di errore
sigma = 1;
mu1 = [-a/2, -a/2];
mu2 = [a/2, a/2];
err1 = exp(-((X - mu1(1)).^2 + (Y - mu1(2)).^2) / (2*sigma^2));
err2 = exp(-((X - mu2(1)).^2 + (Y - mu2(2)).^2) / (2*sigma^2));
err = 14 * err1 + 7 * err2;
% Normalizzazione per ottenere una densità di probabilità
densita_di_prob = err / sum(err(:));
% Calcolo della funzione cumulativa congiunta
funzione_cumulata = cumsum(cumsum(densita_di_prob, 1), 2);
funzione_cumulata = funzione_cumulata / funzione_cumulata(end);
您需要将反演采样技术应用于二维。
通常,您必须通过取两个维度的总和来计算累积分布函数(您已经通过
funzione_cumulata
完成了)。接下来,您将需要为 x
和 y
维度生成两组独立的均匀随机数,并将其映射到 CDF 中。
我对 matlab 脚本的尝试是:
% Step 1: Generate uniform random numbers for sampling
u1 = rand(1, M); % M random samples for the x-dimension
u2 = rand(1, M); % M random samples for the y-dimension
% Step 2: Find corresponding x, y points using inverse transform sampling
x_generated = zeros(1, M);
y_generated = zeros(1, M);
for i = 1:M
% Find the x, y indices in the CDF that correspond to u1(i) and u2(i)
[~, x_idx] = min(abs(funzione_cumulata(:, end) - u1(i))); % Find x index
[~, y_idx] = min(abs(funzione_cumulata(x_idx, :) - u2(i))); % Find y index
% Convert indices to x, y coordinates
x_generated(i) = x(x_idx);
y_generated(i) = y(y_idx);
end
% Plot the generated points
scatter(x_generated, y_generated, '.')
title('Generated Points Following the Desired Distribution')
xlabel('x')
ylabel('y')
对于 URN
u1
和 u2
是 [0, 1]
中的均匀随机数,对应于要使用 CDF 映射的随机变量。对于每个生成的 URN,您需要在 funzione_cumulata
中找到相应的索引。我通过 min(abs(...))
方法找到最接近随机均匀数的 CDF 值。
您也可以尝试拒绝抽样,但我不太熟悉如何做到这一点。我相信这篇堆栈文章将对此有所帮助......