将随机抽样从二元法线转换为Matlab中的单位平方

时间:2017-03-15 19:47:37

标签: matlab normalization normal-distribution

我在Matlab中有nx2矩阵r报告n来自双变量正态分布

n=1000;
m1=0.3;
m2=-m1;
v1=0.2;
n=10000;
v2=2;
rho=0.5;

mu = [m1, m2];
sigma = [v1,rho*sqrt(v1)*sqrt(v2);rho*sqrt(v1)*sqrt(v2),v2];
r = mvnrnd(mu,sigma,n);

我想将这些绘制标准化为单位平方[0,1]^2

第一个选项

rmax1=max(r(:,1));
rmin1=min(r(:,1));
rmax2=max(r(:,2));
rmin2=min(r(:,2));
rnew=zeros(n,2);
for i=1:n
    rnew(i,1)=(r(i,1)-rmin1)/(rmax1-rmin1);
    rnew(i,2)=(r(i,2)-rmin2)/(rmax2-rmin2); 
end

第二个选项

由于采样流程的原因,

rmin1rmax1rmin2rmax2可能会变化很大。另一种方法是应用68-95-99.7规则(here),我正在寻求一些关于如何将其推广为双变量法线的帮助(特别是下面的步骤1 )。这是我的想法

%Step 1: transform the draws in r into draws from a bivariate normal 
%with variance-covariance matrix equal to the 2x2 identity matrix 
%and mean equal to mu
%How?
%Let t be the transformed vector

%Step 2: apply the 68–95–99.7 rule to each column of t
tmax1=mu(1)+3*1;
tmin1=mu(1)-3*1;
tmax2=mu(2)+3*1;
tmin2=mu(2)-3*1;
tnew=zeros(n,2);
for i=1:n
    tnew(i,1)=(t(i,1)-tmin1)/(tmax1-tmin1);
    tnew(i,2)=(t(i,1)-tmin2)/(tmax2-tmin2);
 end
%Step 3: discard potential values (very few) outside [0,1]

1 个答案:

答案 0 :(得分:1)

在您的情况下,随机向量的x和y坐标是相关的,因此它不仅仅是x和y中的变换。首先需要旋转样本,使x和y变得不相关(协方差矩阵将是对角线。你不需要它就是身份,因为你以后会规范化)。然后,您可以将您称为“第二选项”的转换应用于新的x和y。不久,您需要对协方差矩阵进行对角化。

作为旁注,您的代码添加/减去3次1,而不是标准偏差的3倍。此外,您可以使用(例如)Matlab的bsxfun来避免for循环,该t = bsxfun(@minus,r,mean(r,1)); % center the data [v, d] = eig(sigma); % find the directions for projection t = t * v; % the projected data is uncorrelated sigma_new = sqrt(diag(d)); % that's the std in the new coordinates % now transform each coordinate independently tmax1 = 3*sigma_new(1); tmin1 = -3*sigma_new(1); tmax2 = 3*sigma_new(2); tmin2 = -3*sigma_new(2); tnew = bsxfun(@minus, t, [tmin1, tmin2]); tnew = bsxfun(@rdivide, tnew, [tmax1-tmin1, tmax2-tmin2]); 在矩阵和向量之间应用操作:

[0,1]

你仍然需要丢弃<h:panelGrid columns="2" id="matchGrid" cellpadding="5"> <h:outputLabel for="pwd1" value="Password 1: *" /> <p:password id="pwd1" value="#{passwordView.password5}" match="pwd2" label="Password 1" required="true" /> <h:outputLabel for="pwd2" value="Password 2: *" /> <p:password id="pwd2" value="#{passwordView.password5}" label="Password 2" required="true" /> </h:panelGrid> 之外的一些样本,正如你所写的那样。