1. 程式人生 > >如何生成指定均值和協方差矩陣的二維高斯分佈資料

如何生成指定均值和協方差矩陣的二維高斯分佈資料

廢話不多說,先貼程式碼。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就生成了我們想要的均值資料。解釋夠詳細了吧,不過,可以進行喬木斯分解必須滿足兩個條件,一個是矩陣中的原始共軛對稱,一個是矩陣是正定矩陣,半正定也可以,不過分解就不是唯一的了