如何生成指定均值和协方差矩阵的二维高斯分布数据

废话不多说,先贴代码。function  y= main_generate_data()clc
clear 
close all
%%%%%%%%%%%%%%%%%%%%%%%%%生成实验数据集

rand('state',0)
sigma_matrix1=eye(2);
sigma_matrix2=50*eye(2);

u1=[0,0];
u2=[30,30];
m1=100;
m2=300;%样本数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%sm1数据集
Y1=multivrandn(u1,m1,sigma_matrix1);
Y2=multivrandn(u2,m2,sigma_matrix2);

scatter(Y1(:,1),Y1(:,2),'bo')
hold on
scatter(Y2(:,1),Y2(:,2),'r*')
title('SM1数据集')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%sm2数据集
u11=[0,0];
u22=[5,5];
u33=[10,10];
u44=[15,15];
m=600;
sigma_matrix3=2*eye(2);
Y11=multivrandn(u11,m,sigma_matrix3);
Y22=multivrandn(u22,m,sigma_matrix3);
Y33=multivrandn(u33,m,sigma_matrix3);
Y44=multivrandn(u44,m,sigma_matrix3);
figure(2)
scatter(Y11(:,1),Y11(:,2),'bo')
hold on
scatter(Y22(:,1),Y22(:,2),'r*')
scatter(Y33(:,1),Y33(:,2),'go')
scatter(Y44(:,1),Y44(:,2),'c*')
title('SM2数据集')
end
function Y = multivrandn(u,m,sigma_matrix)
  %%生成指定均值和协方差矩阵的高斯数据
n=length(u);
c = chol(sigma_matrix);
X=randn(m,n);
Y=X*c+ones(m,1)*u;
end

解释一下,主函数主要是设定好已知的样本数目和均值和协方差矩阵。然后调用multivrandn就可以了,详细解释一下nestfunction,nestfunction里面有chol这个函数,这个函数就是乔木斯分解,数值分析里有讲过。它的作用相当于实数中求平方根,在矩阵中分解就是分解为一个下三角矩阵和它共轭装置的乘积。下三角矩阵就是C,这样就好理解了,我们的X生成的是方差为1,均值为0的高斯分布,而X*C就生成了均值为0,协方差为c的矩阵,加上u就生成了我们想要的均值数据。解释够详细了吧,不过,可以进行乔木斯分解必须满足两个条件,一个是矩阵中的原始共轭对称,一个是矩阵是正定矩阵,半正定也可以,不过分解就不是唯一的了

你可能感兴趣的:(机器学习)