matlab 随机分组,谢谢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab 随机分组,谢谢相关的知识,希望对你有一定的参考价值。

有C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 数据,我想将这10个数分为4个组,用matlab如何编程呢?最好每组个数不要偏差太多,

% 用一条线将 C1 到 C10 串起来,两头再链接成环形,随意割 4 刀就分成 4 组了。
clear all;
n = 10; m = 4; % n 个元素分成 m 组(n>=m)
a = randperm(n);
r = sort(a(1:m));
r = [r r(1)+n];
R1,m = [];
for k = 1:size(r,2)-1
for p = r(k):r(k+1)-1
t = p+1;
if t>n
t=t-n;
end;
Rk = [Rk t];
end;
end;
celldisp(R)追问

我想进行4轮分组,4轮分组得到的数据都不一样,怎么弄呢?求指导。

追答

function R = fenzu(n,m,c)
Rc,m = [];
for k = 1:c
R(k,:) = ge(n,m);
end;

function mr = ge(n,m)
a = randperm(n);
r = sort(a(1:m));
r = [r r(1)+n];
mr1,m = [];
for k = 1:size(r,2)-1
p = r(k):r(k+1)-1;
p = p+1;
p(p>n) = p(p>n)-n;
mrk = [mrk p];
end;

% 调用: 用10个元素分为4组,一次得到4组结果
R = fenzu(10,4,4);
R1,: % 第一组结果
R2,: % 第二组结果....

参考技术A 有一个现成的函数crossvalind,第一个参数取'Kfold'。

MATLAB | 如何绘制高端大气的分组矩阵图

MATLAB 绘制分组矩阵图

效果展示:



工具函数放在最后 ! ! ! !

工具函数放在最后 ! ! ! !

工具函数放在最后 ! ! ! !

基本使用

例如随机生成一组分组数据,在最后两行调用pairplot函数:

% 随机生成数据
pntSet1=mvnrnd([0,20,0,10],eye(4),50);
pntSet2=mvnrnd([10,5,15,0],eye(4).*.5,50);
pntSet3=mvnrnd([10,15,0,0],eye(4).*[1,1,2,1],50);
% 分组
pntSet=[pntSet1;pntSet2;pntSet3];
group=[ones(50,1)*1;ones(50,1)*2;ones(50,1)*3];
% 绘图
pp=pairplot(pntSet,group);
pp=pp.draw();

为了绘图更加好看,后面使用fisher.mat中的数据绘图,该数据第一列即为分组情况:(该数据集已放入压缩包,请回复文末关键词获取)

% 导入数据
load Fisher.mat
group=Fisher(:,1);
pntSet=Fisher(:,2:end);
% 绘图
pp=pairplot(pntSet,group);
pp=pp.draw(); 

属性设置方式

各个属性在构造时候使用以及在后期设置属性效果相同,即以下两种设置方式效果完全一致:

设置对角线图像格式(构造时设置)

pp=pairplot(pntSet,group,'EType','area');
pp=pp.draw();

设置对角线图像格式(属性设置)

pp=pairplot(pntSet,group);
pp.EType='area';
pp=pp.draw();

设置颜色

pp=pairplot(pntSet,group);
pp.colorList=[119,69,133;56,108,155;33,160,122]./255;
pp=pp.draw();

主要属性

  • UType、LType 上三角绘图格式、下三角绘图格式,支持格式有:‘plot’(默认) \\ ‘scatter’

  • EType 对角线绘图格式,支持格式有:‘hist’(默认) \\ ‘line’ \\ ‘area’ \\ ‘histcdf’ \\ ‘linecdf’

  • Label 标签名称,字符串元胞数组格式

  • colorList 颜色列表,Kx3大小RGB数值矩阵,数值0~1范围

主要方法

  • setFewTick() 减少刻度,即仅保留左下角坐标区的刻度
  • tightAxes() 减少子图空隙
  • setLabelSize(fontSize) 设置标签大小
  • setLineWidth(lineWidth) 设置轴粗细
  • setFontName(fontName) 设置字体
  • setBox(state) 设置框状态(on\\off)
  • setGrid(state) 设置网格状态(on\\off)

举个实例:

load Fisher.mat
group=Fisher(:,1);
pntSet=Fisher(:,2:end);

fig=gcf;
fig.Position=[100,100,850,600];

pp=pairplot(pntSet,group,'UType','scatter');
pp.Label='PW', 'PL', 'SW', 'SL';% 设置标签
pp.verMatlab=2020;% 设置为老版本axes格式
pp=pp.draw();     % 绘图
 
pp.setFewTick(); % 减少刻度标签数量
pp.setBox('on'); % 开启框
pp.setGrid('on');% 开启网格
pp.setFontName('Cambria');% 更改字体,Cambria只支持英文
pp.setLabelSize(14);      % 更改标签文字大小
pp.tightAxes();           % 减少子图空隙

与坐标区域修饰器联动

绘制出的对象可做很多更细致的修饰,各个坐标区域以obj.axMati,j的形式存储,而各个图形对象以obj.gpMati,j.gobjk的形式存储。

我们使用这篇推送用到的修饰器:MATLAB | 一行代码让你的绘图背景变得逼格满满

需要注意的是,为了适应版本,对于R2021a之前的版本,本工具使用subplot创建的坐标区域父类为Figure,而对于R2021a及之后的版本,本工具使用nexttile创建的坐标区域并不直接以Figure作为父类,而是有TiledChartLayout这个中间父类,而修饰器并不会的ui中间父类进行修饰,因而如果版本比较新,则需要设置该工具的隐藏属性:verMatlab属性以下给出实例:

load Fisher.mat
group=Fisher(:,1);
pntSet=Fisher(:,2:end);

pp=pairplot(pntSet,group);
pp.Label='PW', 'PL', 'SW', 'SL';% 设置标签
pp.verMatlab=2020;% 设置为老版本axes格式
pp=pp.draw();     % 绘图
 
pp.setFewTick(); % 减少刻度标签数量
pp.setBox('on'); % 开启框
pp.setGrid('on');% 开启网格
pp.setFontName('Cambria');% 更改字体,Cambria只支持英文
pp.setLabelSize(14);      % 更改标签文字大小
% pp.tightAxes();           % 减少子图空隙

% 循环调用prettyAxes修饰
for i=1:pp.N
for j=1:pp.N
ax=pp.axMati,j;
prettyAxes(ax).dark2()
end
end

另外,由于特殊的函数绘制方式,目前只支持’gbase’ \\ ‘gbase2’ \\ ‘ggray’ \\ ‘ggray2’ \\ ‘dark’ \\ ‘dark2’ 格式的风格修饰:



工具完整类

classdef pairplot
% @author : slandarer
% 公众号  : slandarer随笔
% 知乎    : hikari
%
% 使用实例:
% ==========================================================
% 实例1% ----------------------------------------------------------
% % 随机生成数据
% pntSet1=mvnrnd([0,20,0,10],eye(4),50);
% pntSet2=mvnrnd([10,5,15,0],eye(4).*.5,50);
% pntSet3=mvnrnd([10,15,0,0],eye(4).*[1,1,2,1],50);
% % 分组
% pntSet=[pntSet1;pntSet2;pntSet3];
% group=[ones(50,1)*1;ones(50,1)*2;ones(50,1)*3];
% % 绘图
% pp=pairplot(pntSet,group);
% pp=pp.draw();     % 绘图
% ==========================================================
% 实例2% ----------------------------------------------------------
% % 随机生成数据
% pntSet1=mvnrnd([0,20,0,10],eye(4),50);
% pntSet2=mvnrnd([10,5,15,0],eye(4).*.5,50);
% pntSet3=mvnrnd([10,15,0,0],eye(4).*[1,1,2,1],50);
% % 分组
% pntSet=[pntSet1;pntSet2;pntSet3];
% group=[ones(50,1)*1;ones(50,1)*2;ones(50,1)*3];
% % 绘图
% pp=pairplot(pntSet,group);
% pp.Label='PW', 'PL', 'SW', 'SL';% 设置标签
% pp.verMatlab=2020;% 设置为老版本axes格式
% pp=pp.draw();     % 绘图
%  
% pp.setFewTick(); % 减少刻度标签数量
% pp.setBox('on'); % 开启框
% pp.setGrid('on');% 开启网格
% pp.setFontName('Cambria');% 更改字体,Cambria只支持英文
% pp.setLabelSize(14);      % 更改标签文字大小
% pp.tightAxes();           % 减少子图空隙
% ==========================================================
% 实例3% ----------------------------------------------------------
% % 导入数据
% load Fisher.mat
% group=Fisher(:,1);
% pntSet=Fisher(:,2:end);
% % 绘图
% pp=pairplot(pntSet,group);
% pp=pp.draw();     % 绘图

    properties
        % 其他输入属性名称列表
        arginList='Label','colorList','UType','LType','EType'
        % -----------------------------------------------------------------
        pntSet   % MxN矩阵           | 数据集:m为点数,n为维数
        group    % Mx1矩阵或元胞数组 | 分类情况
        Label=;      % 1xN元胞数组 | 各维度名称
        colorList=[];      % Kx3矩阵 | 各类颜色
        UType='plot';      % 字符串  | 矩阵图上三角绘图格式'plot'\\'scatter'
        LType='plot';      % 字符串  | 矩阵图下三角绘图格式'plot'\\'scatter'
        EType='hist'       % 字符串  | 矩阵图对角线绘图格式'hist'\\'line'\\'area'
                                                        % \\'histcdf'\\'linecdf'
        % -----------------------------------------------------------------
        axMat     % NxN坐标区域矩阵  | 若版本为R2021a及之后版本
                                   % | 使用tiledlayout函数创建坐标区域
                                   % | 否则使用subplot函数创建坐标区域
        gpMat     % (NxN).(Kx1)图形对象结构体
        % -----------------------------------------------------------------
        verMatlab % MATLAB 版本: R2021a显示为2021,R2021b显示为2021.5
        M,N,K     % 点数、维数、类数
        groupName % groupName=unique(group)
        tdl       % tiledlayout
    end

    methods
        % 输入点集、分类情况及参数列表
        function obj=pairplot(pntSet,group,varargin)
            % 存储点集、分类情况
            obj.pntSet=pntSet;
            if nargin<2
                obj.group=ones(size(obj.pntSet,1),1);
            else
                obj.group=group;
            end

            % 获取版本信息
            tver=version('-release');
            obj.verMatlab=str2double(tver(1:4))+(abs(tver(5))-abs('a'))/2;

            % 获取其他信息
            for i=1:(length(varargin)-1)
                tid=ismember(obj.arginList,varargini);
                if any(tid)
                obj.(obj.arginListtid)=varargini+1;
                end
            end

            % 获取M,N,K数据
            obj.M=size(pntSet,1);
            obj.N=size(pntSet,2);
            if ~iscell(group)
                obj.group=num2cell(num2str(group));
            end
            obj.groupName=unique(obj.group);
            obj.K=length(obj.groupName);

            % Label初始化
            if isempty(obj.Label)
                obj以上是关于matlab 随机分组,谢谢的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB | 如何绘制高端大气的分组矩阵图

请教matlab中分组排列问题

Java 随机分组

临床试验随机化分组及其SAS实现-分层随机化

hive分组取随机数

随机分组的方法都有哪些?