快捷搜索: 王者荣耀 脱发

matlab生成多组多维高斯分布数据

matlab生成多组多维高斯分布数据

之所以写这么一个函数,是因为在练习用matlab实现聚类分析,用matlab生成的高斯分布数据可以作为很好的数据。当然,直接load进鸢尾花数据集也可以拿来练手,到后边再对鸢尾花数据集进行分析。

代码如下:

function data = generate_data_GMM(dim, model_class, m, s, num)
    %   生成多组多维高斯分布数据
    %   dim为高斯分布的维数
    %   model_class为生成的数据组数
    %   m为高斯分布的期望值,大小为model_class*dim
    %   s为高斯分布的协方差阵,大小为dim*dim*model_class
    %   num为各组高斯分布的数据量,其大小为model_class*1
    %   返回值data为生成的数据,其大小为num*(dim+1)
    %   前dim列为高斯分布数据,第(dim+1)列为组的类别编号
    %   该函数用于生成多组高斯分布数据,可为聚类算法提供数据
    data = [];
    for i = 1 : model_class
        data1 = ones(num(i), dim + 1);
        data1(:, (1 : dim)) = mvnrnd(m(i, :), s(:, :, i), num(i));
        for j = 1 : num(i)
            data1(j, dim + 1) = i;
        end
        data = [data; data1];
    end
end

主函数调用:

model_class = 2;
dim = 3;
% 期望值
m = [0, 0, 0;
    2, 2, 2];
% 协方差阵
s(:, :, 1) = [0.2, 0, 0;
              0, 0.2, 0;
              0, 0, 0.2];
s(:, :, 2) = [0.5, 0, 0;
              0, 0.5, 0;
              0, 0, 0.5];
num = [10000, 5000];
data = generate_data_GMM(dim, model_class, m, s, num);

% 提出每组数据
data1 = data((data(:,4) == 1), (1:3));
data2 = data((data(:,4) == 2), (1:3));

% 绘图分析(以第二组数据为例)
figure(1)
plot(data2(:, 1), data2(:, 2), .k);
axis equal;
figure(2)
plot(data2(:, 2), data2(:, 3), .k);
axis equal;
figure(3)
plot(data2(:, 1), data2(:, 3), .k);
axis equal;
figure(4)
histogram2(data2(:, 1), data2(:, 2), 30, FaceColor,flat)

绘图:

经验分享 程序员 微信小程序 职场和发展